Download presentation
Presentation is loading. Please wait.
1
مرتب سازي مقايسه اي مرتب سازي خطي
ساختمان داده ها و الگوريتمها
2
مرتب سازي مقايسه اي تاكنون چندين الگوريتم مرتب سازي را بررسي كرده ايم. در همه اين الگوريتمها، اعضاي آرايه با هم مقايسه مي شوند. اين نوع الگوريتم ها را مقايسه اي مي گوييم. بهترين زمان اجراي الگوريتمهاي بررسي شده در بدترين حالت، n log n بوده است. Quicksort, Mergesort, Heapsort آيا مي توان الگوريتمي با زمان كمتر از n log n ارائه داد؟ آيا روش ديگري غير از انواع مختلف الگوريتم هاي مقايسه اي؛ براي مرتب سازي وجود دارد ؟
3
Decision Tree for Insertion Sort مساله مرتب سازي
<a1, a2, a3 > ترتيب ممكن: <a1, a2, a3> <a1, a3, a2> <a2, a1, a3> <a2, a3, a1> <a3, a1, a2> <a3, a2, a1> a1:a2 <= > a2:a3 a1:a3 <= > <= > a1:a3 a2:a3 <a1,a2,a3> <a2,a1,a3> <= <= > > <a1,a3,a2> <a3,a1,a2> <a2,a3,a1> <a3,a2,a1> Decision Tree for Insertion Sort
4
برگهاي درخت Leaf Nodes/
مساله مرتب سازي 3=h=ارتفاع درخت a1:a2 <= > a2:a3 a1:a3 <= > <= > برگهاي درخت Leaf Nodes/ a1:a3 a2:a3 <a1,a2,a3> <a2,a1,a3> <= <= > > <a1,a3,a2> <a3,a1,a2> <a2,a3,a1> <a3,a2,a1> ارتفاع درخت = بيشترين تعداد مقايسه ها و بدترين حالت الگوريتم
5
حداقل هزينه مرتب سازي درخت تصميم يك الگوريتم مرتب سازي بايد حداقل n!برگ داشته باشد تا تمام حالات ممكن ترتيب nعدد را در برگيرد. بدترين حالت يك الگوريتم ، ارتفاع درخت است. درخت دوديي به ارتفاع h حداكثر 2h برگ دارد. اين تعداد برگ بايد تمام ترتيبات مختلف را پوشش دهد. 2h >= n! h > log(n!) n! ≈ (n/e) n (قضيه استرلينگ) h > n log ( n/e)= nlogn –nloge h = O(nlogn) كمترين زمان اجراي الگوريتمهاي مقايسه اي n log n است. اين نتيجه نا اميد کننده است ؟
6
Counting Sort Counting-sort(A[1..n]) //A is an integer array
for i←1 to k // k = max(A[1..n]) do C[i] ←0 for j←1 to n do C[A[j]] ←C[A[j]] + 1 //C[i] = |{key = i}| for i←2 to k do C[i] ←C[i] + C[i–1] //C[i] = |{key ≤i}| for j←n downto 1 do B[C[A[j]]] ←A[j] C[A[j]] ←C[A[j]] –1
7
Counting Sort - Example
1 2 3 4 5 1 2 3 4 A C 1 2 3 4 5 B
8
Loop 1: Initialization A C for i=1 to k C[i]= 0 B 1 2 3 4 5 1 2 3 4 1
A C 1 2 3 4 5 for i=1 to k C[i]= 0 B
9
Loop 2: Counting … A C B for j←1 to n
3 4 5 1 2 3 4 A C 1 2 3 4 5 B for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}|
10
Loop 2: Counting … A C B for j←1 to n
3 4 5 1 2 3 4 A C 1 2 3 4 5 B for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}|
11
Loop 2: Counting … A C B for j←1 to n
3 4 5 1 2 3 4 A C 1 2 3 4 5 B for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}|
12
Loop 2: Counting … A C B for j←1 to n
3 4 5 1 2 3 4 A C 1 2 3 4 5 B for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}|
13
Loop 2: Counting … A C B for j←1 to n
3 4 5 1 2 3 4 A C 1 2 3 4 5 B for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}|
14
Loop 3: Cumulating… A C B C’ for j←2 to k
1 2 3 4 5 1 2 3 4 A C 1 2 3 4 5 1 2 3 4 B C’ for j←2 to k do C[j] ←C[j] + C[j -1]// C[k] = |{key <= k}|
15
Loop 3: Cumulating… A C B C’ for j←2 to k
1 2 3 4 5 1 2 3 4 A C 1 2 3 4 5 1 2 3 4 B C’ for j←2 to k do C[j] ←C[j] + C[j -1]// C[k] = |{key <= k}|
16
Loop 3: Cumulating… A C B C’ for j←2 to k
1 2 3 4 5 1 2 3 4 A C 1 2 3 4 5 1 2 3 4 5 B C’ for j←2 to k do C[j] ←C[j] + C[j -1]// C[k] = |{key <= k}|
17
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 5 B C’ for j←n downto 1 do B[C[A[j]]] ←A[j] //Place A[j] C[A[j]] ←C[A[j]] –1 // Decrement C[A[j]]
18
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ for j←n downto 1 do B[C[A[j]]] ←A[j] //Place A[j] C[A[j]] ←C[A[j]] –1 // Decrement C[A[j]]
19
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ for j←n downto 1 do B[C[A[j]]] ←A[j] //Place A[j] C[A[j]] ←C[A[j]] –1 // Decrement C[A[j]]
20
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ for j←n downto 1 do B[C[A[j]]] ←A[j] //Place A[j] C[A[j]] ←C[A[j]] –1 // Decrement C[A[j]]
21
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ for j←n downto 1 do B[C[A[j]]] ←A[j] //Place A[j] C[A[j]] ←C[A[j]] –1 // Decrement C[A[j]]
22
آناليز الگوريتم Loop 4:Θ(n) Loop1: Θ(k) Loop 2 :Θ(n) Loop 3: Θ(k)
for i=1 to k do C[i]= 0 : Loop 2 :Θ(n) for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}| Loop 3: Θ(k) for j←2 to k do C[j] ←C[j] + C[j -1]// C[k] = |{key <= k}| Loop 4:Θ(n) for j←n downto1 do B[C[A[j]]] ←A[j] C[A[j]] ←C[A[j]] –1 Tootal: Θ(k + n)
23
آناليز الگوريتم if k = Θ(n) T(Countingsort(n))= Θ(n)
آيا اين نتيجه تناقضي با حداقل بدست آمده در بخش اول دارد؟ توجه كنيد: در اين الگوريتم هيچ مقايسه اي صورت نمي گيرد! نتيجه بدست آمده در بخش اول براي الگوريتم هاي مقايسه اي بود
24
Stable Sorting مرتب سازي پايدار
1 2 3 4 5 الگوريتم Counting Sort در صورتي كه دو عضو آرايه كليد مساوي داشته باشند، ترتيب آنها را حفظ مي كند. اين نوع الگوريتم را مرتب سازي پايدار مي نامند A 1 2 3 4 5 B
25
Radix Sort مرتب سازي ريشه اي
Herman Hollerith در سال 1890 ، پيشنهاد كرد. اين الگوريتم، در محاسبات آماري سال 1890 آمريكا بصورت مكانيكي و الكتريكي پياده سازي و استفاده شد نتايج سرشماري دوره قبل 10 سال طول كشيده بود. با استفاده از اين ماشين، گزارشهاي آماري اوليه ظرف 6 هفته! منتشر شد اعداد را رقم به رقم و بصورت پايدار مرتب مي كند الگوريتم اوليه از پر ارزشترين رقم شروع مي كند الگوريتم بهبود يافته از پايين ترين ارزش شروع مي كند
26
Radix Sort Example 3 2 9 4 5 7 6 8 2 7 2 7 9 2 3 5 3 9 2 3 5 3 6 3 4 6 3 4 6 3 4 7 5 4 9 3 8 7 5 4 7 5 6 5 3 7 5 6 9 2 3 7 5 4 2 7 9 3 8 7 5 6 9 3 8
27
درستي Radix Sort اگر با استفاده از اين الگوريتم، دو عدد تا رقم t-1 مرتب شده باشند، با مرتب سازي آنها بر اساس رقم t : درصورتي كه رقم t دو عدد يكي باشد، خاصيت پايداري سبب حفظ ترتيب فعلي آنها مي شود. در صورتي كه اين دو رقم متفاوت باشند، ارزش بالاي رقم t ترتيب دو عدد را تعيين مي كند. 2 7 9 2 3 9 2 3 5 3 6 3 4 6 3 4 9 3 8 7 5 4 5 3 7 5 6 7 5 4 2 7 7 5 6 9 3 8
28
آناليز الگوريتم براي مرتب سازي n عدد دهدهي(Decimal Integer) كه ارقام آنها از 0 تا 9 متغير است، لازم است به تعداد ارقام اعداد (مثلا d) فرايند مرتب سازي تكرار شود. با استفاده از Counting Sort بعنوان الگوريتم مرتب سازي ارقام، بسادگي مي توان ديد كه فرايند مرتب سازي هزينه اي برابر Θ(d * (n +k) ) دارد كه در آن k تعداد انواع رقم است(براي اعداد دهدهي ، k=10) مي توان اين الگوريتم را طوري تغيير داد كه در هر فاز بيش از يك رقم را مورد استفاده قرار دهد
29
آناليز الگوريتم، ادامه
اعداد در كامپيوتر بصورت باينري ذخيره مي شوند و از آنجاكه عملگرهاي مقايسه اي بيتها در سخت افزار بصورت دستورات cpu پياده شده، هوشمندانه است از ارقام دوديي براي مرتب سازي استفاده شود هنگام استفاده از اعداد باينري، معمولا بيش از 1 بيت بعنوان يك رقم استفاده مي شود. اگر اعداد 32 بيتي را با رقم 4 بيتي مرتب كنيم، 8 بار لازم است فرايند مرتب سازي رو ي ارقام مختلف اجرا شود. Counting Sort 24 يا 16 عدد مختلف را مرتب مي كند
30
آناليز الگوريتم - ادامه
اگر n عدد مورد نظر براي مرتب سازي b بيتي باشند و از ارقام r بيتي استفاده كنيم، اين اعداد d=b/r رقم خواهند داشت. آرايه C مورد استفاده در Counting Sort بايد k=2r رقم مختلف را مرتب كند. بنابراين هزينه كل الگوريتم برابر است با: T(n,b) = Θ(d * (n +k) ) = Θ((b/r)(n+2r)) بهترين انتخاب r چيست ؟
31
آناليز الگوريتم - ادامه
T(n,b) = Θ(d * (n +k) ) = Θ((b/r)(n+2r)) با مشتق گيري و محاسبه مينيمم اين تابع r = log n بدست مي آيد. r= log n T(n,b) = Θ((b/logn)(n+2logn))= Θ(bn/logn) اگر اعداد مورد نظر براي مرتب سازي بين 0..nd -1 باشند: b =d logn , T(n,b) = Θ(dn)
32
بحث و بررسي براي حجم برزرگ آرايه ها، radixsort كارايي خوبي دارد
براي مرتب سازي 2000 عدد 32 بيتي، اين الگوريتم چهار بار تكرار مي شود اما، mergesort و quicksort حداقل 11 بار تكرار مي شوند(عمل تقسيم آرايه به آرايه هاي کوچکتر 11 بار صورت مي گيرد) Quicksort در هر بار تقسيم، ناحيه مراجعه به حافظه را كوچكتر مي سازد. اين ويژگي در پردازنده هاي جديد مجهز به حافظه Cache امتيازي محسوب مي شود. از اين نظر، Q.S. كه خوب طراحي شده باشد، معمولا هم ارز Radix Sort كارايي دارد
33
تكليف و تمرين در اينجا فرض كرديم آرايه هاي مورد نظر براي مرتب سازي، اعداد صحيح هستند؛ به نظر شما براي مرتب سازي اعداد اعشاري چگونه مي توان از اين الگوريتمها بهره گرفت؟ در كتاب، الگوريتم Bucket Sort بدين منظور معرفي شده است. اين الگوريتم را مطالعه كنيد و سعي كنيد راه حل ديگري هم براي اين مساله پيشنهاد كنيد. مسايل بخش 8 را حل كنيد
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.