درخت جستجوی دودویی: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
جز clean up، typos fixed: به طور ← بهطور (5)، همین طور ← همینطور با استفاده از AWB برچسب: ویرایش توسط ویرایشگر خودکار |
|||
خط ۱۶:
[[پرونده:Binary search tree.svg|چپ|200px|بندانگشتی|یک درخت جستجوی دودویی با اندازه ۹، عمق ۳، ریشه ۸ و برگهای ۱، ۴، ۷ و ۱۳.]]
در [[علوم رایانه]]، '''درخت جستجوی دودویی''' {{انگلیسی|Binary search tree یا به اختصار BST}} که گاهی اوقات '''درخت دودویی مرتب''' هم نامیده میشود، یک [[ساختار داده]] است و نوعی
یک درخت باینری نوعی ساختارداده برای ذخیره کردن داده است مانند عددهاییی که مرتب شده هستند. درخت جست و جوی دودویی این امکان را فراهم میکند که جست و جوی یک عدد، اضافه کردن آن و حذف کردن آن با سرعت بیشتری انجام شود. همچنین این امکان را فراهم میکند که مجموعه های پویا و جداول جست و جو را پیاده سازی کنیم.
خط ۳۵:
در ادامه برخی اصطلاحهای مهم مربوط به درخت مورد اشاره قرار گرفته است:
* مسیر ([[:en:
* ریشه ([[:en:
* والد (parent) – هر گرهی به جز گره ریشه یالی به سمت بالا به یک گره دارد، که والد آن گره نامیده میشود.
* فرزند (child) – گرهی که زیر یک گره مفروض قرار دارد و از طریق یالی به سمت پایین به آن وصل شده است، گره فرزند آن نامیده میشود.
* برگ (leaf) – گرهی که هیچ فرزندی دارد، برگ نامیده میشود.
* زیردرخت ([[:en:
* بازدید (Visiting) – منظور از بازدید، بررسی ارزش یک گره است، هنگامی که کنترل روی گره قرار دارد.
*[[پرونده:Optimal-binary-search-tree-from-sorted-array.gif|بندانگشتی|جست و جوی دودویی روی آرایه ی مرتب شده]]پیمایش ([[:en:
* سطوح (Levels) – سطح یک گره نماینده نسل آن فرزند است. اگر گره ریشه در سطح 0 باشد، در این صورت فرزندان آن در سطح 1، نوههای آن در سطح 2 و
* کلیدها (Keys) – کلید نماینده ارزش یک گره بر مبنای نوع عملیات جستجویی است که قرار است روی گره انجام شود.
عملیات اصلی بر روی یک درخت جستجوی دودویی به زمانی متناسب با ارتفاع درخت احتیاج دارد. برای یک درخت دودویی کامل با n گره چنین عملیاتی در بدترین حالت در زمان (o(logn اجرا میشود. بنابراین اگر درخت یک زنجیر خطی با n گره باشد همین عملیات در زمان بدترین حالت (o(n اجرا میشود. امید ریاضی ارتفاع یک درخت جستجوی دودویی که به تصادف ساخته شده است برابر با (o(logn است.بنابراین عملیات اصلی مجموعه پویا بر روی چنین درختی در حالت میانگین به زمان (o(logn احتیاج دارد.
سطر ۵۲ ⟵ ۵۱:
بعد از ارائه ویژگی های اصلی درخت های جستجوی دودویی در بخش های بعد نشان میدهیم چگونه برای چاپ مقادیر یک درخت جستجوی دودویی به صورت مرتب، عملیات روی آن را انجام میدهیم.
== عملیات اصلی بر روی درخت جستجوی دودویی ==
سطر ۶۲ ⟵ ۵۹:
# جستجو کردن و یافتن یک کلید خاص در درخت
# حذف کردن یک کلید از درخت، با حفظ خاصیت درخت
# [[پیمایش درخت]] جستجوی دودویی،
== جستجو ==
سطر ۱۴۳ ⟵ ۱۴۰:
<br />
[[پرونده:Bst-insert-1.jpg|بندانگشتی|درج]]
<syntaxhighlight lang="c">typedef int T
سطر ۱۷۱ ⟵ ۱۶۷:
</syntaxhighlight><br />
== حذف یک گره ==
فرض کنید میخواهیم گره i را از درخت جستجوی دودویی حذف کنیم.
# i یک گره برگ است.<ref>گره برگ به گرهی میگویند که درجه آن صفر باشد. به عبارتی دیگر، هیچ فرزندی نداشته باشد.</ref>
# i یک فرزند دارد.
سطر ۱۸۰ ⟵ ۱۷۶:
[[پرونده:Bst-delete-2.jpg|بندانگشتی|حذف]]
[[پرونده:Bst-delete-3.jpg|بندانگشتی|حذف]]
[[File:AVL-tree-delete.svg|thumb|500px|left|حذف یک گره با دو فرزند از یک درخت جستجوی دودویی]]
سطر ۱۸۶ ⟵ ۱۸۱:
در حالتی که i دو فرزند دارد، باید بزرگترین عنصر در زیردرخت چپ یا کوچکترین عنصر در زیردرخت راست را پیدا کرده و سپس آن را با گره i جایگزین و تعویض میکنیم. سپس ما این فرایند را با حذف کردن این عنصر جایگزین از زیردرختی که از آن گرفته شدهاست، دنبال میکنیم. به عبارتی دیگر، اگر بخواهیم گره N را از درخت حذف کنیم (که این گره دو فرزند دارد)، به جای اینکه خود گره N را پاک کنیم، یا گره بعد از N در پیمایش میانوندی یا گره قبلی N در پیمایش میانوندی را انتخاب میکنیم و آن گره را R مینامیم. سپس مقادیر N و R را تعویض کرده و سپس R را از درخت حذف میکنیم.
=== تابع transplant
این تابع در تابع حذف گره از درخت استفاده می شود ، این تابع دوگره u و v را به عنوان ورودی می گیرد و اگر u ریشه درخت باشد آنگاه v را ریشه درخت قرار می دهد ،اگر u ریشه دره نباشد پدر u را به v اشاره می دهد ،و اگر v نال نبود پدر v را پدر u قرار می دهد ، در واقع این تابع v را جای u قرار می دهد و از نظر رابطه با گره ی پدر کار ها را درست می کند ولی کاری به جابهجا کردن فرزندان u , v ندارد.
سطر ۲۱۴ ⟵ ۲۰۹:
== انواع ==
درخت جستجوی دودویی گونههای مختلفی دارد. [[درخت ایویال]] و [[درخت سرخ-سیاه]] از جمله [[درخت جستجوی دودویی خود-متوازن]] هستند. [[درخت اسپلی]] نوعی درخت دودویی است که عناصری که مکرراً مورد استفاده قرار میگیرند را به صورت خودکار به ریشه درخت نزدیک میکند تا دسترسی به آنها راحتتر شود. در یک [[تریپ]]، (tree heap) هر گره یک اولویت دارد که این اولویت به شکل تصادفی به گره اختصاص مییابد و گره والد اولویت بیشتری نسبت به فرزندش دارد. [[:en:
درختان جست و جوی دودویی هستند که برای کاهش حافظه ی استفاده شده .
درخت تباهیده درختی است که در آن هر والد فقط یک فرزند دارد . در واقع می توان گفت هر والد فقط یک گره دارد. ای درخت متوازن نیست و در بدترین حالت مانند یک لیست پیوندی عمل می کند. اگر با درج عنصر جدید در درخت تابع افزودن گره ، ارتفاع درخت را متوازن نکند، می توان به سادگی از بک درخت تباهیده کنک گرفت
کرد.
=== مقایسه عملکرد ها ===
D. A. Heger در سال ۲۰۰۴ روشی برای مقایسه عملکرد درخت های جست و جوی دودویی ارائه داد. در این مقایسه تریپ را به عنوان بهترین عملکرد در حالت میانگین معرفی کرد در حالی که در همین مقایسه درخت سرخ-سیاه کمترین اختلاف را بین بدترین حالت و بهترین حالتش دارد هرچند
=== درخت جست و جوی دودویی بهینه ===
سطر ۲۲۹ ⟵ ۲۲۴:
گره هایی که بیشترین استفاده را دارند و دسترسی به آن ها مورد نیاز است را نزدیک ریشه قرار میدهیم . همچین گره هایی که کمترین به آن دسترسی داریم را نزدیک برگ ها قرار می دهیم . با این روش بهینه هزینه جیت و جوی کمتری خواهیم داشت.
== جستارهای وابسته ==
|