moaminsharifi/fa-wiki-spell-checker huggingface dataset:
بنا بر این، این موضوع شبیه رفتار صف بندی انسان‌ها است، جاییکه افراد صف را به ترتیب ورودشان ترک می‌نمایند. یا زمانی که در پشت چراغ راهنمایی منتظر نوبت خود می‌شوند. FCFS نیز نام دیگری برای الگوریتم زمانبندی سیستم‌عامل FIFO است. روشی که به هر فرایندی زمانی از زمان پردازنده را مطابق با ترتیب ورودش اختصاص می‌دهد. در معنای وسیع تر، سرواژه LIFO یا «آخرین ورودی، اولین خروجی» متضاد FIFO است. با در نظر گرفتن واژه FILO به معنای «اولین ورودی، آخرین خروجی» تفاوت این دو واژه آشکارتر می‌شود. در واقع هر دو حالت خاصی از یک لیست عام هستند. تفاوت در داده‌ها وجود ندارد. بلکه در قواعد برای دستیابی به محتوا است.
در علم رایانه این واژه اشاره دارد به نحوه پردازش داده ذخیره شده در یک صف. هر عنصر در یک داده ساختار صف ذخیره می‌شود. اولین داده اضافه شده به صف، اولین داده‌ای خواهد بود که برداشته می‌شود. بنا بر این، پردازش از نظر زمانی به همین ترتیب پیش می‌رود. این رفتار معمول برای یک صف است. کد زیر نمونه‌ای از این داده ساختار است.
struct fifo_node
برنامه نویسان و کاربران صف FIFO بایستی توجه زیادی به کاربرد واژگان head و tail برای اشاره به دو سر صف داشته باشند. برای بسیاری از افراد داده‌ها باید از tail وارد صف شوند و تا زمانیکه به head برسند در صف بمانند و صف را از آنجا ترک نمایند. این دیدگاه را می‌توان با صف افرادی که برای در یافت سرویس خاصی منتظر مانده‌اند قیاس نمود و به کاربرد دو واژه «جلو» و «عقب» در این مثال تشبیه نمود. اگر چه، افراد دیگر عقیده دارند که داده‌ها از head وارد صف می‌شوند و از tail آن را ترک می‌نمایند. همچون ترتیب عبور غذا در درون یک مار. صف‌هایی که به این طریق پیاده‌سازی شده‌اند، در جایگاه‌هایی مانند سیستم‌عامل GNU/Linux ظاهر می‌شوند.
کنترل کنندگان دیسک از FIFO به عنوان یک الگوریتم زمانبندی استفاده می‌کنند تا مطابق با آن خدمات مربوط به درخواست‌های ورود و خروج اطلاعات را ارائه کنند.
First Input First Output در این حالت اولین پردازه که وارد می‌شود همان پردازه نیز پردازش می‌شود و تا زمانی که این پردازه تمام نشود یا نیاز به یک منبع جدید نداشته باشد پردازنده را در اختیار خود می‌گیرد تا به پایان برسد و در این زمان پردازنده آزاد شده و به پردازه‌های دیگر اختصاص می‌یابد. یکی از مزیت‌های این حالت در زمان‌بندی می‌توان به ساده بودن و پیاده‌سازی راحت آن اشاره نمود. از معایب آن می‌توان گفت که پردازنده را مشغول یک پردازه می‌کند و تا تمام نشدن آن هیچ پردازهٔ دیگری اجرا نمی‌شود حتی اگر این پردازه خیلی مهم تر از پردازه اولی باشد.
سوئیچ‌ها و مسیریاب‌های مورد استفاده در شبکه سازی، از FIFOها برای نگهداری بسته‌های اطلاعاتی در مسیر مقصد بعدی آن‌ها استفاده می‌کنند. به‌طور نمونه در هر اتصال شبکه حد اقل یک ساختار FIFO استفاده می‌شود. برخی دستگاه‌ها، برای صف بندی همزمان و مستقل انواع مختلف اطلاعات از چند FIFO استفاده می‌کنند.
FIFO معمولاً در مدارهای الکترونیکی برای بافر کردن وکنترل جریان از سخت‌افزار به نرم‌افزار بکار می‌رود. در سخت‌افزار، FIFO عمدتاً از یک سری اشاره گرهای نوشتاری و خواندنی و حافظه تشکیل شده‌است. حافظه می‌تواند SRAM,Flip Flop,latch یا هر نوع حافظه مناسب دیگری باشد. برای FIFOهای با اندازه بزرگتر معمولاً از dual-port SRAM استفاده می‌شود؛ که در آن از یک پورت برای نوشتن و از دیگری برای خواندن استفاده می‌شود.
FIFOّهای همزمان نوعی FIFO هستند که در آن‌ها از کلاک واحد برای خواندن و نوشتن استفاده می‌شود. FIFOهای غیر همزمان از کلاک‌های مختلف برای خواندن و نوشتن استفاده می‌کنند. یکی از پیاده‌سازی‌های رایج FIFOهای غیر همزمان از برای اشاره گرهای خواندن و نوشتن استفاده می‌کند.
کُرچ شدن ، به حالتی از مرغ گفته می‌شود که در طی آن مرغ آمادهٔ خوابیدن بر روی تخم و درآوردن جوجه می‌شود.
کرچ مرغ که مستی گونه‌ای دارد برای خوابیدن بر تخم و جوجه برآوردن. کُرک یا کُرُک هم گفته می‌شود.لغتنامه دهخدا
مرغ از آن دسته از ماکیان هست که بیشترین تخم‌گذاری در فصول را به خود اختصاص داده‌است و فقط هنگام کرچ شدن تخم‌گذاری این مرغ قطع می‌شود. در این فرایند مرغ به دلیل تمایل به تولید مثل کرچ می‌شود وطی تخم‌گذاری و با جمع‌آوری تخم دیگر آنچنان تمایل خوردن و بازیگوشی را ندارد و بیشتر اوقات را در لانه سپری می‌کند این باعث می‌شود مرغ طی روزهای آتی روی تخم بخوابد وبعد از بیست و یک روز جوجه‌هایش سر از تخم درمی‌آورند. یک نکته جالب این است که بعد از گذشت ۳ الی ۴ روز با گرفتن نور گوشی با گوشه ای از تخم می‌توان متوجه شد که آیا تخم نطفه دار است که در صورت عدم رگ و… تخم فاسد شده و باید از زیر مرغ زود تر خارج کنیم تا گرمای مرغ به مابقی تخم‌ها برسد.
البته بلدرچین و بوقلمون و بعضی دیگر از ماکیان هم کرچ می‌شوند. کرچ شدن در هر نژادی از مرغ متفاوت است. بوقلمون‌ها و بلدرچینی‌هایی که در دستگاه باز شده‌اند هرگز توانایی کرچ شدن را ندارند؛ همین‌طور بوقلمون‌های گوشتی و ماشینی. به دلیل کمبود مهر مادری و نبود درک حس مادرانه توسط مادر موجود آنها هم هیچ وقت توانایی آن را ندارند. دمایی که مرغ برای تبدیل دارد بین ۳۷ تا ۳۹ می‌باشد.
عبارت مرغ کرچ در گویش شمیرانی اصطلاحاً برای اشاره به فرد افسرده و گوشه نشین نیز کاربرد دارد.
وقتی مرغ تخم می‌گذارد نمی‌گذارد کسی به تخمش دست بزند و اگر کسی بخواهد تخم اورا بردارد شروع به داد و بیداد می‌کند.
پس از تبدیل شدن تخم‌ها به جوجه مرغ سعی می‌کند تا حداکثر یک هفته الی ۱۰ روز بر رو تخم‌های خود بشیند تا سایر تخم‌ها هم تبدیل شود.
کرچی در مرغان را می‌توان با صدای مخصوصی که مرغ از خود نشان می‌دهد تشخیص داد؛ و همچنین مرغ‌ها اغلب در این هنگام پرهای خود را باز می‌کنند و در هنگام کرچی مرغ حساستر و نسبت به دیگر مرغ‌ها و همچنین حضور انسان واکنش نشان می‌دهد. مرغ کرچ ترجیح می‌دهد که اوقات روز را به جای دانه چیدن و گردش در جایی که تاریک و خلوت باشد بر روی تخم‌های دیگر مرغ‌ها بخوابد. مرغ‌های کرچ معمولاً در طی دوران کرچی پرریزی می‌کنند و تخمگذاری آن‌ها نیز در این مدت قطع می‌شود، از اینرو نژادهایی که زیاد کرچ می‌شوند مطلوب مرغدان تجاری نیستند. دوران جوجه کشی در مرغ‌ها بسته به نوع نژاد پرنده از ۱۹ تا ۲۱ روز متفاوت است و در این مدت مرغ کرچ فقط یک یا دو بار در طول روز اقدام به خوردن و آشامیدن یا دفع فضولات به بیرون رفته و به سرعت سر جای خود برمی‌گردد.
کرچی در مرغ‌ها را می‌توان به عواملی چند مانند نژاد، آب و هوا، محل تخمگذاری پرنده و تغذیه نسبت داد که در این میان نقش نژاد از همه پررنگتر است؛ بطوری‌که در نژادهای سنگین میزان کرچی نسبت به نژادهای سبکتر، بیشتر می‌باشد. همچنین تاریک و دنج بودن محل تخمگذاری و جمع نکردن تخم مرغ‌ها به‌طور منظم خود عاملی است که مرغ را تحریک به کرچ شدن می‌کند به نحوی که می‌توان از این عامل برای کرچ کردن مرغ در هنگام نیاز سود برد.
آرایه پویا، در علوم کامپیوتر، آرایه‌ای است که می‌تواند تغییر اندازه دهد و اجازه دهد عناصری به آن اضافه یا از آن حذف شود. امروزه امکان انجام این عمل در بسیاری از کتابخانه‌های استاندارد زبان‌های رایج برنامه‌نویسی تعبیه شده‌است.
در یک آرایه پویا در ابتدای کار حافظه اختصاص داده نمی‌شود؛ به‌طوری‌که اندازه‌اش غیرقابل تغییر باشد.
ساده‌ترین آرایه پویا با اختصاص دادن آرایه‌ای به طول ثابت ساخته می‌شود که بعد آن را به دو قسمت تقسیم می‌کنند: قسمت اول عناصر آرایه پویا را ذخیره می‌کند و قسمت دوم ذخیره شده، یا بدون استفاده می‌ماند. سپس می‌توان با استفاده از فضای رزرو شده در زمانی ثابت عناصر را به انتهای آرایه پویا اضافه کرد یا آن‌ها را حذف کرد، تا زمانی که این فضا به‌طور کامل استفاده شود. تعداد عناصری که توسط محتویات آرایه پویا استفاده می‌شود اندازه منطقی یا اندازه آن است، در حالیکه اندازه آرایه زیرین ظرفیت آرایه پویا نام دارد، که حداکثر اندازه منطقی ممکن است.
در برنامه‌هایی که اندازه منطقی کراندار است، این ساختار داده کفایت می‌کند. تغییر دادن اندازه آرایه زیرین عملی هزینه بر است، گاهی ناچار می‌شویم تمام محتویات آرایه را کپی کنیم.
برای جلوگیری از تحمیل هزینه‌های اضافی حاصل از تغییر اندازه دادن‌های مکرر، آرایه‌های پویا به مقدار زیادی تغییر اندازه می‌دهند، مثلاً به دو برابر اندازه اولیه تغییر اندازه می‌دهند، و فضای رزرو شده را برای بسط بعدی استفاده می‌کنند. عمل اضافه کردن یک عنصر باید مانند زیر انجام شود:
در فرایند درج n عنصر، ظرفیت‌ها تشکیل تصاعد هندسی می‌دهند. بسط دادن آرایه با هر نسبت ثابتی تضمین می‌کند وارد کردن عصر در کل از (O(n زمان می‌برد، یعنی وارد کردن هر عنصر زمان سرشکن شده ثابتی می‌برد. مقدار این تناسب منجر به لزوم سبک‌سنگین کردن این فصله زمانی می‌شود: زمان متوسط هر بار وارد کردن تقریباً (a/(a-۱ است، در حالی که تعداد خانه‌های تلف شده از بالا به a−۱)n) کراندار است. انتخاب a بستگی به برنامه دارد، ولی معمولاً a=۲ می‌گیرند.
بعلاوه در بسیاری از آرایه‌های پویا اگر مقدار استفاده شده از حدی کمتر شود، مانند ۳۰٪ ظرفیت، آن را آزاد می‌کنند.
آرایه‌های پویا مثال رایجی در تدریس تحلیل سرشکن شدهamortized analysis هستند.
کارایی آرایه پویا شبیه آرایه‌است، بعلاوه عمل حذف و افزودن عناصر به انتها:
بسیاری از مزیت‌های آرایه‌ها در آرایه‌های پویا نیز وجود دارد، از جمله محل مناسب مرجع و استفاده از حافظه نهان، تراکم (کم استفاده کردن از حافظه)، و دسترسی تصادفی. معمولاً آرایه‌های پویا در کل فقط یک حافظه اضافی کوچکی برای اطلاعات اندازه و ظرفیت دارند. این ویژگی موجب می‌شود آرایه‌های پویا ابزار مناسبی برای ساختن داده ساختار متناسب با حافظه نهان شوند.
آرایه‌های پویا در مقایسه با لینک لیست، قابلیت شاخص گذاریindexing سریع تری دارند (زمان ثابت در برابر زمان خطی) و معمولاً به دلیل اصلاح محل مرجع عناصر سریعتر می‌توان بر روی عناصر واقع در خانه‌های آرایه حرکت کرد؛ اگرچه، آرایه‌های پویا برای وارد کردن در محلی دلخواه یا پاک کردن از جایگاهی اختیاری زمانی خطی نیاز دارند، چون همه عناصر بعدی باید یک عنصر جابه‌جا شوند، در حالیکه لینک لیست می‌تواند این عمل را در زمانی ثابت انجام دهد. به وسیلهٔ میانگیر وقفهgap buffer و متغیرهای بردار صف شده این اشکال را برطرف کرده‌اند که در مورد آن در قسمت متغیرها بحث شده‌است. همچنین، ممکن است یافتن فضایی پیوسته در ناحیه یک حافظه بسیار قطعه بندی شده هزینه بر یا غیرممکن باشد، در حالیکه لینک لیست‌ها نیازی ندارند همه داده ساختار به‌طورپیوسته در حافظه ذخیره شود.
میانگیرهای وقفه شبیه آرایه‌های پویا هستند ولی اجازه می‌دهند عملگرهای کارای درج و حذف نزدیک محل اختیاری مشابه جمع شوند. برخی از پیاده‌سازی‌های صف دو سر از آرایه‌های صف دو سر استفاده می‌کنند، که اجازه درج/جابجایی در هر دو سر، به جای یک طرف می‌دهد.
Goodrich الگوریتمی از آرایه‌های پویا به نام "Tiered Vectors" ارائه کرد که کارایی آن برای درج و حذف از وسط آرایه با حفظ ترتیب n۱/۲ O(است.
درخت آرایه‌ای درهمHash Array Tree یک الگوریتم آرایهٔ پویا است که توسط Sitarski در سال ۱۹۹۶ ساخته شده‌است. درخت آرایه‌ای درهم حافظه‌ای از مرتبه n۱/۲ هدر می‌دهد، که n تعداد عناصر آرایه‌است. وقتی دنباله‌ای از اشیا به انتهای درخت آرایه‌ای درهم می‌افزاییم، کارکرد سرشکن الگوریتم O(۱) است.
در سال ۱۹۹۹ Brodnik et al. در مقاله‌ای یک داده ساختار آرایه پویای صفیtiered dynamic array توصیف کرد، که در هر نقطه‌ای از زمان تنها n۱/۲ فضا برای n عنصر هدر می‌داد، و آن‌ها کران پایینی را ثابت کردند که نشان می‌داد در هر آرایه پویایی اگر عملگرها می‌خواهند زمان ثابت سرشکنی بگیرند حداقل به این مقدار فضا نیاز هست. بعلاوه، برای مواردی که رشد کردن و جمع شدن میانگیرنه تنها درحالت سرشکن بلکه در بدترین حالت ثابت باشد، متغیری ارائه کردند.
در سال ۲۰۰۲ Bagwell الگوریتم Vlist را ارائه کرد، که می‌تواند برای پیاده‌سازی آرایه پویا اقتباس شود.
در C++, Std::vector یک نمونه پیاده‌سازی برای آرایه‌های پویا است، همان‌طور که کلاس‌های ArrayList توسط API java و.NET Framework عرضه شده‌است. کلاس نوعیgeneric List<> نیز توسط version 2.0 of the.NET Framework عرضه شده، پیاده‌سازی دیگری برای آرایه‌های پویا است. Delphiو Dآرایه‌های پویا را در هسته زبان پیاده‌سازی کرده‌اند. بسیاری از زبان‌های مستندscripting languages مانند Perl و PHP پیشنهاد می‌دهند آرایه‌های پویا جزو ساختمان و به عنوان گنه داده‌های اولیه در نظر گرفته شوند.
Wikipedia contributors, "Dynamic array," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Dynamic_array&oldid=290138184 (accessed May 15, 2009).
مرتب‌سازی انتخابی یکی از انواع الگوریتم مرتب‌سازی می‌باشد که جزو دستهٔ الگوریتم‌های مرتب‌سازی مبتنی بر مقایسه‌است. این الگوریتم دارای پیچیدگی زمانی از درجهٔ است که به همین دلیل اعمال آن روی مجموعهٔ بزرگی از اعداد کارا به نظر نمی‌رسدو به‌طور عمومی ضعیفتر از نوع مشابهش که مرتب‌ساز درجی است عمل می‌کند. این مرتب‌سازی به دلیل سادگی اش قابل توجه‌است. کارایی آن برحسب تعداد ورودی‌ها در نمودار زیر نشان داده شده‌است.
این الگوریتم این‌گونه عمل می‌کند:
ابتدا کوچکترین عنصر مجموعه اعداد را یافته با اولین عدد جابجا می‌کنیم. سپس دومین عنصر کوچکتر را یافته با دومین عدد جابجا می‌کنیم و این روند را برای n-1 عدد اول تکرار می‌کنیم. در حقیقت در هر مرحله ما لیست خود را به دو بخش تقسیم می‌کنیم. زیرلیست اول که قبلاً مرتب کرده‌ایم و سایر اعضای لیست که هنوز مرتب نشده‌است.
در جدول زیر مثالی از پیاده‌سازی این روال بر روی ۶ عدد آمده‌است.
A = [64, 25, 12, 22, 11]
for i in range(len(A)):
print ("Sorted array")
private static void selectionSort(double arr[])
for(int i= 0; i < arr.length - 1; i++) // (could i < arr.length - 1 because single element is also min element)
تحلیل الگوریتم مرتب‌سازی انتخابی برخلاف بسیاری از مرتب‌سازی‌های دیگر بسیار ساده‌است. زیرا که هیچ‌کدام از حلقه‌های آن به اعداد موجود در لیست ورودی بستگی ندارد. در مرحلهٔ اول به دست آوردن کمینه در لیست n عنصری نیاز به پیمودن کل n عدد و n – 1 مقایسه دارد و سپس باید کمینهٔ به‌دست آمده با اولین عدد جابجا شود. در مرحلهٔ بعدی به دست آوردن دومین کمینه در لیست 1 - n عنصری نیاز به پیمودن کل 1 - n عدد و 2 - n مقایسه دارد و کمینهٔ به‌دست آمده بادومین عدد جابجا شودو این روند ادامه پیدا می‌کند. پس کلاً تعداد مقایسه‌ها عبارتست از:
("n" − 1) + ("n" − 2) +... + 2 + 1 = "n"("n" − 1) / 2 ∈ Θ("n"2)
مرتبهٔ این الگوریتم به دلیل عدم وابستگی آن به نحوهٔ ترتیب اعداد در بهترین، بدترین و حالت متوسط یکسان و برابر(Θ("n"2
۱-با توجه به قطعه کد نوشته شده، ترتیب عناصر تغییری در عملکرد آن اینجا نمی‌کند. یعنی این الگوریتم برای داده‌های کاملاً مرتب، نامرتب تصادفی و مرتب معکوس به یک ترتیب عمل کرده و تمام مقایسه‌های محاسبه شده در رابطه فوق را انجام می‌دهد؛ بنابراین پیچیدگی این الگوریتم در بهترین حالت و حالت متوسط نیز (Θ(n2 است.
۲- مرتب‌سازی انتخابی یک روش مرتب‌سازی درجا است. یعنی عملیات مرتب‌سازی در داخل خود لیست و بدون نیاز به حافظه کمکی بزرگ انجام می‌گیرد.
۳- در پیاده‌سازی مرتب‌سازی انتخابی به روش فوق، اگر دو عنصر با مقدار بیشینه داشته باشیم، اولی انتخاب شده و به انتهای لیست منتقل می‌شود. در نتیجه ترتیب آن‌ها به هم می‌خورد؛ بنابراین این پیاده‌سازی روش پایدار نیست. در روش پایدار ترتیب عناصر با مقدار یکسان تغییر نمی‌کند. اما اگر در مقایسه عناصر آرایه به جای> از => استفاده کنید، مرتب‌سازی پایدار خواهد شد.
این الگوریتم بین الگوریتم‌های با مرتبهٔ مرتب‌ساز انتخابی از مرتب‌ساز حبابی و مرتب‌ساز گورزاد (در حالت متوسط) بهتر عمل می‌کند. اما عموماً ضعیفتر ازمرتب‌ساز درجی است. یکی از شباهتهای مرتب‌ساز درجی به مرتب‌ساز انتخابی این است که در هر دو پس از پیمایش Kام مجموعه اعداد
kعنصر اول در جای صحیح خود قرار گرفته‌اند. فایدهٔ مرتب‌ساز درجی این است که برای پیدا کردن عنصر x
هر تعداد از اعداد را که نیاز است بررسی می‌کند. حال آنکه مرتب ساز انتخابی همه عناصر باقی‌مانده را بررسی می‌کند.
به هر حال هر دو آن‌ها روی لیستهای کوچک بسیار سریع هستند.
در نهایت اعمال مرتب‌ساز انتخابی روی لیستهایی با اندازه بزرگ به مراتب از مرتب‌ساز حبابی که روی ان لیستها با پیچیدگی زمانی
("Θ("n" log "n
عمل می‌کند ضعیف‌تر است.
این سورس یک عدد گرفته و به تعداد همان عدد از ورودی دریافت می‌کند و آن‌ها را با روش. Selection sort مرتب می‌کند.
احمد نوری‌زاده (آبان ۱۳۳۰ – ۱ شهریور ۱۴۰۰) ادیب، مترجم و پژوهشگر ایرانی بود. وی بنیانگذار ارمنی‌شناسی فارسی در ایران بود. نوری‌زاده تنها شاعر غیرارمنی جهان بود که به زبان ارمنی نیز شعر می‌سرود.
وی در آبان ماه سال ۱۳۳۰ در خانواده‌ای پرجمعیت، در غازیان، بندرانزلی روستای سهلک از توابع بخش کوهستان به دنیا آمد. نوری‌زاده در کمتر از ۶ ماه نزد «آرشی بابایان» شاعر ارمنی، الفبای این زبان را آموخت وی همچنین در نزد خاژاک در-گریگوریان، رئیس «دانشکده ارمنی‌شناسی» دانشگاه اصفهان، مدتی را به آموزش زبان ارمنی گذراند. احمد نوری‌زاده در سال‌های ۱۳۴۹–۱۳۴۸ کار ترجمه و معرفی آثار شاعران ارمنی را آغاز کرد. در ارمنستان، از او به عنوان «فرزند پارسی‌گوی ملت ارمنی» یاد می‌شود و «جایزه سپاس» را از انجمن نویسندگان ارمنستان دریافت کرد.
وی در ساختمان گل یاس یکی از ساختمان‌های آسایشگاه کهریزک مخصوص بیماران ام‌اس، تحت مراقبت‌های پزشکی و اجتماعی بود.
وی در صبح روز دوشنبه ۱ شهریور ۱۴۰۰ در سن ۶۹ سالگی درگذشت.
نوری‌زاده به پاس چهل سال تلاش بی‌وقفه در شناساندن فرهنگ و ادب ارمنی جوایز جهانی بسیاری نیز کسب کرده‌است که از جمله مهم‌ترین آن‌ها عبارتند از:
جمهوری فدرال برزیل از ۲۷ واحد فدرال تشکیل شده است که این واحدها از ۲۶ ایالت و یک منطقه فدرال که شهر پایتخت، برازیلیا را شامل می‌شود، تشکیل شده‌اند.
در علوم رایانه پشته‌های دوجمله‌ای (Binomial heaps) داده‌ساختارهایی مشابه با پشته‌های دودویی هستند که قادر به پشتیبانی از عمل ادغام سریع دو Heap نیز هستند. که این عمل با استفاده این داده ساختار، از درخت دو جمله‌ای حاصل می‌شود.
یک پشته دو جمله‌ای با استفاده از مجموعه‌ای از درخت‌های دو جمله‌ای ساخته می‌شود(همان گونه که پشته دودویی از درخت دودویی ساخته می‌شود). یک درخت دو جمله‌ای به صورت بازگشتی، همانند زیر تعریف می‌شود:
یک درخت دو جمله‌ای از مرتبه "k" دارای ۲k رأس، و ارتفاع "k" می‌باشد.
به خاطر ساختار خاص درخت دو جمله‌ای، می‌توان هر درخت از مرتبه "k" را از وصل کردن دو درخت از مرتبه "k"-۱ ساخت، به این ترتیب که ریشه یکی از این درخت‌ها را به عنوان چپ‌ترین فرزند به ریشه درخت دیگر وصل کرد. این ویژگی در انجام عمل ادغام روی Heapهای دو جمله‌ای اهمیت دارد که یکی از دلایل برتری آن‌ها بر Heapهای معمولی است.
یک Heap دو جمله‌ای با استفاده از مجموعه‌ای از درخت‌های دو جمله‌ای پیاده‌سازی می‌شود که دارای "خصوصیات Heap دو جمله ای" است:
خصوصیت اول تضمین می‌کند که ریشه هر درخت دارای کوچکترین کلید موجود در آن درخت است، که به تمام Heap تعمیم پیدا می‌کند.
خاصیت دوم نتیجه می‌دهد که هر Heap با "n" عنصر حد اکثر از log "n" + ۱ تشکیل شده‌است. در واقع تعداد و مرتبه هر یک از این درخت‌ها به‌طور منحصر به فرد توسط تعداد عناصر درخت "n" مشخص می‌شود: هر درخت دودویی متناظر است با رقم یک در نمایش دودویی "n". برای مثال عدد ۱۳ در مبنای دو دارای نمایش ۱۱۰۱ می‌باشد، formula_1 در نتیجه یک پشته دو جمله‌ای با ۱۳ عنصر از سه درخت دوجمله‌ای با مرتبه‌های ۰، ۲ و ۳ تشکیل شده‌است(همانند شکل).
یک پشته دو جمله‌ای شامل ۱۳ عنصر نا مساوی
به این دلیل که انجام هر یک از عملیات نیاز به دسترسی تصادفی به ریشه‌های درخت‌های دودویی ندارد، ریشه درخت‌ها را می‌توان به ترتیب مرتبه در یک لیست پیوندی() ذخیره کرد.
همان طور که قبلاً نیز گفته شد مهم‌ترین عملیات در پشته‌های دو جمله‌ای، ادغام دو درخت دو جمله‌ای از یک مرتبه در دو پشته دو جمله‌ای می‌باشد. به این منظور از آنجایی که ریشه یک درخت کوچکترین عضو آن درخت می‌باشد با مقایسه کلید ریشه‌های دو درخت، کلیدی که کوچکتر است عضو مینیمم است به عنوان ریشه درخت جدید انتخاب می‌شود و ریشه دیگر زیر درخت آن می‌شود. این رویه پایه کامل کردن عملیات ادغام دو پشته دو جمله‌ای است.
Wikipedia contributors, «Binomial heap,» Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Binomial_heap&oldid=290139444 (accessed May 15, 2009).
در نظریه گراف ، گراف پترسن گرافی غیر جهت دار، با ۱۰ راس و ۱۵ یال است. این گراف، گرافی کوچک می‌باشد که به عنوان مثالی مفید و همچنین مثال نقض در بسیاری از مسائل نظریه گراف به کار می‌رود.یولیوس پترسنJulius Petersen (۱۸۳۹-۱۹۱۰) دانشمندی دانمارکی بود که در سال ۱۸۹۸ گرافی را، که به نام خودش ثبت شد، به عنوان کوچکترین گراف مکعبی (گرافی که هر راس آن از درجه ۳ باشد.) بدون پل ساخت. در واقع این گراف مثال نقضی برای این ادعا بود که یک گراف مکعبی بدون پل متصل، داری یک رنگ آمیزی یالی با ۳ رنگ است. در حالی که این گراف دارای این رنگ آمیزی با ۴ رنگ می‌باشد. با این که این گراف به‌طور عمومی به یولیوس پترسن نسبت داده می‌شود، ولی درحقیقت برای اولین بار ۱۲ سال زودتر از ساختن آن توسط وی، در سال ۱۸۸۶ به وجود آمده بود.دونالد نوثDonlad Knuth اذعان می‌کند که گراف پترسن، شکل و پیکری قابل توجه‌است که به عنوان مثالی نقض برای بسیاری از اسناد و اثبات‌های خوش بینانه دربارهٔ این که چه چیزهایی ممکن است به‌طور عمومی برای گراف‌ها درست باشد، به کار می‌رود.
گراف پترسن، گراف مکمل برای گراف خط، K۵ است. همچنین گراف نسر KG۵٬۲ هم می‌باشد. این بدان معنا است که اگر برای هر کدام از زیرمجموعه‌های دو عضوی یک مجموعهٔ ۵ عضوی یک رأس در نظر بگیریم و بین هر دو رأسی که زیرمجموعه‌های نظیرشان ناسازگار باشند یک یال وصل کنیم، گراف پترسن ساخته می‌شود.
گراف پترسن، گرافی غیر مسطح است. هر گراف غیر مسطح زیر گرافی دارد که با گراف کامل K۵ یا گراف دو بخشی کامل K۳٬۳ هم ریخت یا هومئومورف است. حال آن که پترسن با هر دو گراف هم ریخت می‌باشد.
دقیقاً ۱۹ گراف مکعبی متصل با ۱۰ یال وجود دارد. گراف پترسن یکی از همین ۱۹ گراف می‌باشد. این گراف تنها گرافی با ۱۰ یال از این دسته‌است که دارای قطر برابر ۲ و تنها گراف بدون پل با اندیس رنگی ۴ می‌باشد. و نهایتاً تنها گراف بدون پل با ۱۰ یال است که همیلتنی نیست.
متداول‌ترین و متقارن‌ترین شکل گراف پترسن که یک پنج ضلعی با یک ستارهٔ پنج رأس درون آن است که هر یک از رأس‌هایش به رأس‌های پنج ضلعی با یک یال وصل می‌شود، دارای ۵ نقطه تقاطع می‌باشد(شکل(۱)).این روش ترسیم بهترین روش برای کمینه کردن تعداد تقاطع‌ها نیست. روشی دیگر برای کشیدن گراف پترسن با دو نقطهٔ تقاطع وجود دارد.(شکل(۲)) بنابراین عدد تقاطع گراف پترسن ۲ است.
همچنین گراف پترسن می‌تواند به گونه‌ای رسم شود که یال‌ها دارای طول برابر واحد باشند. این نوع، یک گراف به طول واحد است.(شکل(3))
گراف پترسن دارای مسیر همیلتونی است ولی دور همیلتونی ندارد. همچنان که در بالا ذکر شد این گراف کوچکترین گراف مکعبی بدون پل است که دور همیلتونی ندارد. در نتیجه گراف همیلتونی نیست. ولی این گراف، شبه همیلتونی است، بدان معنی که با وجود این که دور همیلتونی ندارد ولی با حذف کردن هر یال آن تبدیل به گراف همیلتونی می‌شود و ضمناً کوچترین گراف شبه همیلتونی نیز می‌باشد.(شکل(۴)) گراف پترسن یکی از ۵ گراف متصل راس-ترایا است که دور همیلتونی ندارد.
گراف پترسن دارای شماره رنگی ۳ است. این بدان معنا است که راس‌های آن می‌توانند با ۳ رنگ، اما نه با ۲، رنگ شوند به طوری که هیچ یالی دو راس همرنگ را متصل نکند.(شکل(۵)) همچنین دارای اندیس رنگی ۴ می‌باشد که یعنی برای رنگ کردن یال‌ها به ۴ رنگ نیاز داریم.
در جدول زیر بعضی از خواص این گراف به‌طور خلاصه آمده‌است:
صف اولویت‌دار از جمله ساختمان‌های داده بسیار پرکاربرد است.
در صف عادی از روش خروج به ترتیب ورود (FIFO) استفاده می‌شود. در این تکنیک مثل یک صف نانوایی داده‌ها به ترتیب ورود پشت سر هم در صف قرار می‌گیرند؛ بنابراین اولین داده ورودی اولین داده خروجی نیز خواهد بود.
اما در صف اولویت‌دار برای هر داده اولویتی - نه لزوماً منحصربه‌فرد - مشخص می‌شود. صف اولویت را می‌توان به اورژانس یک بیمارستان تشبیه کرد که هر بیمار با شدت بیماری بیشتر اولویت بیشتری برای رسیدگی دارد. سیستم‌عامل کامپیوتر هم برای مدیریت پردازش‌ها از صف‌های اولویت استفاده می‌کند.
صف‌های اولویت حداقل از ۲ عملیات زیر پشتیبانی می‌کنند:https://en.wikipedia.org/wiki/Priority_queue
عملیات زیر هم با توجه به کاربردهای فراوانی که دارد اغلب اوقات پیاده‌سازی می‌شود:
پیدا کردن عنصر با بالاترین اولویت
در پیاده‌سازی‌های پیشرفته تر مربوط به این ساختار عملیات‌های زیر نیز می‌توانند وجود داشته باشند:
صف اولویت دار همانند صف معمولی است با این تفاوت که در هنگام خروج، عنصری که بالاترین اولویت را دارد، از لیستمان خارج می‌گردد.
صف معمولی حالت خاصی از صف اولویت‌دار است که در آن اولویت عناصر به‌ترتیب اضافه شدنشان کاهش پیدا می‌کند پس عنصری که در اول لیست است، بالاترین اولویت را داراست.
ساختن یک درخت heap در واقع وارد کردن متوالی گره‌ها در آن است. برای وارد کردن یک گره به درخت heap، طی دو مرحله به صورت زیر عمل می‌کنیم:
۱- گره مفروض را در محلی از درخت که شرط کامل بودن آن به هم نخورد (بدون در نظر گرفتن شرط max-heap یا min-heap بودن) درج می‌کنیم.
۲- اگر گره مذکور بر اساس موقعیت خود در درخت، شرط max-heap یا min-heap بودن را نقض نکند، نیاز به انجام کاری نیست و عملیات درج تمام شده‌است. در غیر اینصورت، با جابجا کردن گره با والد خود، درخت جدیدی حاصل می‌شود که باید مرحله ۲ در مورد آن تکرار شود.
برای پیاده‌سازی صف اولویت‌دار عموماً از آرایه استفاده می‌شود. ما در اینجا سه روش مختلف را شرح می‌دهیم.
در این روش زمانی که داده‌ای وارد صف می‌شود همچون صف عادی در انتهای آن قرار می‌گیرد. به عنوان نمونه داده‌های مثال زمانبندی CPU به صورت زیر در آرایه قرار می‌گیرند:
شماره پردازش: ۱ ۲ ۳ ۴ ۵ ۶
الویت: ۴ ۲ ۱ ۳ ۵ ۴
درج و حذف یک عنصر در این روش، از نظر زمانی به ترتیب (۱)O و (O(n است.
توجه داشته باشید که هر عنصر آرایه ساختمانی مرکب از دو عنصر شماره پردازش و اولویت آن است. هر پردازش جدید به انتهای صف اضافه می‌شود، که از مرتبه (O (۱ است.
اما زمانی که قرار است پردازشی از آن خارج شود باید تک تک عناصر بررسی شوند، تا پردازشی با بیشترین اولویت انتخاب شود. این فرایند از مرتبه (O (n است.
در این روش بر خلاف روش قبلی آرایه بر اساس اولویت‌ها مرتب شده‌است.
شماره پردازش:۵ ۶ ۱ ۷ ۴ ۲ ۳
الویت:۵ ۴ ۴ ۳ ۳ ۲ ۱
شماره پردازش: ۱ ۲ ۳ ۴ ۵ ۶ ۷
الویت:۴ ۲ ۱ ۳ ۵ ۴ ۳
زمانی که داده‌ای وارد صف می‌شود، بر اساس اولویت خود در محل مناسب قرار می‌گیرد.
در این حالت پردازش با بیشترین اولویت همواره در انتهای صف قرار دارد و هزینه استخراج آن (O (۱ است. این مسئله در مقایسه با آرایه نامرتب یک برتری است. اما در این روش هزینه درج (O(n است که در مقایسه با روش قبلی اصلاً بهینه نیست.
در کل می‌توان گفت روش آرایه مرتب و نامرتب هم ارز یکدیگر بوده و از لحاظ عملکرد تفاوت چندانی با هم ندارند.
درج و حذف یک عنصر در این روش، از نظر زمانی به ترتیب (O(n و (۱)O است.
در این درخت heap، داده‌ها را بر اساس اولویت آن‌ها در یک درخت مکس-هیپ همانند شکل وارد می‌کنیم.
اعداد داخل گره‌ها اولویت و اعداد خارجی شماره پردازش هستند. درخت فوق در نمایش آرایه‌ای به صورت شکل نشان داده شده، خواهد شد.
در یک درخت min-heap عنصری با کوچکترین کلید همواره در ریشه قرار دارد (چرا!؟). در نتیجه عمل حذف گره ریشه از درخت min-heap کوچکترین عنصر آن را به ما می‌دهد. این عمل از مرتبه (O (logn است. عمل درج در min-heap هم همان‌طور که می‌دانید از همین مرتبه‌است.
عملیات درج و حذف روی یک صف اولویتی که با استفاده از آرایه مرتب یا نامرتب ساخته شده باشد روی هم رفته از مرتبه (O (n است. اما در روش آرایه نیمه مرتب این مرتبه به (O (logn کاهش می‌یابد. پس می‌توان گفت که روش درخت هیپ برای پیاده‌سازی صف اولویتی کارایی بسیار بهتری دارد.
هنگامی که عناصر را در یک صف اولویت‌دار که با استفاده از آرایه مرتب پیاده‌سازی شده است، درج کنیم و پس از آن یکی یکی آن‌ها را از لیست حذف کنیم؛ عناصر به صورت مرتب شده قرار می‌گیرند. این روشی است که در چندین الگوریتم مرتب‌سازی به کار می‌رود:
http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html
http://en.wikipedia.org/wiki/Priority_queueویکی‌پدیای انگلیسی
بازگشت در علوم رایانه، روشی برای حل یک مسئله است که در آن راه‌حل مسئله به راه‌حل هایی در نمونه های کوچکتر از همان مساله وابسته می باشد.
به نظر می‌رسد ترجمه «بازگشت» بیشتر مناسب کلمه انگلیسی Return باشد تا کلمه Recursion ؛ به همین دلیل بعضی از اساتید عبارت «توابع خوداتکاء» را برای نامیدن این‌گونه توابع به کار می‌برند.
همچنین از آنجایی که ریشهٔ این کلمه در زبان انگلیسی فعل Recur به معنای "اتفاق افتادن مجدد" می‌باشد ترجمه‌های مناسب دیگر می توانند "توابع بازوقوع" و "توابع بازفراخوانی شونده" باشند، که همگی قطعا بهتر از ترجمهٔ مشهور و ضعیف آن(توابع بازگشتی) می‌باشند.
به هر حال، نگرش خوداتکاء یا بازگشتی در علم کامپیوتر یک روش فکر کردن برای حل مسائل است. در واقع خوداتکایی یا بازگشت یکی از ایده‌های اصلی علم کامپیوتر است. حل یک مسئله به روش خوداتکاء/بازگشتی بدین معناست که راه حل بستگی به مدل کوچکتری از صورت مسئله داشته باشد.
"قدرت بازگشت قطعاً در این نهفته‌است که دسته‌ای نامتناهی از اشیا را بوسیلهٔ یک عبارت متناهی تعریف می‌کند. به معنای دیگر یک عدد نامتناهی در محاسبات می‌تواند بوسیلهٔ یک برنامهٔ متناهی بازگشتی تعریف شود حتی اگر این برنامه هیچ تکرار واضحی نداشته باشد ".
اکثر زبان‌های برنامه نویسی سطح بالا عمل بازگشت را به این صورت تعریف می‌کنند که یک تابع خودش را فراخوانی کند. زبان‌های دستوری ساختارهای حلقه‌ای مثل codice_1 یا codice_2 را برای انجام کارهای تکراری به کار می‌گیرند. بعضی از زبان‌های تابعی هیچ ساختار حلقه‌ای تعریف نمی‌کنند اما بر خود بازگشت تکیه دارند که کد را به‌طور مکرر فراخوانی کند. نظریهٔ رایانش‌پذیری ثابت کرده‌است که این زبان‌های فقط بازگشتی از نظر ریاضی برابر زبان‌های دستوری هستند، یعنی اینکه مسائل را بدون نیاز به codice_1 و codice_2 حل می‌کنند.
در ریاضیات کاربردی و به خصوص کامپیوتر، مسائل فراوانی وجود دارد که حل آن‌ها را به سادگی می‌توان به صورت یک الگوریتم بازگشتی نشان داد. یک الگوریتم بازگشتی مانند یک تابع یا یک دنباله بازگشتی تعریف می‌شود فرمان‌های الگوریتم به‌طور مکرر و با پارامترهای مختلف اجرا می‌شوند تا به فرمان بنیادی الگوریتم برسیم. آنگاه تمام مقادیری را که محاسبهٔ آن‌ها انجام نشده‌است را به صورت بازگشتی محاسبه می‌نماییم تا فرمان مورد نظر اجرا شود.
یک روش متداول برای آسان‌سازی مسائل این است که آن‌ها را به زیر مسائلی از همان نوع تقسیم بندی کنیم. این روش با نام گویشی کردن شناخته می‌شود. به عنوان یک تکنیک برنامه نویسی کامپیوتر، به این روش تقسیم و غلبه اطلاق می‌شود. و کلید راه حل تعداد زیادی از مسائل کامپیوتری مهم است و یک بخش اساسی می‌باشد.
تمام زبان‌های برنامه‌نویسی که امروز مورد استفاده‌اند تعریفی مستقیم از توابع بازگشتی در خود دارند. وقتی چنین تابعی فراخوانی می‌شود، کامپیوتر(برای اکثر زبان‌هایی که پشته دارند) یا خود کد زبان instanceهای مختلف تابع را (با فراخوانی پشته، هر چند روش‌های دیگر هم مورد استفاده قرار می‌گیرند). برعکس آن همهٔ توابع بازگشتی می‌توانند به کمک پشته به یک تابع غیر بازگشتی تبدیل شوند. اکثر توابع و روش‌هایی که می‌توانند بوسیلهٔ کامپیوتر ارزشیابی شوند بدون استفاده از غیر بازگشتی کردن قابل بازگشتی شدن هستند.
بعضاً الگوریتم‌های بازگشتی را می‌توان به کمک زبان‌های برنامه‌نویسی پیاده‌سازی کرد که به این برنامه‌ها برنامه‌های بازگشتی اطلاق می‌شود. مانند الگوریتم‌های مرتب سازی، فاکتوریل، یافتن ب.م.م، و ... . در زیر به چند نمونه از برنامه‌های بازگشتی معروف اشاره می‌کنیم:
یک مثال متداول برای برنامه‌های بازگشتی، محاسبهٔ فاکتوریل برای اعداد طبیعی است:
این تابع می‌تواند به شکل یک رابطه‌ی بازگشتی نیز نوشته شود:
این الگوریتم هم مانند الگوریتم‌های دیگر به صورت غیر بازگشتی هم نوشته می‌شود.
یکی دیگر از الگوریتم‌های بازگشتی متداول الگوریتم فیبوناچی است.
" تابع بازگشتی فیبوناچی: "
و می‌توان این تابع را با رابطهٔ بازگشتی زیر نشان داد:
الگوریتم اقلیدس که بزرگترین مقسوم‌علیه مشترک (ب.م.م) دو عدد را محاسبه می‌کند، می‌تواند به صورت بازگشتی نوشته شود. تابع به شکل زیر تعریف می‌شود:
رابطهٔ بازگشتی ب.م.م به شکل زیر تعریف می‌شود، در این رابطه منظور از formula_8، مقدار باقیمانده‌ی حاصل از formula_9 است:
در محوطه معبدی در آسیای دور سه میله الماسی قرار داشت که یکی از آن‌ها حاوی تعدادی قرص طلایی بود. کاهنان معبد در تلاش بودند تا قرص‌های طلائی را از آن میله به یکی دیگر از میله‌ها تحت شرایطی انتقال دهند، و باور داشتند که با تمام شدن انتقال قرص‌ها عمر جهان نیز به پایان خواهد رسید! میله اولیه ۶۴ قرص داشت، که بر روی هم به‌طور نزولی بر اساس اندازه‌شان چیده شده‌بودند.
هدف ما ارائه الگوریتمی است که کمترین توالی حرکت‌ها را برای انتقال دیسک‌ها به ما بدهد. مثلاً اگر n=۲ باشد، توالی حرکت به صورت زیر است:
n - ۱ دیسک بالایی را با شرایط ذکر شده و به کمک میله C به میله B منتقل می‌کنیم. بزرگترین دیسک را از میله مبدأ به میله مقصد حرکت می‌دهیم. n - ۱ دیسک را که هم‌اکنون در میله B هستند با شرایط داده شده به میله مقصد انتقال می‌دهیم. می‌بینیم که توانستیم عملیات جابجا کردن n دیسک را به دو عملیات مشابه ولی با اندازه کمتر و یک عملیات ساده تقسیم کنیم. واضح است که جابجا کردن n - ۱ قرص راحتتر از جابجا نمودن n قرص است.
"تابع بازگشتی برج‌های هانوی":
"رابطهٔ بازگشتی برای هانوی":
هر چند برای تمام توابع بازگشتی راه حل روشنی نمی‌توان یافت اما برج‌های هانوی از این قاعده مستثنی است:
در اصطلاح کامپیوتری، ساختمان داده به روشهایی از ذخیره اطلاعات گفته می‌شود که برای استفاده بهینه از اطلاعات ذخیره شده اتخاذ می‌شود. غالباً انتخاب یک ساختمان داده موجب ایجاد الگوریتم‌های متناسب با آن خواهد شد که این دو در کنار هم موجب افزایش سرعت انجام یک وظیفه یا کاهش مصرف حافظه برای پردازش داده می‌شود؛ سنگ بنای ساختمان‌های داده انواع داده و اشاره گرهای گوناگون است. که با توجه به چگونگی تعریف کاربرد آن‌ها در هر زبان برنامه نویسی پیاده‌سازی آن‌ها متفاوت خواهد بود.
در زیر می‌توانید تعریف ساده‌ای از گرهٔ فهرستهای پیوندی را مشاهده کنید. عنصر بعدی در ساختار گره اشاره گری است به یک ساختار گره.
// LIST is simply a synonym for struct node * (aka syntactic sugar).
typedef struct node *LIST;
رویه‌هایی که لیست ساختمان داده را به وجود می‌آورند می‌توانند به صورت بازگشتی هم تعریف شوند.
void printList(LIST lst)
در زیر می‌توانید تعریف ساده‌ای از درخت‌های دودویی را مشاهده کنید. همانند گره‌ها برای لیست‌های الحاقی در اینجا نیز تعریف به صورت بازگشتی است. در اینجا دو اشاره‌گر داریم، یکی به زیر درخت سمت چپ و دیگری به زیر درخت سمت راست.
// TREE is simply a synonym for struct node * (aka syntactic sugar).
typedef struct node *TREE;
void printTree(TREE t) {
دربارهٔ اینکه کدامیک سریعتر و بهینه تر است نمی‌توان نظر قطعی داد و بستگی به خود الگوریتم و دفعات اجرای آن دارد. اما در هر حال هر کدام برتری‌ها و کاستی‌های نسبت به دیگری دارد و در موارد خاصی الگوریتم‌ها فقط با یکی از این روش قابل پیاده سازی‌اند.
ترتیب فراخوانی توابع تأثیر به سزایی در اجرای برنامه دارد. به مثال زیر که با زبان C نوشته است، توجه کنید.
void recursiveFunction(int num) {
بازگشت مستقیم زمانی است که تابع خود را فراخوانی کند. بازگشت غیرمستقیم زمانی است که به‌طور مثال تابع «الف» تابع «ب» و تابع «ب« تابع «ث« و تابع «ث» نیز دوباره تابع «الف» را فراخوانی کند.
در علم رایانه، ساختمان داده درخت قرمز-سیاه بلوک، یک نوع درخت جستجوی دودویی خود-متوازن است. این ساختمان داده را ابتدا رودولف بایر در سال ۱۹۷۲ با نام «درخت دودویی B متقارن» ابداع کرد ولی نام جدید آن از پایان‌نامهٔ لیو.جی.گیباس و رابرت سجویک گرفته شده‌است. این ساختمان داده بسیار پیچیده است با این حال اعمال مربوط به آن حتی در بدترین حالت نیز زمان اجرای خوبی دارند، در واقع زمان جستجو، حذف، و درج برای این درخت مانند درخت AVL لگاریتمی است (formula_1 که formula_2 تعداد گره‌های موجود در درخت است). مزیت عمده این ساختمان داده نسبت به درخت AVL این است که اعمال درج و حذف با تنها یک بار پیمایش درخت از بالا به پایین و تغییر رنگ گره‌ها انجام می‌شوند و در نتیجه پیاده‌سازی این درخت از درخت AVL ساده‌تر است.
درخت قرمز-سیاه یک درخت جستجوی دودویی است که ویژگی‌های زیر را دارد:
ویژگی‌های بالا موجب این خصوصیت مهم درخت‌های قرمز-سیاه می‌شوند:
ویژگی فوق باعث می‌شود تا درخت‌های قرمز-سیاه کارایی مناسبی در اعمال جستجو، درج، و حذف داشته باشند.همچنین به خاطر این که در تمام مسیرهای از ریشه به برگ، تعداد گره‌های سیاه برابر است (ویژگی ۴) و ممکن نیست دو گره قرمز پشت سر هم قرار بگیرند (ویژگی ۳)، در این نوع درخت‌ها طول بلندترین مسیر از ریشه تا برگ هیچ وقت بزرگتر از دو برابر طول کوتاه‌ترین مسیر ریشه تا برگ نمی‌شود.
با توجه به ویژگی‌های بالا درخت‌های قرمز-سیاه (بر خلاف درخت‌های جستجوی دودویی معمولی) هیچ وقت دچار عدم توازن شدید نمی‌شوند و زمان اجرای لگاریتمی اعمال در این درخت‌ها تضمین شده‌است.
یک درخت قرمز-سیاه ار نظر ساختار شبیه یک درخت بی مرتبه ۴ است که در آن هر گره می‌تواند ۱ تا ۳ مقدار و همچنین ۲ تا ۴ اشاره گر به فرزندانش داشته باشد. در هر درخت بی، هر گره تنها یک مقدار دارد که برابر مقدار گره سیاه در درخت قرمز-سیاه است، و یک مقدار دلخواه دارد که و/یا بعد از آن در همان گره آمده‌است، که هر دوی آن‌ها مساوی گره قرمز در درخت قرمز-سیاه هستند.
یک راه دیدن این برابری این است که در گره‌های قرمز درخت قرمز-سیاه در یک نمایش گرافیکی به سمت بالا حرکت کنیم، به‌طوری‌که با پدر سیاهشان در یک ردیف قرار بگیرند و یک دسته افقی را تشکیل دهند. در درخت بی، یا در نمایش گرافیکی تغییر یافته درخت قرمز-سیاه که گفته شد، همه برگ‌ها عمق یکسانی دارند.
در این حالت درخت قرمز-سیاه، از نظر ساختار با درخت بی مرتبه ۴ برابر است که حداقل میزان پرشدن در یک دسته برابر ۳۳٪ است.
این نوع درخت بی، عمومی تر از درخت قرمز-سیاه است اما هنگام تبدیل به درخت قرمز-سیاه، ابهاماتی دارد چون از یک درخت بی مرتبه ۴، چندین درخت قرمز-سیاه ساخته می‌شود. اگر یک دسته در درخت بی تنها ۱ مقدار را شامل شود، این مقدار کمینه است، گره مربوطه سیاه است و دو اشاره گر به فرزندانش دارد. اگر یک دسته شامل ۳ مقدار شود، مقدار وسطی در یک گره سیاه قرار می‌گیرد و گره‌های کناری آن باید قرمز باشند. اگر دسته شامل ۲ مقدار باشد، هر کدام از آن‌ها می‌تواند در درخت قرمز-سیاه، سیاه باشد و دیگری باید قرمز باشد؛ بنابراین درخت بی مرتبه ۴، مشخص نمی‌کند که کدامیک از مقادیر در هر دسته ریشه سیاه کل آن دسته و پدر بقیه مقادیر دسته است. با وجود این، عملیات در درخت‌های قرمز-سیاه از نظر زمان بهینه تر هستند چون نیازی به نگهداشتن برداری از مقادیر نیست. این نگهداری زمانی که مقادیر مستقیماً در هر گره ذخیره شده‌اند، نسبت به وقتی که تنها مرجع آن‌ها نگهداری شده‌است، پر هزینه است. البته گره‌های درخت بی از نظر حافظه به صرفه تر هستند چون لازم نیست برای آن‌ها صفت رنگ نگهداری شود. در عوض باید مشخص شود کدام بخش از دسته استفاده شده‌است.
می‌توان شباهت‌هایی با درخت‌های بی مرتبه‌های بالاتری که از نظر ساختار شبیه درخت دودویی رنگ شده باشند هم ایجاد کرد چون تنها به رنگ‌های بیشتری نیاز است. مثلاً فرض کنید آبی را هم استفاده کنیم. در نتیجه درخت آبی-قرمز-سیاه مثل درخت قرمز-سیاه تعریف می‌شود اما با این محدودیت اضافه که دو گره متوالی از نظر مقدار نباید آبی باشند و همه گره‌های آبی باید فرزندان گره قرمز باشند. چنین درختی معادل یک درخت بی می‌شود که دسته‌های آن حداکثر ۷ مقدار و با این رنگ‌ها دارند :آبی، قرمز، آبی، سیاه، آبی، قرمز، آبی (هر گروه حداکثر ۱ گره سیاه، ۲ گره قرمز و ۴ گره آبی دارد).
برای تعدیل کردن حجم مقادیر، درج و حذف در یک درخت دودویی سریعتر از درخت‌های بی است چون درخت‌های رنگ شده تلاشی برای بیشینه کردن مقدار پر شدن در یک دسته افقی از گره‌ها نمی‌کنند. (تنها کمینه مقدار پرشدن در درخت‌های دودویی رنگ شده تضمین شده‌است). چرخش در درخت‌های بی سریع تر است (چون چرخش‌ها اغلب در دسته یکسان رخ می‌دهند به جای اینکه در چند گره مجزا در یک درخت دودویی رنگ شده انجام شوند). با این وجود برای مرتب‌سازی حجم زیادی از داده‌ها، درخت‌های بی بسیار سریعتر هستند چون با گروهی کردن چند فرزند در یک دسته و امکان دسترسی محلی، فشرده تر شده‌اند.
همه بهینه‌سازی‌های ممکن در درخت‌های بی برای افزایش متوسط میزان پرشدن گروه‌ها در درخت‌های دودویی رنگ شده هم ممکن است. بیشینه کردن میزان پرشدن در یک درخت بی، مانند کم کردن ارتفاع درخت چند رنگ است که با افزایش تعداد گره‌های غیر سیاه انجام می‌شود. بدترین حالت زمانی رخ می‌دهد که همه گره‌ها در یک درخت دودویی رنگ شده، سیاه باشند. بهترین حالت زمانی است که تنها یک سوم آن‌ها سیاه باشند (و دو سوم بقیه، قرمز باشند).
درخت‌های قرمز-سیاه، ضمانتی برای بدترین حالت زمان درج، حذف و جستجو می‌دهند. این نکته نه تنها باعث ارزشمندی آن‌ها در کاربردهایی که زمان برای آن‌ها حیاتی است مانند real-time application شده‌است بلکه آن‌ها را سازنده باارزش بلوک‌ها در سایر ساختمان داده‌های استفاده شده در هندسه محاسباتی که ضمانت بدترین زمان اجرا دارند، کرده‌است.
درخت متوازن ساختار دیگری است که جستجو، درج و حذف را در زمان اجرای O(log "n")پشتیبانی می‌کند. این درخت بیشتر از درخت قرمز-سیاه مرتب شده‌است که منجر به درج و حذف آهسته‌تر اما بازیابی سریعتر می‌شود.
درخت‌های قرمز-سیاه به ویژه در برنامه‌نویسی تابعی ارزشمند هستند که یکی از رایج‌ترین انواعساختار پایدار داده‌های استفاده شده برای ساختن آرایه‌های اشتراکی و مجموعه‌ها است. نسخه پایدار درخت‌های قرمز-سیاه علاوه بر زمان، نیازمند فضایی به اندازه O(log "n") برای هر درج یا حذف است.
درخت‌های قرمز-سیاه یک ایزومتری از درخت‌های ۲–۴ هستند. به عبارت دیگر، برای هر درخت ۲–۴، یک درخت قرمز-سیاه همتا که عناصر داده‌ای آن از همان مرتبه است، وجود دارد. عملیات درج و حذف در درخت‌های ۲–۴ هم معادل تغییر رنگ و چرخش در درخت‌های قرمز-سیاه هستند. این باعث می‌شود درخت‌های ۲–۴ ابزار مهمی برای درک منطق درخت‌های قرمز-سیاه باشند؛ و این همان دلیلی است که بسیاری از متن‌های معرفی الگوریتم‌ها، درخت‌های ۲–۴ را قبل از درخت‌های قرمز-سیاه معرفی می‌کنند باوجود اینکه درخت‌های ۲–۴ معمولاً در عمل استفاده نمی‌شوند.
در سال ۲۰۰۸، رابرت سجویک یک نسخه ساده‌تر از درخت‌های قرمز-سیاه را معرفی کرد که Left-Leaning Red-Black Trees نامیده شد که با حذف کردن درجه آزادی نا مشخص در پیاده‌سازی به وجود آمده بود. LLRB یک ویژگی اضافه دارد که همه رئوس قرمز باید هنگام درج‌ها و حذف‌ها در سمت چپ درخت قرار بگیرند. درخت‌های قرمز-سیاه می‌توانند برای هر مجموعه‌ای از عملیات، به درخت‌های ۲–۳ یا درخت‌های ۲–۴ ایزومتریک باشند. درخت ۲–۴ ایزومتری در سال ۱۹۸۷ توسط سجویک معرفی شد. با درخت‌های ۲–۴، ایزومتری با یک «تغییر رنگ» حل شده است که در آن رنگ قرمز هر دو گره فرزند، به پدر منتقل می‌شود.
عملگرهای فقط خواندنی نسبت به درخت‌های دودویی ساده نیاز به تغییر ندارند چراکه یک حالت خاص از آن‌ها می‌باشند ولی حذف و اضافهٔ معمولی می‌تواند تأثیراتی از قبیل خارج شدن از شروط اولیهٔ درخت‌های قرمز- سیاه داشته باشد که برای بازگردانی آن ویژگی‌ها نیاز به تغییر رنگ و چرخش درخت دارد. اگرچه این نوع حذف واضافه پیچیدگی بسیاری دارد ولی بازهم نرخ جستجوی آن همچنان
(O(logn می‌باشد.
اضافه کردن به وسیلهٔ پیاده‌سازی انجام شده در درخت‌های دودویی و رنگ آمیزی آن‌ها با رنگ قرمز انجام می‌شود. اتفاقی که بعداً می‌افتد بستگی به شیوهٔ رنگ آمیزی گره‌های مجاور بستگی دارد عبارت گره عمو به برادر گره والد اشاره دارد، همانند آنچه که در روابط خانوادگی مطرح است. توجه به موارد زیر لازم است:
توجه کنید: برچسب‌های N برای گره اضافه شده، P برای والد گره اضافه شده،G برای پدربزرگ گره اضافه شده و U برای عموی گره اضافه شده مورد استفاده می‌شود.
هر مثال شامل شرحی در زیان سی++ می‌باشد:
class RBT{
BinaryNode * grandParent(BinaryNode *n){
if((n!=null) &&( n->parent!=null))
BinaryNode * uncle(BinaryNode *n){
BinaryNode *g=grandparent(n);
if(n->pareant==g->left)
حالت ۱ :گره جدید N ریشهٔ درخت باشد. در این حالت با تغییر رنگ به سیاه (بخاطر ویژگی ریشه باید سیاه باشد) و در هر مسیر باید یگ گره سیاه وجود داشته باشد اعتبار درخت را حفظ می‌کند.
void insert_case1(BinaryNode *n){
if(n->parent==null)
حالت ۲:
اگر گره والد سیاه باشد هیج کدام از دو ویژگی (هردو فرزند قرمز، سیاه هستند و تعداد راه‌های از هر مسیر به برگ دارای تعداد یکسان گره سیاه دارند) مورد تهدید واقع نمی‌شوند ولی فقط وجود دوگره قرمز اعتبار درخت را زیر سؤال می‌برد (حالت ۳).
void insert_case2(BinaryNode *n){
if(n->parent->col==Black)
حالت ۳:اگر هردو گره والد و عمو قرمز باشد، هردو به رنگ سیاه در می‌آیند و پدر آن‌ها قرمز در می‌آید. (برابر ویژگی ۴). گره قرمز جدید دارای والد سیاه است. تا آن زمان که هر راه از والد /عمو که به‌طور قطع از پدر بزرگ نیز عبور می‌کند همچنان معتبر می‌باشد. با این وجود G(پدر والد و عمو و پدربزرگ N) باید بررسی شود که آیا ریشه‌است یا خیر (تا به رنگ سیاه درآید (ویژگی ۲) این کار را می‌توان با یک متد بازگشتی انجام داد. حتی می‌توان آن را به صورت یک حلقه نوشت که البته ثابت می‌شود این حلقه دارای تعداد مشخصی انجام عملیات چرخش است.
void insert_case3(BinaryNode *n){
if((u!=null)&& )u->col==Red){
}else
حالت ۴:اگر والد (p) قرمز باشد ولی عمو سیاه باشد همچنان گره جدید سمت راست p است و p فرزند سمت چپ G است. در این حالت، یک دوران به چپ که نقش گره جدید N را با والدش؛ P تغییر می‌دهد، قابلیت اجرا پیدا می‌کند که در آن والد قبلی با فرزندش جابجا می‌شود سپس والد قبلی که اکنون دوباره برچسب‌گذاری شده با ویژگی همه مسیرها دارای تعدا مساوی گره سیاه هستند؛ سر و کار دارد. چون بر طبق ویژگی ۴ (هر دو فرزند گره قرمز سیاه هستند) همچنان مورد تهدید بی اعتبارشدن درخت همراه است. دوران باعث می‌گردد تا در بعضی از مسیرها (از جمله مسیری که از زیر درخت برچسب‌گذاری شدهٔ ۱)عبور می‌نماید از گره جدیدی که قبلاً مطرح نبوده‌است، عبور می‌کند ولی چون این گره مانند گره قبلی قرمز است، ویژگی ۴ با دوران اعتبار درخت را از بین نمی‌برد.
void insert_case4(BinaryNode *n){
}else if((n== n->parent->left) && (n->parent ==g->right)){
حالت ۵:والد قرمز است ولی عمو سیاه می‌باشد و گره جدید N فرزند چپ والد P است و P فرزند چپ پدربزرگ(G)است. در این حالت رو ی پدر بزرگ(g) دوران به راست اجرا می‌گردد. درختی که نتیجه می‌شود دارای والد ی به نام P برای هردو گره G و N است .G، به عنوان ریشه، سیاه است و این تا آن زمان که فرزندش قرمز باشد پابرجاست. با تغییر رینگ P و G درخت نهایی حاصل می‌گردد که همهٔ ویژگی‌های فوق از جمله تعداد مساوی گره سیاه در هر مسیر (به این شکل که تمامی مسیرهایی که از این سه گره عبور می‌کند که قبلاً از G عبور می‌کرده و اکنون از P عبور می‌کند) پابرجاست.
void insert_case5(BinaryNode *n)
ابها شهری است کوهستانی در کشور پادشاهی عربستان سعودی واقع در شبه جزیره عربستان. این شهر مرکز فرمانداری استان عسیر است. شهر ابها در قلهٔ کوه جبال سروات قرار دارد و در أقصی جنوب غربی مملکت عربستان سعودی واقع شده‌است و بنام "عروس الجنوب" (عروس جنوب) مشهور است.
این شهر از سمت‌های شمال و مشرق به استان خمیس مشیط و از سمت شمال غربی به استان النماص و از جهت غرب و جنوب غربی به استان محایل و رجال المع محدود می‌گردد.
در سنگ نبشته‌ها و در بعضی کتب تاریخی و همچنین از گفتار پژوهشگران آمده‌است که این شهر را در دوران قدیم «ابقا» می‌نامیده‌اند و یکی از نقاط تحت نفوذ مکملت سبا بوده‌است و از همین‌جا قافلهٔ شتر هدایایه ملکهٔ بلقیس ملکهٔ مملکت سبا به سوی سلیمان پیامبر برده شده‌است. در این شهر صدها ابنیه و قلعه‌های تاریخی وجود دارد که خود شاهد بر قدمت دیرینهٔ این شهر است. همچنین شهر ابها یکی از قدیمی‌ترین مکان تجمع مردم و ساکنان منطقهٔ جبال السراة و سهول تهامه بوده‌است و یکی از مشهورترین بازارهای آن دوران در این شهر قرار داشته که هنوز آثار آن باقی مانده‌است.
مساحت ابها در حدود ۵۰۰۰ هکتار و ارتفاعش از سطح دریا در حدود ۲۲۰۰ متر است. منطقهٔ ابها مانند حوضچه‌ای می‌ماند؛ چنان‌که از بیشتر جهات کوه آن را احاطه نموده‌است. منتها از سمت شمال و شمال شرقی انخفاض کوه مشاهده می‌شود که استان خمیس مشیط واقع شده‌است.
ابها از لحاظ آب دمای هوا در زمستان سرد و تابستان معتدل است. حراره در تابستان معتدل و از ۳۰ درجه سانتیگراد تجاوز نمی‌کند اما در زمستان حراره به ۵ درجه سانتیگراد و حتی در بعضی نقاط مانند السوده تا صفر و زیر صفر نیز می‌رسد. در ابها بادهای موسمی که منشأ آن اقیانوس هند است و باد دیگر که به نام «غربی» نزد مردم مشهور است و منشأ آن دریای سرخ است، ظاهر شده و باران می‌آورد. در فصل زمستان در ابها میزان بارندگی افزایش می‌یابد.
جمعیت ابها و مراکز توابع آن در حدود ۶۰۰۰۰ نفر می‌باشد؛ بیشتر آنان در شهر ابها زندگی می‌کنند اما بقیه در مراکز تابعه که شامل پنج مرکز به شرح زیر است، می‌باشند:
این مراکز پنجگانه شامل ۴۲۷ روستا می‌باشند که از پیروان اهل سنت و از شاخه حنبلی هستند. بیشتر مردم کوه‌نشین و روستاها به کشاورزی و دامداری و دامپروری اشتغال دارند و تعدادی نیز در ادارات دولتی مشغول به کار هستند. در تعطیلان آخر هفته و همچنین تعطیلات اعیاد، بیشتر مردم از شهر بیرون می‌روند و در دامنهٔ کوهای تهامه و جبال السرات تعطیلی خودشان را می‌گذرانند.
مرتب‌سازی لانه‌کبوتری: (Pigeonhole sort) و به آن مرتب‌سازی شمارش (count sort) هم گفته می‌شود (و با مرتب‌سازی شمارشیcounting sort متفاوت است) یک الگوریتم از درجه (O(n+N است که n تعداد اعدادی است که باید مرتب شوند و N ارزشهای ممکن برای اعداد است.
الگوریتم این مرتب‌سازی به صورت زیر است:
۱. یک آرایه از لانه‌های کبوتر ایجاد کنید، هر لانه کبوتر نشانه یک ارزش در بازه کلیدهای موجود است
۲.آرایه اصلی (آرایه‌ای که می‌خواهد مرتب شود) را مرور کنید و هر شیء را در لانه کبوتر مربوط به آن جای دهید
۳. تکرار به ترتیب بر روی آرایه لانه‌های کبوتر، و عقب بردن عنصرها ی لانه‌های کبوتر غیر خالی در آرایه اصلی
یک شبه کد ساده از الگوریتم:
function pigeonhole_sort(array a[n])
array b[N]
zero_var (b) (* zero out array b *)
for i in [0...length(a)-1]
b[a]:= b[a[i]]+1
[I](* copy the results back to a *)
j:= 0
for i in [0...length(b)-1]
repeat b[i] times
a[j]:= i
j:= j+1
این الگوریتم به این صورت کار می‌کند که ابتدا مینیمم و ماکزیمم اعدادی که در آرایه به ما داده شده‌اند را پیدا می‌کند. سپس یک آرایهٔ کمکی ایجاد می‌کند با این هدف که سایز این آرایهٔ جدید به تعداد تمام اعداد ممکن بین مینیمم و ماکزیمم اعداد باشد. در این آرایه می‌خواهیم در واقع فراوانی هر عدد را نگه داریم و سپس از ابتدای این آرایه شروع کنیم و به تعداد فراوانی هر خانه عدد مربوط به آن خانه را چاپ کنیم. مثال زیر این مطلب را روشن تر می‌کند:
T ۲ ۳ ۱ ۲ ۱ ۳ ۲ ۱ ۴
U: ۰ ۰ ۰ ۰
۱ ۱ ۱ ۲ ۲ ۲ ۳ ۳ ۴
کد جاوای مرتب‌سازی لانه کبوتری به صورت زیر است که نحوهٔ کار آن مطابق با توضیحات ذکر شده در بالا است:
public static void pigeonhole_sort(int[] a)
الکساندر ریچارد "الکس" لودویگ (زادهٔ ۷ مه ۱۹۹۲ در ونکوور) یک بازیگر کانادایی است. او با بازی در نقش "ویل استنتن" در فیلم "" که نخستین فیلم از سه‌گانه‌ای بر پایه رمان‌های سوزان کوپر بود، بیشتر شناخته شد. او در سریال "وایکینگ‌ها" نیز نقش بیورن یارنسیدا را ایفا کرده‌است. لودویگ در سال ۲۰۰۹ در فیلم "مسابقه تا کوه جادوگران" به بازی پرداخت. از دیگر فیلم‌های او می‌توان به "بازی‌های گرسنگی"، و "پسران بد تا ابد" اشاره کرد.
لودویگ در ۱۹۹۲ونکوور، بریتیش کلمبیا به دنیا آمد. او دو خواهر و یک برادر دارد که از همه آن‌ها بزرگتر است. پدر او "هرالد" یک تاجر و مادرش "شارلین" یک بازیگر پیشین است.
فیلم‌های سینمایی که لودویگ در آن‌ها بازی کرده‌است:
لودویگ افزون بر این، در چند فیلم ویدئویی و تلویزیونی دیگر نیز بازی کرده‌است.
در نظریهُ گراف یک فهرست مجاورت نمایش همهٔ یال‌های یک گراف به صورت مجموعه‌ای از فهرست‌هاست، اگر گراف بدون جهت باشد، هر واحد از این فهرست‌ها یک مجموعه از دو گره شامل دو سر یال مربوطه است.
نمایش فهرست مجاورت یک گراف (G=(V,E شامل یک آرایه‌ی Adj از |V| فهرست است، یعنی به ازای هر رأس در V یک فهرست. برای
هر رأس u در مجموعه رأس‌های V، فهرستِ مجاورت [Adj[u شامل همهٔ رأس‌های v است به طوری که یال (u,v) در E وجود داشته باشد. به عبارتی دیگر،
[Adj[u دربردارندهٔ همهٔ رأس‌هایی است که یک یال از u به آن‌ها در گراف G وجود دارد. این رأس‌ها در فهرست مجاورت با ترتیبی دلخواه چیده
شده‌اند. شکل 1.b نمایش فهرست مجاورتِ گراف بدون جهتِ نشان داده شده در شکل 1.a است. مشابهاً شکل 2.b نمایش فهرست مجاورت گرافِ جهت‌دار نشان
داده شده در شکل 2.a است.
اگر G یک گراف جهت‌دار باشد، مجموع طول‌های همه‌ی فهرست‌های مجاورت برابر با |E| است، چرا که یالی به شکل (u,v) با ظاهر شدنِ v در[Adj[u
نمایش داده می‌شود. اما اگر G بدون جهت باشد، مجموع طول‌های همه‌ی فهرست‌های مجاورت برابر با «دوبرابرِ» |E|است، چرا که یالی بدون جهت به شکل
(u,v) با ظاهر شدنِ v در [Adj[u و u در [Adj[v نمایش داده می‌شود.
برای هر دو حالت (جهت دار و بدون جهت)، فهرست مجاورت ویژگی مطلوبی دارد و آن اینکه حافظهٔ مورد نیاز آن(Ѳ(V+E است.
یک اشکال عمدهٔ فهرست‌های مجاورت این است که راه سریع تری برای اینکه بدانیم یال داده شدهٔ (u,v) در گراف هست یا نه، وجود ندارد جزاینکه
در فهرست [Adj[u به دنبال v بگردیم. این اشکال می‌تواند با استفاده از نمایش ماتریس مجاورت گراف اصلاح شود اما به
هزینهٔ استفاده از حافظهٔ بیشتر!
یک گراف در علوم رایانه، داده‌ساختاری انتزاعی است که به صورت گراف جهت دار و بدون جهت پیاده‌سازی می‌شود و. هدفش به کارگیریِ مفهوم گراف از ریاضیات و به خصوص نظریه گراف است.
یک داده ساختار گراف اساساً از یک مجموعهٔ متناهیِ زوج‌های مرتب موسوم به یال شامل واحدهایی به نام رأس یا گره تشکیل می‌شود؛ همان‌طور که در ریاضیات به ازای یک یال (u,v) می‌گوییم که u به v می‌رود یا u و v مجاورند. همچنین می‌توان به هر یال یک گراف یک عدد نسبت داد که در این صورت گراف وزن دار به وجود می‌آید.
عملیات ابتدایی ارائه شده توسط یک ساختار داده گراف G معمولاً شامل:
در گراف وزن دار دستورهای زیر نیز وجود دارد:
ساختار داده‌های مختلفی برای نمایش گراف‌ها در عمل استفاده می‌شود:
راس‌ها به عنوان سوابق یا اشیا ذخیره می‌شوند و هر رأس لیستی از رأس‌های مجاور را ذخیره می‌کند. این ساختار داده‌ها اجازه ذخیره‌سازی داده‌های اضافی در رأس‌ها را می‌دهد. داده‌های اضافی را می‌توان ذخیره کرد اگر یال‌ها نیز به عنوان اشیا ذخیره شوند، در این صورت هر رأس یال‌های حادث بر خود را ذخیره می‌کند و هر یال رأس حاد خود را ذخیره می‌کند.
یک ماتریس دو بعدی، که در آن ردیف‌ها نشان دهنده رأس مبدأ و ستون‌ها نشان دهنده راس مقصد هستند. داده‌ها در یال‌ها و رأس‌ها باید در خارج از ماتریس ذخیره شوند. فقط هزینه یک یال می‌تواند بین هر جفت رأس ذخیره شود.
یک ماتریس بولی دو بعدی، که در آن ردیف‌ها نشان دهنده رأس‌ها و ستون هانشان دهنده یال‌ها هستند. ورودی‌ها نشان می‌دهند که آیا رأس یک ردیف به یال یک ستون متصل است یا خیر.
جدول زیر، هزینه پیچیدگی زمانی را برای انجام عملیات مختلف در گراف‌ها، برای هر یک از این نمایش‌ها، | V | نشان دهنده تعداد رأس‌ها و | E | تعداد لبه هاست.
هر سه راه قابل اجرا برای گراف جهت دار و بدون جهت است. نمایش لیست مجاورت معمولاً ترجیح داده می‌شود چرا که یک روش فشرده برای نمایش گراف‌های کم یال فراهم می‌کند. اگر گراف متراکم یا همان پر یال باشد، نمایشِ ماتریس مجاورت مقدم است. همچنین در مواقعی که نیاز داریم سریعاً بدانیم که آیا به ازای دو رأس داده شده
یال متصل‌کنندهٔ بینشان وجود دارد یا خیر، از لیست مجاورت استفاده می‌کنیم.
طبقه‌بندی انواع دوگان گراف دوگان گراف‌هایی که تاکنون در علوم مختلف تعریف و استفاده شده‌اند، بر اساس نحوه استخراج به دو گروه بر مبنای گراف اولیه و مفهومی تقسیم‌بندی شده‌اند. در ادامه وجه تسمیه و مشخصات آن‌ها شرح داده شده‌اند.