فهرست موضوعی برگرفته از trekhleb را مرور کن. هر صفحه حالا یک درس کامل دوزبانه است: توضیح ساده، مراحل اجرا، Complexity، کد JavaScript خوانا، نکات مصاحبه، اشتباهات رایج و مسیر ادامه مطالعه.
لیست پیوندی دادهها را داخل Node نگه میدارد. هر Node علاوه بر مقدار، یک اشارهگر به Node بعدی دارد؛ بنابراین عناصر لازم نیست مثل Array پشت سر هم قرار بگیرند.
لیست پیوندی دوطرفه یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
Queue یا صف یک ساختمان داده FIFO است؛ یعنی اولین دادهای که وارد میشود، اولین دادهای است که خارج میشود.
Stack یا پشته یک ساختمان داده LIFO است؛ یعنی آخرین چیزی که وارد میشود، اولین چیزی است که خارج میشود.
صف دو سر یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
Hash Table با استفاده از تابع Hash، یک key را به محل ذخیرهسازی یا bucket تبدیل میکند و هدفش lookup، insertion و deletion بسیار سریع در حالت متوسط است.
Heap یک درخت کامل است که معمولاً داخل Array ذخیره میشود. در Min-Heap کوچکترین مقدار در ریشه و در Max-Heap بزرگترین مقدار در ریشه قرار میگیرد.
Priority Queue داده را بر اساس اولویت خارج میکند، نه لزوماً بر اساس زمان ورود. معمولاً با Heap پیادهسازی میشود.
درخت Trie یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
درخت یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
در Binary Search Tree مقدارهای کوچکتر در زیردرخت چپ و مقدارهای بزرگتر در زیردرخت راست قرار میگیرند؛ بنابراین درخت متعادل اجازه میدهد جستوجو هر بار فقط یک شاخه را ادامه دهد.
AVL یک BST خودمتعادلشونده است که اختلاف ارتفاع زیردرخت چپ و راست هر Node را حداکثر 1 نگه میدارد و با Rotation تعادل را برمیگرداند.
درخت Red-Black یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
درخت Segment یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
درخت Fenwick / BIT یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
گراف یک ساختمان داده از دسته ساختمان داده است. این ساختمان داده، مقادیر و ارتباط بین آنها را طوری سازماندهی میکند که عملیات مهم هزینه قابلپیشبینی داشته باشند.
Disjoint Set یا Union-Find مجموعهای از گروههای جدا از هم را نگه میدارد و دو عملیات اصلی دارد: find برای پیدا کردن نماینده گروه و union برای ادغام دو گروه.
Bloom Filter یک ساختار احتمالاتی کمحافظه برای بررسی عضویت است. میتواند بگوید «قطعاً وجود ندارد» یا «احتمالاً وجود دارد»؛ پس false positive ممکن است ولی در مدل استاندارد false negative نداریم.
LRU Cache وقتی ظرفیت پر شود آیتمی را حذف میکند که از همه بیشتر زمان است استفاده نشده. طراحی کلاسیک O(1) از Hash Map + Doubly Linked List استفاده میکند.
عملیات بیتی یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
اعداد ممیز شناور دودویی یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
فاکتوریل n یا n! حاصلضرب اعداد 1 تا n است و طبق تعریف 0! برابر 1 است.
در دنباله Fibonacci هر عدد از جمع دو عدد قبلی ساخته میشود؛ معمولاً دنباله با 0 و 1 شروع میشود.
عوامل اول یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
آزمون اول بودن یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
الگوریتم اقلیدس GCD را با تکرار تبدیل (a,b) به (b, a mod b) پیدا میکند تا remainder صفر شود.
کمترین مضرب مشترک یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
غربال اراتستن همه اعداد اول تا n را با علامتزدن مضربهای اعداد اول بهعنوان composite پیدا میکند.
تشخیص توان دو یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
مثلث پاسکال یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
اعداد مختلط یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
تبدیل رادیان و درجه یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
توانرسانی سریع یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
روش هورنر یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
ماتریسها یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
فاصله اقلیدسی یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
افراز عدد صحیح یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
ریشه دوم با روش نیوتن یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
الگوریتم π لیو هویی یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
تبدیل فوریه گسسته یک الگوریتم از دسته ریاضیات است. این الگوریتم ریاضی یک خاصیت، فرمول یا recurrence را به یک فرایند محاسباتی مشخص تبدیل میکند.
حاصلضرب دکارتی یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
درهمریزی Fisher–Yates یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
مجموعه توانی یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
جایگشتها یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
ترکیبها یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
LCS طولانیترین زیرتوالیای را پیدا میکند که در هر دو ورودی با همان ترتیب نسبی وجود دارد، ولی لازم نیست عناصر پشتسرهم باشند.
طولانیترین زیرتوالی صعودی یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
کوتاهترین ابرتوالی مشترک یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
در 0/1 Knapsack هر آیتم weight و value دارد و حداکثر یک بار انتخاب میشود. هدف بیشینه کردن value بدون عبور از ظرفیت است.
Maximum Subarray بهدنبال یک بخش پیوسته با بیشترین مجموع است و الگوریتم Kadane آن را در O(n) حل میکند.
مجموع ترکیبی یک الگوریتم از دسته مجموعهها و برنامهنویسی پویا است. این مسئله معمولاً با زیرمسئلههای کوچکتر و stateهای تکرارشونده یا با تولید کنترلشده ترکیبها قابل حل است.
فاصله همینگ یک الگوریتم از دسته رشتهها است. این الگوریتم رشتهای روی characterها، prefix/suffix یا state تطبیق/ویرایش کار میکند و تلاش میکند مقایسههای تکراری را کم کند.
Palindrome رشته یا دنبالهای است که بعد از normalization تعریفشده در مسئله، از چپ و راست یکسان خوانده میشود.
Levenshtein Distance حداقل تعداد insert، delete و substitute تککاراکتری برای تبدیل یک رشته به رشته دیگر است.
الگوریتم KMP یک الگوریتم از دسته رشتهها است. این الگوریتم رشتهای روی characterها، prefix/suffix یا state تطبیق/ویرایش کار میکند و تلاش میکند مقایسههای تکراری را کم کند.
الگوریتم Z یک الگوریتم از دسته رشتهها است. این الگوریتم رشتهای روی characterها، prefix/suffix یا state تطبیق/ویرایش کار میکند و تلاش میکند مقایسههای تکراری را کم کند.
الگوریتم Rabin–Karp یک الگوریتم از دسته رشتهها است. این الگوریتم رشتهای روی characterها، prefix/suffix یا state تطبیق/ویرایش کار میکند و تلاش میکند مقایسههای تکراری را کم کند.
طولانیترین زیررشته مشترک یک الگوریتم از دسته رشتهها است. این الگوریتم رشتهای روی characterها، prefix/suffix یا state تطبیق/ویرایش کار میکند و تلاش میکند مقایسههای تکراری را کم کند.
تطبیق عبارت منظم یک الگوریتم از دسته رشتهها است. این الگوریتم رشتهای روی characterها، prefix/suffix یا state تطبیق/ویرایش کار میکند و تلاش میکند مقایسههای تکراری را کم کند.
Linear Search عناصر را یکییکی بررسی میکند تا target پیدا شود یا به انتهای مجموعه برسیم.
جستوجوی پرشی یک الگوریتم از دسته جستوجو است. این الگوریتم فضای جستوجو را پیمایش یا محدود میکند تا target پیدا شود یا نبودنش ثابت شود.
Binary Search در یک فضای مرتبشده با هر مقایسه نصف محدوده باقیمانده را حذف میکند تا به target برسد.
جستوجوی درونیابی یک الگوریتم از دسته جستوجو است. این الگوریتم فضای جستوجو را پیمایش یا محدود میکند تا target پیدا شود یا نبودنش ثابت شود.
Bubble Sort جفتهای مجاور را مقایسه میکند و اگر ترتیب اشتباه باشد swap میکند؛ در هر دور مقدارهای بزرگتر به سمت انتهای Array حرکت میکنند.
مرتبسازی انتخابی یک الگوریتم از دسته مرتبسازی است. این الگوریتم مرتبسازی دادهها را با یک استراتژی مشخص مقایسه یا توزیع، به ترتیب موردنظر میچیند.
Insertion Sort یک بخش مرتب در ابتدای Array میسازد. هر بار مقدار بعدی را برمیدارد و عناصر بزرگتر را به راست میبرد تا جای درست برای مقدار جدید باز شود.
مرتبسازی Heap یک الگوریتم از دسته مرتبسازی است. این الگوریتم مرتبسازی دادهها را با یک استراتژی مشخص مقایسه یا توزیع، به ترتیب موردنظر میچیند.
Merge Sort از Divide and Conquer استفاده میکند: Array را تا بخشهای کوچک تقسیم میکند و سپس بخشهای مرتب را دوباره merge میکند.
Quicksort یک pivot انتخاب میکند، عناصر را نسبت به pivot partition میکند و سپس بخشهای ایجادشده را بازگشتی مرتب میکند.
مرتبسازی Shell یک الگوریتم از دسته مرتبسازی است. این الگوریتم مرتبسازی دادهها را با یک استراتژی مشخص مقایسه یا توزیع، به ترتیب موردنظر میچیند.
Counting Sort بهجای مقایسه عناصر، تعداد تکرار هر key را میشمارد و بعد خروجی را بر اساس همین شمارشها میسازد.
مرتبسازی مبنایی یک الگوریتم از دسته مرتبسازی است. این الگوریتم مرتبسازی دادهها را با یک استراتژی مشخص مقایسه یا توزیع، به ترتیب موردنظر میچیند.
مرتبسازی سطلی یک الگوریتم از دسته مرتبسازی است. این الگوریتم مرتبسازی دادهها را با یک استراتژی مشخص مقایسه یا توزیع، به ترتیب موردنظر میچیند.
پیمایش مستقیم یک الگوریتم از دسته لیستهای پیوندی است. این الگوریتم Linked List بهجای index از referenceها عبور میکند؛ بنابراین ترتیب تغییر pointer/reference مهمترین بخش correctness است.
پیمایش معکوس یک الگوریتم از دسته لیستهای پیوندی است. این الگوریتم Linked List بهجای index از referenceها عبور میکند؛ بنابراین ترتیب تغییر pointer/reference مهمترین بخش correctness است.
DFS روی درخت یک الگوریتم از دسته درختها است. این پیمایش درخت Nodeها را با یک ترتیب مشخص و بر اساس رابطه parent/child بازدید میکند.
BFS روی درخت یک الگوریتم از دسته درختها است. این پیمایش درخت Nodeها را با یک ترتیب مشخص و بر اساس رابطه parent/child بازدید میکند.
DFS یک مسیر را تا جای ممکن عمیق ادامه میدهد و سپس backtrack میکند. میتوان آن را recursive یا با Stack پیادهسازی کرد.
BFS گراف را level-by-level با Queue پیمایش میکند و در گراف بدون وزن shortest path از نظر تعداد edge را پیدا میکند.
Kruskal یک Minimum Spanning Tree میسازد: edgeها را بر اساس weight مرتب میکند و هر بار ارزانترین edgeای را میگیرد که cycle نسازد.
Dijkstra کوتاهترین مسیر از یک مبدأ را در گراف با edgeهای وزن غیرمنفی پیدا میکند؛ هر بار Node حلنشده با کمترین distance فعلی انتخاب و relax میشود.
Bellman–Ford کوتاهترین مسیر از یک مبدأ را حتی با edgeهای وزن منفی پیدا میکند و میتواند negative cycle قابلدسترسی را تشخیص دهد.
Floyd–Warshall با Dynamic Programming کوتاهترین مسیر بین تمام جفت Nodeها را محاسبه میکند و مرحلهبهمرحله Nodeهای میانی مجاز را اضافه میکند.
تشخیص دور در گراف یک الگوریتم از دسته گرافها است. این الگوریتم روی Nodeها و Edgeهای گراف کار میکند و معمولاً به representation مثل adjacency list/matrix و stateهایی مثل visited، distance، parent یا indegree نیاز دارد.
Prim یک Minimum Spanning Tree را از یک Node شروع میکند و هر بار ارزانترین edgeای را اضافه میکند که tree فعلی را به یک Node جدید وصل کند.
Topological Sort برای DAG یک ترتیب خطی میسازد که در هر edge جهتدار u→v، ابتدا u و بعد v قرار میگیرد.
نقاط برشی یک الگوریتم از دسته گرافها است. این الگوریتم روی Nodeها و Edgeهای گراف کار میکند و معمولاً به representation مثل adjacency list/matrix و stateهایی مثل visited، distance، parent یا indegree نیاز دارد.
پلها در گراف یک الگوریتم از دسته گرافها است. این الگوریتم روی Nodeها و Edgeهای گراف کار میکند و معمولاً به representation مثل adjacency list/matrix و stateهایی مثل visited، distance، parent یا indegree نیاز دارد.
مسیر و دور اویلری یک الگوریتم از دسته گرافها است. این الگوریتم روی Nodeها و Edgeهای گراف کار میکند و معمولاً به representation مثل adjacency list/matrix و stateهایی مثل visited، distance، parent یا indegree نیاز دارد.
دور همیلتونی یک الگوریتم از دسته گرافها است. این الگوریتم روی Nodeها و Edgeهای گراف کار میکند و معمولاً به representation مثل adjacency list/matrix و stateهایی مثل visited، distance، parent یا indegree نیاز دارد.
Kosaraju مولفههای قویاً همبند گراف جهتدار را با دو مرحله DFS و گراف transpose پیدا میکند.
مسئله فروشنده دورهگرد یک الگوریتم از دسته گرافها است. این الگوریتم روی Nodeها و Edgeهای گراف کار میکند و معمولاً به representation مثل adjacency list/matrix و stateهایی مثل visited، distance، parent یا indegree نیاز دارد.
هش چندجملهای یک الگوریتم از دسته رمزنگاری است. این cipher/hash آموزشی یک transformation روی کاراکترها یا state عددی نشان میدهد. برای یادگیری مفید است ولی بسیاری از cipherهای کلاسیک برای سیستم واقعی امن نیستند.
رمز Rail Fence یک الگوریتم از دسته رمزنگاری است. این cipher/hash آموزشی یک transformation روی کاراکترها یا state عددی نشان میدهد. برای یادگیری مفید است ولی بسیاری از cipherهای کلاسیک برای سیستم واقعی امن نیستند.
رمز سزار یک الگوریتم از دسته رمزنگاری است. این cipher/hash آموزشی یک transformation روی کاراکترها یا state عددی نشان میدهد. برای یادگیری مفید است ولی بسیاری از cipherهای کلاسیک برای سیستم واقعی امن نیستند.
رمز Hill یک الگوریتم از دسته رمزنگاری است. این cipher/hash آموزشی یک transformation روی کاراکترها یا state عددی نشان میدهد. برای یادگیری مفید است ولی بسیاری از cipherهای کلاسیک برای سیستم واقعی امن نیستند.
NanoNeuron یک الگوریتم از دسته یادگیری ماشین است. این الگوریتم یادگیری از داده برای ساخت یک rule، grouping یا prediction استفاده میکند و معمولاً بر distance، objective یا model ساده تکیه دارد.
k-NN یک الگوریتم از دسته یادگیری ماشین است. این الگوریتم یادگیری از داده برای ساخت یک rule، grouping یا prediction استفاده میکند و معمولاً بر distance، objective یا model ساده تکیه دارد.
k-Means یک الگوریتم از دسته یادگیری ماشین است. این الگوریتم یادگیری از داده برای ساخت یک rule، grouping یا prediction استفاده میکند و معمولاً بر distance، objective یا model ساده تکیه دارد.
Seam Carving / تغییر اندازه محتوامحور یک الگوریتم از دسته پردازش تصویر است. Seam Carving تصویر را با حذف/اضافه کردن مسیرهای کمانرژی resize میکند، نه با scale یکنواخت همه pixelها.
انتخاب تصادفی وزندار یک الگوریتم از دسته آمار است. این روش آماری weightها را به احتمال تبدیل میکند و نمونهگیری را متناسب با همان احتمال انجام میدهد.
الگوریتم ژنتیک یک الگوریتم از دسته الگوریتمهای تکاملی است. Genetic Algorithm فضای بزرگ جوابها را با population، fitness، selection، crossover و mutation جستوجو میکند.
برج هانوی یک الگوریتم از دسته مسائل کلاسیک است. این مسئله کلاسیک مصاحبه بیشتر درباره تشخیص pattern درست مثل Two Pointer، Stack، Greedy، DP یا Backtracking است، نه حفظ یک کد خاص.
چرخش ماتریس مربعی یک الگوریتم از دسته مسائل کلاسیک است. این مسئله کلاسیک مصاحبه بیشتر درباره تشخیص pattern درست مثل Two Pointer، Stack، Greedy، DP یا Backtracking است، نه حفظ یک کد خاص.
بازی پرش یک الگوریتم از دسته مسائل کلاسیک است. این مسئله کلاسیک مصاحبه بیشتر درباره تشخیص pattern درست مثل Two Pointer، Stack، Greedy، DP یا Backtracking است، نه حفظ یک کد خاص.
مسیرهای یکتا یک الگوریتم از دسته مسائل کلاسیک است. این مسئله کلاسیک مصاحبه بیشتر درباره تشخیص pattern درست مثل Two Pointer، Stack، Greedy، DP یا Backtracking است، نه حفظ یک کد خاص.
Trapping Rain Water مقدار آبی را میخواهد که بین ستونها جمع میشود. ارتفاع آب روی index i به کمینه بلندترین ستون چپ و راست آن محدود است.
پلههای بازگشتی یک الگوریتم از دسته مسائل کلاسیک است. این مسئله کلاسیک مصاحبه بیشتر درباره تشخیص pattern درست مثل Two Pointer، Stack، Greedy، DP یا Backtracking است، نه حفظ یک کد خاص.
در نسخه یکتراکنشی Stock، یک بار Array را پیمایش میکنیم، کمترین قیمت دیدهشده را نگه میداریم و سود فروش در قیمت فعلی را با best profit مقایسه میکنیم.
Valid Parentheses بررسی میکند هر bracket باز با نوع درست و در ترتیب nesting صحیح بسته شود. Stack دقیقاً این رفتار تو در تو را مدل میکند.
N-Queens باید N وزیر را روی صفحه N×N قرار دهد بهطوریکه هیچ دو وزیری در یک row، column یا diagonal نباشند. Backtracking انتخابها را امتحان میکند و بهمحض conflict مسیر را قطع میکند.
مسیر اسب یک الگوریتم از دسته مسائل کلاسیک است. این مسئله کلاسیک مصاحبه بیشتر درباره تشخیص pattern درست مثل Two Pointer، Stack، Greedy، DP یا Backtracking است، نه حفظ یک کد خاص.