مرتبسازی توپولوژیک
Topological SortingTopological Sort برای DAG یک ترتیب خطی میسازد که در هر edge جهتدار u→v، ابتدا u و بعد v قرار میگیرد.
اول این مفهوم را در ذهن نگه دار
Topological Sort برای DAG یک ترتیب خطی میسازد که در هر edge جهتدار u→v، ابتدا u و بعد v قرار میگیرد.
چطور کار میکند؟ ساده و مرحلهای
Kahn's Algorithm هر بار Node با indegree صفر را با Queue برمیدارد.
روش رایج دیگر DFS و قرار دادن Nodeها در postorder است.
الگوریتم را به شکل تصمیمهای پشت سر هم بخوان
مشخص کن گراف directed/undirected و weighted/unweighted است.
representation گراف را انتخاب کن.
state الگوریتم و حالت disconnected/cycle را صریح مدیریت کن.
یک ورودی خیلی کوچک را دستی اجرا کن و بعد از هر عملیات مهم state را بنویس. برای مرتبسازی توپولوژیک هدف این است که invariant را ببینی، نه اینکه کد را حفظ کنی.
function topoSort(graph) {
const indegree = new Map();
for (const u of Object.keys(graph)) {
indegree.set(u, indegree.get(u) ?? 0);
for (const v of graph[u]) indegree.set(v, (indegree.get(v) ?? 0) + 1);
}
const queue = [...indegree].filter(([, d]) => d === 0).map(([v]) => v);
const out = [];
for (let i = 0; i < queue.length; i++) {
const u = queue[i]; out.push(u);
for (const v of graph[u] ?? []) if (indegree.set(v, indegree.get(v) - 1).get(v) === 0) queue.push(v);
}
return out.length === indegree.size ? out : null;
}syntax را حفظ نکن. stateای را که در هر خط تغییر میکند دنبال کن و آن را به invariant توضیحدادهشده در بالا وصل کن.
O(V+E)
این Complexity را حفظی نگو. اول مشخص کن مربوط به کدام عملیات یا بعد ورودی است؛ بعد هزینه را از روی loopها، عمق recursion، عملیات ساختمان داده و فرضهای preprocessing نتیجه بگیر.
موارد مناسب
- فقط وقتی assumptionهای الگوریتم با مسئله گراف هماهنگ است از آن استفاده کن.
کجا معمولاً اشتباه میکنیم؟
- وجود cycle جهتدار یعنی topological order کامل نداریم.
- ممکن است چند ترتیب معتبر مختلف وجود داشته باشد.
مدل یک پاسخ حرفهای
مثال dependency scheduling بزن و بگو در Kahn اگر تعداد Nodeهای پردازششده کمتر از V باشد cycle داریم.
مرتبسازی توپولوژیک چه مسئلهای را حل میکند؟
Topological Sort برای DAG یک ترتیب خطی میسازد که در هر edge جهتدار u→v، ابتدا u و بعد v قرار میگیرد.
درباره Complexity چه چیزی باید بگویم؟
پیچیدگی معمول اینجا O(V+E) است، اما جواب کامل باید این هزینه را به representation، constraint ورودی و عملیات غالب وصل کند.
رایجترین اشتباه چیست؟
وجود cycle جهتدار یعنی topological order کامل نداریم.