موضوع مقاله: درخت سرخ-سیاه | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # درخت سرخ-سیاه | مقدمه: در علم رایانه، ساختمان داده درخت قرمز-سیاه بلوک، یک نوع درخت جستجوی دودویی خود-متوازن است. | ## بخش 1: درخت سرخ-سیاه | این ساختمان داده را ابتدا رودولف بایر در سال ۱۹۷۲ با نام «درخت دودویی B متقارن» ابداع کرد ولی نام جدید آن از پایان‌نامهٔ لیو.جی.گیباس و رابرت سجویک گرفته شده‌است. این ساختمان داده بسیار پیچیده است با این حال اعمال مربوط به آن حتی در بدترین حالت نیز زمان اجرای خوبی دارند، در واقع زمان جستجو، حذف، و درج برای این درخت مانند درخت AVL لگاریتمی است ( که تعداد گره‌های موجود در درخت است). مزیت عمده این ساختمان داده نسبت به درخت AVL این است که اعمال درج و حذف با تنها یک بار پیمایش درخت از بالا به پایین و تغییر رنگ گره‌ها انجام می‌شوند و در نتیجه پیاده‌سازی این درخت از درخت AVL ساده‌تر است. ویژگی‌ها درخت قرمز-سیاه یک درخت جستجوی دودویی است که ویژگی‌های زیر را دارد: هر گره با یکی از دو رنگ سیاه یا قرمز رنگ آمیزی می‌شود. تمامی مسیرها از یک گره به برگ‌ها (گره‌های null) باید دارای تعداد مساوی گره سیاه باشند. (برگ گره‌ای است که فرزندی نداشته باشد- همان گره‌های null) ویژگی‌های بالا موجب این خصوصیت مهم درخت‌های قرمز-سیاه می‌شوند: اگر یک درخت قرمز سیاه n گره غیر null داشته باشد ارتفاع درخت حداکثر خواهد بود. ویژگی فوق باعث می‌شود تا درخت‌های قرمز-سیاه کارایی مناسبی در اعمال جستجو، درج، و حذف داشته باشند.همچنین به خاطر این که در تمام مسیرهای از ریشه به برگ، تعداد گره‌های سیاه برابر است (ویژگی ۴) و ممکن نیست دو گره قرمز پشت سر هم قرار بگیرند (ویژگی ۳)، در این نوع درخت‌ها طول بلندترین مسیر از ریشه تا برگ هیچ وقت بزرگتر از دو برابر طول کوتاه‌ترین مسیر ریشه تا برگ نمی‌شود. با توجه به ویژگی‌های بالا درخت‌های قرمز-سیاه (بر خلاف درخت‌های جستجوی دودویی معمولی) هیچ وقت دچار عدم توازن شدید نمی‌شوند و زمان اجرای لگاریتمی اعمال در این درخت‌ها تضمین شده‌است. یک درخت قرمز-سیاه ار نظر ساختار شبیه یک درخت بی مرتبه ۴ است که در آن هر گره می‌تواند ۱ تا ۳ مقدار و همچنین ۲ تا ۴ اشاره گر به فرزندانش داشته باشد. در هر درخت بی، هر گره تنها یک مقدار دارد که برابر مقدار گره سیاه در درخت قرمز-سیاه است، و یک مقدار دلخواه دارد که و/یا بعد از آن در همان گره آمده‌است، که هر دوی آن‌ها مساوی گره قرمز در درخت قرمز-سیاه هستند. یک راه دیدن این برابری این است که در گره‌های قرمز درخت قرمز-سیاه در یک نمایش گرافیکی به سمت بالا حرکت کنیم، به‌طوری‌که با پدر سیاهشان در یک ردیف قرار بگیرند و یک دسته افقی را تشکیل دهند. در درخت بی، یا در نمایش گرافیکی تغییر یافته درخت قرمز-سیاه که گفته شد، همه برگ‌ها عمق یکسانی دارند. در این حالت درخت قرمز-سیاه، از نظر ساختار با درخت بی مرتبه ۴ برابر است که حداقل میزان پرشدن در یک دسته برابر ۳۳٪ است. این نوع درخت بی، عمومی تر از درخت قرمز-سیاه است اما هنگام تبدیل به درخت قرمز-سیاه، ابهاماتی دارد چون از یک درخت بی مرتبه ۴، چندین درخت قرمز-سیاه ساخته می‌شود. اگر یک دسته در درخت بی تنها ۱ مقدار را شامل شود، این مقدار کمینه است، گره مربوطه سیاه است و دو اشاره گر به فرزندانش دارد. اگر یک دسته شامل ۳ مقدار شود، مقدار وسطی در یک گره سیاه قرار می‌گیرد و گره‌های کناری آن باید قرمز باشند. اگر دسته شامل ۲ مقدار باشد، هر کدام از آن‌ها می‌تواند در درخت قرمز-سیاه، سیاه باشد و دیگری باید قرمز باشد؛ بنابراین درخت بی مرتبه ۴، مشخص نمی‌کند که کدامیک از مقادیر در هر دسته ریشه سیاه کل آن دسته و پدر بقیه مقادیر دسته است. با وجود این، عملیات در درخت‌های قرمز-سیاه از نظر زمان بهینه تر هستند چون نیازی به نگهداشتن برداری از مقادیر نیست. این نگهداری زمانی که مقادیر مستقیماً در هر گره ذخیره شده‌اند، نسبت به وقتی که تنها مرجع آن‌ها نگهداری شده‌است، پر هزینه است. البته گره‌های درخت بی از نظر حافظه به صرفه تر هستند چون لازم نیست برای آن‌ها صفت رنگ نگهداری شود. | ## بخش 2: درخت سرخ-سیاه | می‌توان شباهت‌هایی با درخت‌های بی مرتبه‌های بالاتری که از نظر ساختار شبیه درخت دودویی رنگ شده باشند هم ایجاد کرد چون تنها به رنگ‌های بیشتری نیاز است. در نتیجه درخت آبی-قرمز-سیاه مثل درخت قرمز-سیاه تعریف می‌شود اما با این محدودیت اضافه که دو گره متوالی از نظر مقدار نباید آبی باشند و همه گره‌های آبی باید فرزندان گره قرمز باشند. چنین درختی معادل یک درخت بی می‌شود که دسته‌های آن حداکثر ۷ مقدار و با این رنگ‌ها دارند :آبی، قرمز، آبی، سیاه، آبی، قرمز، آبی (هر گروه حداکثر ۱ گره سیاه، ۲ گره قرمز و ۴ گره آبی دارد). برای تعدیل کردن حجم مقادیر، درج و حذف در یک درخت دودویی سریعتر از درخت‌های بی است چون درخت‌های رنگ شده تلاشی برای بیشینه کردن مقدار پر شدن در یک دسته افقی از گره‌ها نمی‌کنند. چرخش در درخت‌های بی سریع تر است (چون چرخش‌ها اغلب در دسته یکسان رخ می‌دهند به جای اینکه در چند گره مجزا در یک درخت دودویی رنگ شده انجام شوند). با این وجود برای مرتب‌سازی حجم زیادی از داده‌ها، درخت‌های بی بسیار سریعتر هستند چون با گروهی کردن چند فرزند در یک دسته و امکان دسترسی محلی، فشرده تر شده‌اند. همه بهینه‌سازی‌های ممکن در درخت‌های بی برای افزایش متوسط میزان پرشدن گروه‌ها در درخت‌های دودویی رنگ شده هم ممکن است. بیشینه کردن میزان پرشدن در یک درخت بی، مانند کم کردن ارتفاع درخت چند رنگ است که با افزایش تعداد گره‌های غیر سیاه انجام می‌شود. بدترین حالت زمانی رخ می‌دهد که همه گره‌ها در یک درخت دودویی رنگ شده، سیاه باشند. بهترین حالت زمانی است که تنها یک سوم آن‌ها سیاه باشند (و دو سوم بقیه، قرمز باشند). کاربردها و ساختمان داده‌های مرتبط درخت‌های قرمز-سیاه، ضمانتی برای بدترین حالت زمان درج، حذف و جستجو می‌دهند. این نکته نه تنها باعث ارزشمندی آن‌ها در کاربردهایی که زمان برای آن‌ها حیاتی است مانند real-time application شده‌است بلکه آن‌ها را سازنده باارزش بلوک‌ها در سایر ساختمان داده‌های استفاده شده در هندسه محاسباتی که ضمانت بدترین زمان اجرا دارند، کرده‌است. درخت متوازن ساختار دیگری است که جستجو، درج و حذف را در زمان اجرای O(log n)پشتیبانی می‌کند. این درخت بیشتر از درخت قرمز-سیاه مرتب شده‌است که منجر به درج و حذف آهسته‌تر اما بازیابی سریعتر می‌شود. درخت‌های قرمز-سیاه به ویژه در برنامه‌نویسی تابعی ارزشمند هستند که یکی از رایج‌ترین انواعساختار پایدار داده‌های استفاده شده برای ساختن آرایه‌های اشتراکی و مجموعه‌ها است. نسخه پایدار درخت‌های قرمز-سیاه علاوه بر زمان، نیازمند فضایی به اندازه O(log n) برای هر درج یا حذف است. به عبارت دیگر، برای هر درخت ۲–۴، یک درخت قرمز-سیاه همتا که عناصر داده‌ای آن از همان مرتبه است، وجود دارد. عملیات درج و حذف در درخت‌های ۲–۴ هم معادل تغییر رنگ و چرخش در درخت‌های قرمز-سیاه هستند. این باعث می‌شود درخت‌های ۲–۴ ابزار مهمی برای درک منطق درخت‌های قرمز-سیاه باشند؛ و این همان دلیلی است که بسیاری از متن‌های معرفی الگوریتم‌ها، درخت‌های ۲–۴ را قبل از درخت‌های قرمز-سیاه معرفی می‌کنند باوجود اینکه درخت‌های ۲–۴ معمولاً در عمل استفاده نمی‌شوند. LLRB یک ویژگی اضافه دارد که همه رئوس قرمز باید هنگام درج‌ها و حذف‌ها در سمت چپ درخت قرار بگیرند. | ## بخش 3: درخت سرخ-سیاه | درخت‌های قرمز-سیاه می‌توانند برای هر مجموعه‌ای از عملیات، به درخت‌های ۲–۳ یا درخت‌های ۲–۴ ایزومتریک باشند. با درخت‌های ۲–۴، ایزومتری با یک «تغییر رنگ» حل شده است که در آن رنگ قرمز هر دو گره فرزند، به پدر منتقل می‌شود. عملگرها عملگرهای فقط خواندنی نسبت به درخت‌های دودویی ساده نیاز به تغییر ندارند چراکه یک حالت خاص از آن‌ها می‌باشند ولی حذف و اضافهٔ معمولی می‌تواند تأثیراتی از قبیل خارج شدن از شروط اولیهٔ درخت‌های قرمز- سیاه داشته باشد که برای بازگردانی آن ویژگی‌ها نیاز به تغییر رنگ و چرخش درخت دارد. اگرچه این نوع حذف واضافه پیچیدگی بسیاری دارد ولی بازهم نرخ جستجوی آن همچنان (O(logn می‌باشد. اضافه کردن اضافه کردن به وسیلهٔ پیاده‌سازی انجام شده در درخت‌های دودویی و رنگ آمیزی آن‌ها با رنگ قرمز انجام می‌شود. اتفاقی که بعداً می‌افتد بستگی به شیوهٔ رنگ آمیزی گره‌های مجاور بستگی دارد عبارت گره عمو به برادر گره والد اشاره دارد، همانند آنچه که در روابط خانوادگی مطرح است. ویژگی ۵ (همهٔ برگ‌ها سیاه هستند (گره‌های nullهم سیاه محسوب می‌شوند همیشه باید حفظ شود. ویژگی ۳ (فرزندان گره قرمز سیاه هستند) با اضافه کردن گره قرمز و تغییر رنگ گره به سیاه یا چرخش تهدید می‌گردد. ویژگی ۴ (همهٔ مسیرها باید دارای تعداد مساوی گره سیاه باشند) با اضافه کردن یک گره سیاه تغییر رنگ فرمز به سیاه یا چرخش تهدید می‌شود توجه کنید: برچسب‌های N برای گره اضافه شده، P برای والد گره اضافه شده،G برای پدربزرگ گره اضافه شده و U برای عموی گره اضافه شده مورد استفاده می‌شود. در این حالت با تغییر رنگ به سیاه (بخاطر ویژگی ریشه باید سیاه باشد) و در هر مسیر باید یگ گره سیاه وجود داشته باشد اعتبار درخت را حفظ می‌کند. تا آن زمان که هر راه از والد /عمو که به‌طور قطع از پدر بزرگ نیز عبور می‌کند همچنان معتبر می‌باشد. با این وجود G(پدر والد و عمو و پدربزرگ N) باید بررسی شود که آیا ریشه‌است یا خیر (تا به رنگ سیاه درآید (ویژگی ۲) این کار را می‌توان با یک متد بازگشتی انجام داد. حتی می‌توان آن را به صورت یک حلقه نوشت که البته ثابت می‌شود این حلقه دارای تعداد مشخصی انجام عملیات چرخش است. در این حالت، یک دوران به چپ که نقش گره جدید N را با والدش؛ P تغییر می‌دهد، قابلیت اجرا پیدا می‌کند که در آن والد قبلی با فرزندش جابجا می‌شود سپس والد قبلی که اکنون دوباره برچسب‌گذاری شده با ویژگی همه مسیرها دارای تعدا مساوی گره سیاه هستند؛ سر و کار دارد. چون بر طبق ویژگی ۴ (هر دو فرزند گره قرمز سیاه هستند) همچنان مورد تهدید بی اعتبارشدن درخت همراه است. دوران باعث می‌گردد تا در بعضی از مسیرها (از جمله مسیری که از زیر درخت برچسب‌گذاری شدهٔ ۱)عبور می‌نماید از گره جدیدی که قبلاً مطرح نبوده‌است، عبور می‌کند ولی چون این گره مانند گره قبلی قرمز است، ویژگی ۴ با دوران اعتبار درخت را از بین نمی‌برد. به همین ترتیب اگر والد (p) قرمز باشد ولی عمو سیاه باشد همچنان گره جدید سمت چپ p است و p فرزند سمت راست G است. درختی که نتیجه می‌شود دارای والد ی به نام P برای هردو گره G و N است .G، به عنوان ریشه، سیاه است و این تا آن زمان که فرزندش قرمز باشد پابرجاست. با تغییر رینگ P و G درخت نهایی حاصل می‌گردد که همهٔ ویژگی‌های فوق از جمله تعداد مساوی گره سیاه در هر مسیر (به این شکل که تمامی مسیرهایی که از این سه گره عبور می‌کند که قبلاً از G عبور می‌کرده و اکنون از P عبور می‌کند) پابرجاست. | ## جمع‌بندی | به همین ترتیب اگر والد قرمز است ولی عمو سیاه می‌باشد و گره جدید N فرزند راست والد P است و P فرزند راست پدربزرگ(G)است.