1 / 33

درخت جستجوی دودویی

درخت جستجوی دودویی. درخت جستجوي دودويي: درخت دودويي صفر نود يا بيشتر اگر >0 نود: هر نود داراي يک کليد يکتا است. کليد تمام نودهاي زير درخت سمت چپ نود، ازخود نود کمتر است. کليد تمام نودهاي زير درخت سمت راست نود، ازخود نود بيشتر است.

bert
Télécharger la présentation

درخت جستجوی دودویی

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. درخت جستجوی دودویی • درخت جستجوي دودويي: • درخت دودويي • صفر نود يا بيشتر • اگر >0 نود: • هر نود داراي يک کليد يکتا است. • کليد تمام نودهاي زير درخت سمت چپ نود، ازخود نود کمتر است. • کليد تمام نودهاي زير درخت سمت راست نود، ازخود نود بيشتر است. • زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند.

  2. درخت جستجوی دودویی 60 30 70 5 40 2 80 65 • کليدهاي يکتا • نودهاي سمت چپ کمتر از ريشه • نودهاي سمت راست بيشتر از ريشه • زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند. • کليدهاي يکتا • نودهاي سمت چپ کمتر از ريشه • نودهاي سمت راست بيشتر از ريشه • زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند.

  3. درخت جستجوی دودویی 20 15 25 12 22 درخت جستجوي دودويي نيست. فرزند سمت راست 25 ازخودش کمتر است. 18 • کليدهاي يکتا • نودهاي سمت چپ کمتر از ريشه • نودهاي سمت راست بيشتر از ريشه • زير درختهاي سمت چپ و راست درخت جستجوي دودويي نيستند.

  4. درخت جستجوی دودویی • دقت کنيد که شرط کامل بودن در تعريف درخت جستجوي دودويي حضور ندارد. • لذا، پياده سازي لينک پيوندي بهتر است. • تعريف بازگشتي درخت جستجوي دودويي = الگوريتمهاي بازگشتي

  5. درخت جستجوی دودویی:جستجو • جستجو: • از خواص درخت جستجوي دودويي استفاده کنيد. • از ريشه شروع کن • اگر ريشه برابر صفر بود، پيغام بده که درخت خالي است. • در غير اين صورت: • x را با ريشه مقايسه کن. • اگر x با کليد ريشه برابر بود، نود را برگردان. • اگر x از کليد ريشه کمتر بود، زير درخت سمت چپ را بگرد. • در غير اين صورت زير درخت سمت راست را بگرد.

  6. درخت جستجوی دودویی: مثالی از جستجو 15 را پيدا کن. ريشه خالي است؟ نه 15 را با مقدار ريشه (30( مقايسه کن 15 < 30 لذا زير درخت سمت چپ را بگرد. 15 را با 5 مقايسه کن 15 > 5لذا زير درخت سمت راست را بگرد. 15 را با 15 مقايسه کن 15 == 15 نود جاري را بر گردان 30 5 40 2 15

  7. آنالیز درخت جستجوی دودویی • در ريشه يک مقايسه انجام مي دهيم • > Root يا < Root • با توجه به نتيجه: • به يکي از فرزندان مي رويم • يک مقايسه انجام مي دهيم. • حداکثر به اندازه ارتفاع درخت اين کار را انجام مي دهيم: • لذا، پيچيدگي زماني جستجو، وابسته به شکل درخت است. • خطی: O(n) • متوازن: O (log 2 n)

  8. درج در درخت جستجوی دودویی • قوانين - الحاق بايد شرايط زير را برآورده کند: • کليد يکتا • فرزند سمت راست < پدر • فرزند سمت چپ > پدر • نودهاي مياني نيز بايد شرايط فوق را برآورده کنند. • يکتا بودن را چگونه چک کنيم؟ • به همه نودها نگاه کنيم؟

  9. درج در درخت جستجوی دودویی • نيازي نيست که به تمام نودها نگاه کنيم • از اين حقيقت استفاده مي کنيم که قبل از الحاق نود جديد، درخت از نوع جستجوي دودويي است. • لذا کافيست دنبال نود جديد در درخت بگرديم. Add 30 15 5 40 Search for 15 15 ? 30, 15 < 30 => Left 15 ? 5, 15 > 5 => Right 15 ? 15, 15 == 15 => Not Unique 2 15

  10. درج در درخت جستجوی دودویی • جستجوي نود جديدنه تنها مساله يکتا بودن را حل مي کند، بلکه ما را به جاي درست نود جديد رهنمون مي سازد. 30 Add 15 5 40 2 Search for 15 15 ? 30, 15 < 30 => Left 15 ? 5, 15 > 5 => Right No right child, so not present 15 Add 15 as right child of 5

  11. آنالیز عمل درج • عمده کار تابع الحاق، پياده سازي عمل جستجو است. • وابسته به شکل درخت است. • خود عمل الحاق داراي هزينه ثابت است. • لذا، هزينه کل وابسته به پيچيدگي عمل جستجو است. • در بدترين حالت: O(n) • در حالت ميانگين: O(log2n)

  12. ارتفاع درخت جستجوی دودویی • در بدترين حالت ارتفاع درخت باينري برابر n است. • درخت خطی 40 مسائل درخت جستجوي دودويي از لحاظ پيچيدگي وابسته به ارتفاع درخت هستند که در بدترين حالت O(n) هست. اگر داده ها مرتب يا نیمه مرتب باشند، درخت خطی خواهد گرديد. 30 5 2

  13. ارتفاع درخت جستجوی دودویی Insert: 3, 4, 6, 5, 8 root 3 4 6 8 5

  14. Binary Search Trees: Height • اگر الحاقها به صورت تصادفي انجام گردند، ارتفاع درخت برابر O(log n) خواهد بود. • در حالت عمومي الحاقها تصادفي هستند، لذا اغلب ارتفاع برابر O(log n) خواهد شد. • راههاي وجود دارد که ارتفاعO(log n) را گارانتي نمود. بايد توابع الحاق و حذف را دستکاري نمود تا درخت متعادل شود.

  15. TreeSort: • نودهاي درخت جستجوي دودويي داراي نظم خاصي هستند. • تمام نودهاي سمت چپ از ريشه کوچکتر و تمام نودهاي سمت راست از آن بزرگتر هستند. • اين مطلب براي تمام نودها صادق است. • لذا، مي توان از پيمايش LVR براي توليد يک ليست مرتب استفاده کرد. 30 5 40 2 50 15 35 LVR Ordering: 2,5,15,30,35,40,50

  16. TreeSort: • آناليز TreeSort: • بايد يک درخت جستجوي دودويي با سايز n بسازيم. • به n الحاق نياز داريم. • بهترين حالت: درخت متعادل O(n * log 2 n) • بدترين حالت: درخت خطی O(n2) • سپس LVR را اجرا مي کنيم. • هميشهO(n) است. • پس پيچيدگي TreeSort برابر است با: • بهترين حالت: O(n * log 2 n) • بدترين حالت: O(n2)

  17. Binary Search Trees: Deletion • قوانين - حذف بايد شرايط زير را برآورده کند: • کليد يکتا • نيازي به چک کردن ندارد. چون قبل از عمل حذف کليدها يکتا هستند. • اما موارد زير بايد رعايت شوند: • فرزند سمت راست < پدر • فرزند سمت چپ > پدر • نودهاي مياني نيز بايد شرايط فوق را برآورده کنند.

  18. Binary Search Trees: Deletion 30 5 40 سه حالت: 1- حذف نود انتهايي (15) : نود انتهايي را حذف کن. اشاره گر پدر را برابر صفر قرار بده. 2 15 30 5 40 2

  19. Binary Search Trees: Deletion 30 2- نود غير انتهايي، داراي يک فرزند(5): لينک نود پدر را که به نود حذف شونده اشاره دارد را به فرزند نود حذف شونده اشاره دهيد. 5 40 2 30 5 40 2

  20. Binary Search Trees: Deletion 3- نود غير انتهايي داراي دو فرزند: مقدار نود حذف شونده را با بزرگترين المان سمت چپ يا کوچکترين المان سمت راست جابجا کنید. نودي را که جابجا کرده ايد را حذف کنيد. اين حذف کردن معادل يکي از حالتهاي 1 يا 2 خواهد بود. 30 5 40 toDelete 2 5 5 40 5 40 2 2

  21. Binary Search Trees: Deletion • قانون اصلي حذف: “با بزرگترين المان سمت چپ يا کوچکترين المان سمت راست جابجا کنيد” • آيا اين روش هميشه درست است؟ • بله – چون بزرگترين المان سمت چپ • از تمام عناصر سمت چپ بزرگتر است. • از تمام عناصر سمت راست کوچکتراست. • کوچکترين المان سمت راست • از تمام عناصر سمت چپ بزرگتر است. • از تمام عناصر سمت راست کوچکتراست. • اينها، همان شرايطي هستند که ريشه زير درخت جستجوي دودويي نياز دارد.

  22. حالت سوم حذف • اگر نود دو فرزند داشته باشد: (مثل نود ۱۰) 3 1 10 5 14 4 7 16 15 20

  23. ادامه ی حالت سوم حذف • بعد از حذف ۱۰ دو زیر درخت خواهیم داشت: • نمی توانیم یکی از این زیر درخت ها را بالا بیاوریم. • اما می دانیم که تمام نودهای زیر درخت سمت چپ از خود نود کوچکتر هستند. • و تمام نودهای زیر درخت سمت راست از خود نود بزرگتر هستند. 3 1 10 5 14 4 7 16 15 20

  24. ادامه ی حالت سوم حذف • چگونه دو زیر درخت را با هم یکی کنیم؟ • بزرگترین عنصر سمت راست را پیدا کنید. • زیر درخت سمت راست را به آن نود وصل کنید. 3 3 3 1 10 1 10 1 5 5 7 4 5 14 14 7 4 4 7 16 14 16 15 20 16 15 20 15 20

  25. مراحل حذف: • قدم اول: • نودی که باید حذف شود را پیدا کنید. prev 3 node 1 10 5 14 4 7 16 15 20

  26. مراحل حذف • قدم دوم: • بزرگترین عنصر زیردرخت سمت چپ را پیداکنید. prev 3 node prev 1 10 3 node 5 1 10 4 7 5 14 tmp 14 4 7 16 16 tmp 15 20 15 20

  27. مراحل حذف • قدم سوم: • زیر درخت سمت راست نود را به این نود وصل کنید. prev prev 3 node 3 node 1 5 1 10 4 7 14 5 16 4 7 14 15 20 16 15 20

  28. مراحل حذف • قدم چهارم: • اگر ریشه را قرار هست حذف کنید. باید ریشه را به طور مناسب تنظیم کنید و یکی از فرزندان نود که جابجا نمی شود تبدیل به ریشه ی جدید می گردد. prev 3 node 1 5 4 7 14 16 15 20

  29. کد حذف public void remove(int id) { BSTNode tmp, node, p=root, prev = null; // find the node p which needs to be removed while( p!=null && p.id!=id ) { prev = p; if( p.id<id ) p = p.right; else p = p.left; } node = p; prev 3 node 1 10 p 5 14 4 7 16 15 20

  30. ادامه ی کد حذف if( p!=null && p.id==id ) { // case (1)/(2): node has no right child: // its left child ( if any ) is attached to its parent if( node.right==null ) node = node.left; // case (1)/(2): node has no left child: // its right child ( if any ) is attached to its parent else if( node.left==null ) node = node.right;

  31. ادامه ی کد حذف else { // find the maximum node in the left subtree, // store the node to tmp tmp = node.left; while( tmp.right!=null ) tmp = tmp.right; // merge the right subtree to tmp's right child tmp.right = node.right; // lift node.left up node = node.left; }

  32. ادامه ی کد حذف if( p==root ) root = node; else if( prev.left == p ) prev.left = node; else prev.right = node; } else if( root!=null ) System.out.println( "ID " + id + " is not in the database"); else System.out.println( "The database is empty" );

More Related