بخشی از مقاله
تبدیل مبنا
درخت مبنا (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 یک داده ساختار آگاه از حافظه پنهان مبتنی بر درخت مبناست که نگهداری، بازیابی و از سرگیری ترتیبی کارآمدی را برای رشتهها فراهم می کند. اما عملکرد آن با احترام به زمان و حافظه مصرفی آن، قابل مقایسه با جداول درهم سازی بهینه در استفاده از حافظه پنهان است.
باينری و دسيمال و تبدیل آنها به یکدیگر :
می خواستم در مورد IP ها توضیح بدم دیدم احتمالا تو توضیحات به مشکل باینری و دسیمال بر می خوریم
برای همین گفتم همین جا همه چیز رو در مورد این مبنا ها بگم
سعی می کنم ساده توضیح بدم که متوجه بشین، سعس کنید کامل مطالعه کنید تا دیگه با این موضوع مشکل نداشته باشید
دسیمال : یعنی مبنای 10
باینری : یعنی مبنای 2
اکتان : یعنی مبنای 8
هگزا دسیمال : یعنی مبنای 16
وقتی ما از عددی مثل 225 صحبت می کنیم
یعنی یک مقدار عددی هست که در مبنای 10 یعنی دسیمال نمایش داده میشه ، اما همین عدید رو اگر بخواهیم به صورت باینری ( مبنای 2 ) نمایش بدیم نتیجه میشه 11100001 به صورت اکتان میشه 341 و به صورت هگزا دسیمال ( مبنای 16 ) میشه E1 ولی همه این مدل نمایش ها در نهایت بیانگر یک عدد هستند که به صورت های مختلف نمایش داده شده اند
که تو حالت عادی ما و روزمره از اعداد در مبنای 10 استفاده می کنیم
ولی در کامپیوتر از مبنای 2 یعنی همون باینری استفاده میشه ، برای همین ما باید بتوانیم مبنای 10 را به 2 تبدیل کنیم
اما روش تبدیل :
روش تبدیل دسیمال به باینری : ( مبنای 10 به مبنای 2 )
فرض کنید می خواهم عدد 253 که دسیمال هست را به باینری تبدیل کنم
برای اینکار باید عدد 253 را به 2 تقسیم کنیم
بعد با قی مانده را نگه داریم و خارج قسمت را به 2
تقسیم کنیم
دوباره باقی مانده را نگه می داریم و خارج قسمت را به 2 تقسیم می کنیم ، این کار و ادامه میدهیم تا جایی که خارج قسمت 0 بشه
سپس باقيماندهها را يادداشت میکنيم به اين صورت که اولين باقيمانده را در سمت راست و آخرين باقيمانده را در سمت چپ مینويسيم
که برای عدد 253 ای که ما داشتیم جواب برابر 11111101 می شود
حالا فرض کنید ما می خواهیم حاصل تبدیل ما از دسیمال به باینری یک عدد 8 رقمی باشه و لی جواب ما کمتر از 8 رقم بشه . مثلا فرش کنید شده 11101 یعنی 5 قم ، پس ما 3 رقم کم داریم ، برای همین به سمت چپ به تعدادی که لازم داریم 0 اضافه می کنیم . پس میشه 00011101
شما برای تمرین چند تا عدد رو به باینری تبدیل کنید ، برای مثال 132 و 80 رو به باینری تبدیل کنید
اما حالا تبدیل باینری به دسیمال : ( مبنای 2 به مبنای 10 )
فرض کنید حالا ما می خواهیم عدد باینری 11111101 را به دسیمال تبدیل کنیم ( عکس عمل قبلی )
برای اینکار میایم عدد اول از سمت راست یعنی 1 را در 1 ضرب می کنیم
1*1
بعد عدد دوم از سمت راست را که میشه 0 در 2 ضرب می کنیم
0*2
بعد عدد سوم از راست که میشه 1 را در 4 ضرب می کنیم ، عدد بعدی در 8 ، بعدی 16 و ...
و در انتها جواب همه ضرب ها رو با هم جمع می کنیم
براي مشخص كردن تعداد چيزها آن ها را مي ش
ماريم. اين شمارش بايد در دستگاه مشخصي و در چهارچوب خاصی انجام گيرد. به طور معمول شمارش در دستگاه دهدهي انجام مي شود، يعني دستگاهي كه مبناي شمارش ر آن ۱۰ است. در اين دستگاه واحد هر مرتبه ۱۰برابر واحد مرتبه ي قبلي است. مثلاً واحد مرتبه هزارگان ۱۰برابر واحد مرتبه ي صدگان است و واحد مرتبه ي ص
دگان۱۰برابر واحد مرتبه ي دهگان است و واحد مرتبه ي دهگان ۱۰برابر واحد مرتبه ي يكان مي باشد.
اما آيا مي توان شمارش را به گونه اي ديگر نيز انجام داد ؟
به مثال زير توجه كنيد:
مدير يك كارخانه ي ليوان سازي به انباردار خود دستور داد آمار تمام ليوان هاي موجود در انبار كارخانه را به او بدهد. در واحد بسته بندي اين كارخانه هر ۶ عدد ليوان را در يك بسته پلاستيكي و هر ۶ بسته را در يك كارتن و هر ۶ كارتن را در يك جعبه و بعد هر ۶ جعبه را در يك صندوق چوبي بزرگ قرار مي دهند. سپس صندوق ها را بار قطار كرده و براي مشتريان خود به شهرهاي دور و نزديك مي فرستند. انباردار براي شمارش تعداد ليوان ها جدولي را كه در اختيار داشت به صورت زير كامل كرد:
واحد يكي بسته كارتن جعبه صندوق
تعداد ۲ ۱ ۴ ۱ ۵
او در گزارش خود تعداد ليوان هاي موجود را ۵۱۴۱۲ نوشت. اما وقتي تعجب مدير كارخانه را ديد ساعتي بعد آن را اصلاح كرد و تعداد ليوان ها را ۶۸۴۸ اعلام كرد .
آيا به نظر شما او دروغ گفته بود ؟
خير. او هر دو بار راست گفته بود ولي فراموش كرده بود كه روش شمارش ليوان ها را توضيح دهد. در مرتبه ي اول او تعداد ليوان ها را بر اساس چگونگي بسته بندي آن ها حساب كرده بود. در اين روش شمارش در مبناي ۶ انجام گرفته بود و او مي بايست تعداد ليوان ها را ۶(۵۱۴۱۲) ثبت مي كرد. در مرتبه ي دوم او با توجه به اين كه مي دانست در هر بسته ۶ ليوان و در هر كارتن۶*۶ليوان و در هر جعبه ۶*۶*۶ ليوان و در هر صندوق ۶*۶*۶*۶ ليوان وجود دارد، جدول خود را به صورت زير كامل كرد :
واحد يكي بسته
۶تايي كارتن
۳۶ تايي جعبه
۲۱۶ تايي صندوق
۱۲۹۶تايي
تعداد ۲ ۶
۱* ۳۶
۴ * ۲۱۶
۱ * ۱۲۹۶
۵ *
۲ ۶ ۱۴۴ ۲۱۶ ۶۴۸۰
و سپس مجموع آن ها را به دست آورد : ۶۸۴۸ = ۲+ ۶ + ۱۴۴ + ۲۱۶ + ۶۴۸۰
اين عدد تعداد ليوان ها را در مبناي ۱۰ نشان مي دهد. پس : ۶۸۴۸ = ۶( ۵۱۴۱۲ )
سؤال : در آمارگيري ماه بعد او تعداد ليوان ها را ۶( ۱۴۰۲۰ ) به دست آورد. به نظر شما او چه عددي را بايد در گزارش خود به مدير كارخانه بنويسد؟
* * * * *
اگر بخواهيم عددي را كه در مبناي غير ۱۰ نوشته شده به مبناي ۱۰ ببريم. رقم هاي آن را در توان هاي مختلف مبنا ضرب مي كنيم و سپس مجموع آن ها را به دست مي آوريم.
مثال۱ـ نمايش معمولي عدد ۶( ۱۰۵۳) را بنويسيد .
۲۴۹= ۳+ (۶*۵) + ( ۳۶*۰) + ( ۲۱۶*۱) = ۶
( ۱۰۵۳)
مثال۲ـ نمايش ۵۳۲ را در مبناي ۶ به دست آوريد.
۶( ۲۲۴۴) = ۵۳۲
• اگر در مثال هاي بالا توجه كرده باشيد خواهيد ديد اگر عددي را از يك مبنا به مبناي كوچك تري ببريم نمايش ظاهري عدد بزرگ تر خواهد ش
• در هر مبنا از رقم هايي مي توان استفاده كرد كه از خود مبنا كوچك تر باشند. مثلاً در مبناي ۱۰ از رقم های ۰ تا ۹ ودر مبنای ۴ فقط از رقم های ۰ ، ۱ ، ۲ و ۳ استفاده می شود.
سؤال: اگر شما ۱۴ سال سن داشته باشيد، سن شما در هر يك از مبناهاي ۲ تا ۹ برابر چند مي شود؟ در چه مبنايي سن شما بيش تر است ؟
مثال۳- بزرگ ترين و كوچك ترين اعداد سه رقمي در مبناي ۷ چه اعدادي هستند؟
در مبناي ۷ فقط مي توانيم رقم هاي ۰ تا ۶ را به كار ببريم. دو جواب داريم:
اگر بخواهيم از رقم هاي تكراري استفاده كنيم،عدد ۷(۶۶۶) بزرگ ترين و عدد۷(۱۰۰) كوچك ترين عدد سه رقمي در مبناي ۷ هستند. ولي اگر از رقم هاي تكراري استفاده نكنيم، عدد۷(۶۵۴) بزرگ ترين و عدد۷(۱۰۲) كوچك ترين عدد سه رقمي در مبناي ۷ هستند.
• جمع
براي جمع چند عدد كه مبناي مساوي داشته باشند مانند اعداد در دستگاه دهدهي عمل مي كنيم. اعداد را از سمت راست زير هم مي نو
يسيم. ابتدا اعداد جايگاه اول را با هم جمع مي كنيم. اگر حاصل از مبنا كوچك تر باشد، آن را مي نويسيم و اگر برابر مبنا يا بزرگ تر از آن باشد، آن قدر مبنا و يا مضارب مبنا را از آن كم مي كنيم تا باقي مانده كوچك تر از مبنا شود. آن گاه باقي مانده را نوشته و به ازاي هر مبنايي كه از حاصل جمع كم كرديم در ستون سمت چپ يك واحد
اضافه مي كنيم.
مثال۴- حاصل ۳(۲۱۲) + ۳(۲۱۰۱) را به دست آوريد .
۱ ۱
۳(۲۱۰۱)
۳(۰۲۱۲) +
۳(۱۰۰۲۰)
• تفريق
در تفريق دو عدد كه مبناي مساوي دارند بايد توجه داشت اگر رقم مفروق منه (رقم بالايي) از رقم مفروق كم تر باشد، از رقم سمت چپ آن يك واحد كم مي كنيم و به تعداد مبنا به آن رقم مفروق منه اضافه مي كنيم.
مثال ۵ـ حاصل ۵(۱۳۴) - ۵(۳۲۴) را به دست آوريد .
۷ ۲
۵(۳۲۴)
۵(۱۳۴) -
۵( ۱۴۰)
مثال۶ـ نمايش عدد۴(۱۲۳) را در مبناي۵ بن
ويسيد .
۲۷ = ۳ + (۴*۲) + (۱۶*۱) =۴(۱۲۳)
۵( ۱۰۲ ) = ۲۷
۵( ۱۰۲ ) = ۴(۱۲۳)