درخت مبنا
درخت مبنا (radix tree) یا درخت پاتریشیا (Patricia tree) یا درخت کریت بیت (crit bit tree)، گروهی از داده ساختارهای بر پایه ترای هستند که برای نگهداری مجموعهای از رشتهها استفاده میشوند. برخلاف ترای معمولی، یالها در درخت مبنا با مجموعهای از کاراکترها برچسبگذاری میشوند. این برچسب میتواند رشتهای از کاراکترها، مجموعه از بیتها به عنوان یک عدد صحیح یا یک IP address باشد یا بهطور کلی مجموعهای اختیاری از اشیا به ترتیب نوشتاری. گاهی اوقات اسامی درخت مبنا و درخت کریت بیت فقط به درختهایی اطلاق میشود که اعداد صحیح را نگهداری میکنند و درخت پاتریشیا، برای ورودیهای کلی تر استفاده میشود اما ساختار آن در همه موارد به همین صورت است.
نگاه کلی
آسان تر است که درخت مبنا را به عنوان یک ترای در نظر بگیریم که از لحاظ حافظه بهینه شده است، چرا که هر گره با یک بچه در درخت مبنا با فرزندش ادغام میشود. نتیجه این میشود که هر گره داخلی حداقل دو بچه دارد. برخلاف ترای معمولی، یالها همون طور که میتوانند با یک کاراکتر برچسبگذاری شوند، در این جا میتوانند با رشتهای از کاراکترها برچسبگذاری میشوند. این برای مجموعههای کوچک ( به خصوص اگر طول رشتهها زیاد باشد) یا برای مجموعههایی که رشته هایشان حروف مشترک ابتدایی زیادی داشته باشند، بسیار کارآمدتر است.
این داده ساختار، عملیاتهای اصلی زیر را پشتیبانی میکند و همه آنها از هستند که حداکثر طول یک کلمه در آن گروه از رشته هاست:
- مراجعه: تعیین میکند که یک رشته در درخت هست یا نه. این عملیات کاملاً همانند درختها انجام میشود با این تفاوت که بعضی یالها ممکن است نشانگر چندین کاراکتر باشند.
- درج: اضافه کردن یک رشته به درخت. درخت را تا زمانی که دیگر نتوانیم پیشروی بیشتری داشته باشیم، جستجو می کنیم. در این نقطه ما باید یک یال خروجی که با تمام کاراکترهای باقیمانده از رشته ورودی برچسبگذاری شده، اضافه کنیم. یا اگر از قبل یالی خروجی که در بخشی از حروف با باقیمانده کلمه اشتراک داشته باشد، وجود داشته باشد، آن را به دو یال تقسیم می کنیم( که اولی با بخش مشترک آن، برچسبگذاری میشود) و پیش می رویم. عمل تقسیم تضمین میکند که هیچ گرهی بیشتر از تعداد کاراکترهای رشتهای ممکن، بچه نداشته باشد.
- حذف: حذف یک رشته از درخت. ابتدا برگ متناظر را حذف می کنیم. سپس اگر پدر آن فقط یک بچه داشت، پدر را هم حذف کرده و دو یال لازم را با هم ادغام می کنیم.
- پیدا کردن جد: بزرگترین رشتهٔ کوچکتر از یک رشتهٔ داده شده را برحسب ترتیب واژه نگاری پیدا میکند.
- پیدا کردن جانشین: کوچکترین رشتهٔ بزرگتر از رشتهٔ داده شده را بر حسب ترتیب واژه نگاری پیدا میکند.
یک تعمیم متداول درخت مبنا، از گرههای دورنگی استفاده میکند. سیاه و سفید. برای بررسی اینکه آیا یک رشته در درخت هست یا نه، جستجو از بالا آغاز میشود و یالهای رشته ورودی را تا زمانی که دیگر نتوان جلوتر رفت، دنبال میکند. اگر جستجوی رشته تمام شده باشد و گره نهایی سیاه بوده باشد، جستجو ناموفق بودهاست و اگر سفید بود، جستجو موفق. این روش ما را قادر می سازد که با استفاده از گرههای سفید، طیف وسیعی از رشتهها با حروف ابتدایی مشترک را به یک درخت اضافه کنیم. سپس گروه کوچکی از استثنائات را با استفاده از درج آنها با گره سیاه، با یک روش کارآمد از لحاظ فضا، حذف کنیم.
کاربردها
همانطور که ذکر شد، درخت مبنا برای ساخت آرایههای شرکت پذیر با کلیدهایی که به صورت رشته بیان میشوند، مفید است. و همچنین کاربرد ویژهای در حوزه IP Addressها دارد، جایی که توانایی شامل شدن محدوده بزرگی از کلیدها با تعداد کمی استثنا، بهطور ویژهای برای سازماندهی سلسله مراتبی IP Addressها مناسب است. درخت مبنا همچنین در شاخصهای وارونهٔ پروندههای متنی در بازیابی اطلاعات مورد استفاده قرار میگیرد.
تاریخچه
اولین بار دونالد موریسون در 1968 چیزی که خودش درخت پاتریشیا نامید را توصیف کرد. نام آن در واقع مخفف "الگوریتم عملی برای بازیابی اطلاعات کدشده به صورت الفبای عددی" ( Practical Algorithm To Retrieve Information Coded In Alphanumeric) می باشد. گرنوت گوهنبرگر در همان زمان بهطور مستقل این داده ساختار را طراحی و توصیف کرد.
مقایسه با دیگر داده ساختارها
برخلاف درختهای متوازن، درخت مبنا اجازهٔ مراجعه، درج و حذف را در به نسبت را میدهد. زمانی که این یک برتری به نظر نمیآید اما در یک درخت متوازن، هر مقایسه یک رشته در بدترین حالت زمان نیاز دارد که خیلی از آنها در عمل برای اشتراکات طولانی حروف ابتدایی کند هستند. در یک درخت، همهٔ مقایسهها نیازمند زمان ثابتی است اما درخت مبنا مقایسه برای جستجوی رشتهای به طول نیاز دارد. درختهای مبنا میتوانند این عملیاتها را با تعداد مقایسه کمتر و نیازمندی به تعداد گرههای کمتر انجام دهند.
درخت مبنا از مزیتهای درختها نیز بهره می برند. اگرچه آنها میتوانند برای رشتهای از عناصر یا عناصری با یک نگاشت (mapping) برگشت پذیر کارآمد به رشتهها به کار روند، اما فاقد عمومیت فوق العادهٔ درختهای متوازن جستجو میباشند که برای هر نوع دادهٔ دارای ترتیب میتواند استفاده شود. یک نگاشت برگشت پذیر به رشته ها، میتواند برای تولید ترتیب موردنیاز برای درخت متوازن جستجو استفاده شود اما نه همه جا. همچنین این میتواند گیجکننده باشد که برای یک نوع داده ای فقط عملیات مقایسه تعریف شده باشد و نه یک ترتیب مشخص.
اغلب گفته میشود که جداول درهم سازی ( Hash tables ) عمل درج و حذف را در انجام می دهند، اما این فقط وقتی درست است که فرض کنیم محاسبهٔ درهم سازی یک کلید، عملیاتی با زمان ثابت است. اگر درهمسازی یک کلید نیز محاسبه شود، جداول درهمسازی عمل درج و حذف را در انجام می دهند که با توجه با شیوه ای که برای حل برخوردها اعمال میشود، در بدترین حالت حتی زمان بیشتری هم میگیرد. درخت مبنا کران بالای اجرای برای درج و حذف دارد. همچنین عملیاتهای یافتن جد و جانشین نیز در جداول درهمسازی پیادهسازی نمیشود.
گونههای دیگر
HAT-trie یک داده ساختار آگاه از حافظه پنهان مبتنی بر درخت مبناست که نگهداری، بازیابی و از سرگیری ترتیبی کارآمدی را برای رشتهها فراهم میکند. اما عملکرد آن با احترام به زمان و حافظه مصرفی آن، قابل مقایسه با جداول درهمسازی بهینه در استفاده از حافظه پنهان است.