Presentation is loading. Please wait.

Presentation is loading. Please wait.

درخت دودويي و مرتب سازي با آن Binary Trees & Heap sort

Similar presentations


Presentation on theme: "درخت دودويي و مرتب سازي با آن Binary Trees & Heap sort"— Presentation transcript:

1 درخت دودويي و مرتب سازي با آن Binary Trees & Heap sort
ساختمان داده ها والگوريتمها

2 درخت Tree درخت ساختمان داده اي مرکب از مجموعه اي از گرهها(Nodes) و مجموعه اي از لبه هاست(Edges) به شرطي که: هر گره يا ريشه درخت يا فرزند يک و تنها يک گره ديگر است. هر درخت تنها يک ريشه دارد، ريشه درخت فرزند هيچ گره ديگر نيست. هر گره مي تواند چندين فرزند داشته باشد ولي تنها يک پدر دارد. سطح گره Node Level : سطح گره بيانگر سطح رابطه فرزندي يک گره با ريشه درخت است  گره از نسل چندم است ؟ سطح ريشه، صفر است و سطح هر گره ديگر، يکي بيشتر از سطح پدر اوست. عمق درخت: عمق درخت برابر با ماکزيمم سطح گرهها است. گره برگ: گرهي است که هيچ فرزندي نداشته باشد. درخت ها را با تفصيل بيشتر، در آينده مطالعه خواهيم کرد

3 نمايش درخت معمولا، براي نمايش درخت، ريشه آن را در بالا و فرزندان آن را کمي پايين تر و در زير آن رسم مي کنند. رابطه پدر فرزندي را با پيکاني که نوک آن به سمت فرزند است، نمايش مي دهند.

4 درخت دودوي Binary Tree درخت دودويي، درختي است که هر گره آن حداکثر دو فرزند دارد اين نوع درخت کاربردهاي زيادي مانند مرتب سازي، جستجو، ارزيابي عبارات رياضي و ... دارد پياده سازي آن نيز آسان است

5 درخت دودويي کامل درخت دودوي کامل، درختي است که:
همه برگهاي آن در يک سطح قرار دارند هر گره غير برگ دقيقا دو فرزند دارد

6 درخت دودويي تقريبا کامل
درخت دودوي تقريبا کامل، درختي با عمق h است که تا سطح h- 1 کامل باشد.

7 ويژگيهاي درخت دودويي درخت دودويي در سطح k، حداکثر 2k گره دارد.
Level 0:1 Node Level 1:2 Nodes Level 2:4 Nodes Level 3:3 Nodes (Incomplete Level) سطح گره k ام درخت برابر است با: حداکثر تعداد گرههاي يک درخت دودويي برابر است با:

8 ويژگيهاي درخت دودويي يادآوري: درخت دودويي با عمق h تقريبا کامل است اگر، تا عمق h-1 کامل باشد Level 0:1 Node Level 1:2 Nodes Level 2:4 Nodes Level 3:3 Nodes (Incomplete Level) اگر N تعداد گرههاي يک درخت دودويي تقريبا کامل باشد، گرههاي به بعد، برگ هستند ( فرزندي ندارند!)

9 Binary Tree ADT class BIN-TREE{ int numNodes ; // Number of tree nodes
node treeNodes [1..numNodes] ; node getParent(node n) ; // get parent of a given node node getLeftChild(node n) ; //get left child of n node getRightChild(node n) ; //get right child of n int getKey(node n); // get value of sum node } // End of binary tree definition

10 پياده سازي درخت دودويي درخت دودوي T با آرايه A، بسادگي پياده سازي مي شود: ريشه درخت در A[0] قرار مي گيرد اگر گرهي در A[k] قرار داشته باشد،فرزند سمت چپ آن در A[2k +1] و فرزند سمت راست آن در A[2k + 2] قرار مي‌گيرد براي سادگي نمايش، از گره ويژه nil به جاي فرزنداني که وجود ندارند استفاده مي‌کنيم. 12 1 23 1 2 3 14 nil 7 5 3 4 6 12 1 23 3 14 nil 7

11 Max-Heap و Min Heap Max Heap درختي دودويي است که در آن ارزش هر گره بزرگتر يا مساوي ارزش فرزندان آن گره است. نتيجه فوري: ماکزيمم مقادير درخت در ريشه آن قرار دارد! Min Heap درختي دودويي است که در آن ارزش هر گره کوچکتر يا مساوي ارزش فرزندان آن گره است. در اينجا روي Max Heap متمرکز مي شويم. با کمي تغيير مي توان کليه مباحث مطرح شده را براي Min Heap هم استفاده کرد.

12 مثال Max Heap (a) (b)

13 مثال: ساخت Max Heap روش ساخت Max Heap

14 T(Max-Heapify(A,k)) = O(log n)
تابع زير يک آرايه و انديس خاصي از آن را مي گيرد و سپس درختچه اي را که ريشه آن گره kام آرايه است، به درخت Heap تبديل مي کند Max-Heapify(A , k) //Create a max heap at A[k] nl = left(k) //left child nr = right(k) //right child if nl <= heap-length(A) and A[nl] > A[k] then largest = nl else largest = k if nr <= heap-length(A) and A[nr] > A[largest] then largest = nr if largest <> k then swap(A[k] , A[largest]) Max-Heapify(A, largest) اگر تعداد گرههاي درخت n باشد، اين دستور حداکثر به تعداد ارتفاع درخت يعني، log n اجرا مي شود T(Max-Heapify(A,k)) = O(log n) اين الگوريتم، خاصيت max heap را تنها براي گره خاصي برقرار مي کند. براي ساخت درخت heap‌اين الگوريتم بايد روي همه گرههاي غير برگ (چرا ؟) اجرا شود.

15 آناليز دقيقتر ‍ Create Heap
max heap در هر گره هزينه اي از مرتبه O(h) دارد که در آن ، h ارتفاع درختچه شروع شده در گره مورد نظر است. الگوريتم بصورت bottom-up اجرا مي شود( چرا ؟) create-heap(A) for k= length(A) /2 downto 1 max-heapify(A , k) الگوريتم max-heapify کران بالايي برابر با log n دارد . پس مي توان گفت: create -heap کران بالايي برابر با n logn دارد. يعني T(create-heap(A[1..n]) = O(nlogn) اين نتيجه گيري درست است اما...

16 آناليز الگوريتم ساخت Heap
d =عمق درخت سطح گره i ام =hi عمق درختچه i ام =di

17 آناليز الگوريتم Create Heap

18 مرتب سازي با استفاده از Max Heap
heap-sort(A) heap-size(A) = length(A) create-heap(A) for k=length(A) downto 2 heap-size(A) = heap-size(A) -1 swap(A[1] , A[k]) max-heapify(A ,1)

19 create-max-heap(A) مثال Heap Sort 16 14 10 8 7 9 3 2 4 1 16 14 10 8 7
N= Heap Size = 10

20 Swap(A[1] , A[10]) N = N - 1 مثال Heap Sort 1 14 10 8 7 9 3 16 2 4 1
N=Heap Size = 9

21 maxheapify(A,1) مثال Heap Sort 14 8 10 4 7 9 3 2 1 14 8 10 4 7 9 3 2 1
16 N=Heap Size = 9

22 swap(A[1], A[9]) N = N - 1 مثال Heap Sort 1 8 10 4 7 9 3 14 2 1 8 10 4
16 N=Heap Size =8

23 maxheapify(A,1) مثال Heap Sort 10 8 9 4 7 1 3 2 10 8 9 4 7 1 3 2 14 16
N=Heap Size =8

24 swap(A[1], A[8]) N = N - 1 مثال Heap Sort 2 8 9 4 7 1 3 10 2 8 9 4 7 1
14 16 N=Heap Size =7

25 maxheapify(A,1) مثال Heap Sort 9 8 3 4 7 1 2 9 8 3 4 7 1 2 10 14 16
N=Heap Size =7

26 swap(A[1], A[7]) N = N - 1 مثال Heap Sort 2 8 3 9 4 7 1 2 8 3 4 7 1 9
10 14 16 N=Heap Size =6

27 maxheapify(A,1) مثال Heap Sort 8 7 3 4 2 1 8 7 3 4 2 1 9 10 14 16
N=Heap Size =6

28 swap(A[1], A[6]) N = N - 1 مثال Heap Sort 1 7 3 8 4 2 1 7 3 4 2 8 9 10
14 16 N=Heap Size =5

29 maxheapify(A,1) مثال Heap Sort 7 4 3 1 2 7 4 3 1 2 8 9 10 14 16
N=Heap Size =5

30 swap(A[1], A[5]) N = N - 1 مثال Heap Sort 2 4 3 7 1 2 4 3 1 7 8 9 10
14 16 N=Heap Size =4

31 maxheapify(A,1) مثال Heap Sort 4 2 3 1 4 2 3 1 7 8 9 10 14 16
N=Heap Size =4

32 swap(A[1], A[4]) N = N - 1 مثال Heap Sort 1 2 3 4 1 2 3 4 7 8 9 10 14
16 N=Heap Size =3

33 maxheapify(A,1) مثال Heap Sort 3 2 1 3 2 1 4 7 8 9 10 14 16
N=Heap Size =3

34 swap(A[1], A[3]) N = N - 1 مثال Heap Sort 1 3 2 1 2 3 4 7 8 9 10 14 16
N=Heap Size =2

35 maxheapify(A,1) مثال Heap Sort 2 1 2 1 3 4 7 8 9 10 14 16
N=Heap Size =2

36 swap(A[1], A[2]) N = N - 1 مثال Heap Sort 1 2 1 2 3 4 7 8 9 10 14 16
N=Heap Size =1

37 آناليز Heap sort HEAPSORT(A) 1 BUILD-MAX-HEAP(A)
2 for i ← length[A] downto 2 3 exchange A[1] ↔ A[i] 4 heap-size[A] ← heap-size[A] - 1 MAX-HEAPIFY(A, 1) O(n) (n-1) * O(log n) T(heapsort(A)) = O(n) + (n-1) O(log(n)) = O(n) + O(nlogn) = O(nlogn)

38 تمرين برنامه اي بنويسيد که عدد صحيح مثبت N را بگيرد و سپس آرايه اي تصادفي به طول N توليد کند. آنگاه اين آرايه را مرتب کرده و چاپ کند. خروجي برنامه شما بايد هم آرايه اصلي و هم آرايه مرتب را چاپ کند مسايل 6-1 تا 6-3 را حل کنيد


Download ppt "درخت دودويي و مرتب سازي با آن Binary Trees & Heap sort"

Similar presentations


Ads by Google