الگوریتم مؤلفه قوی مبتنی بر مسیر: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
ماني (بحث | مشارکت‌ها)
جز ماني صفحهٔ Path-based strong component algorithm را به الگوریتم گابو منتقل کرد
ماني (بحث | مشارکت‌ها)
بدون خلاصۀ ویرایش
خط ۱:
در [[نظریه گراف]] برای پیدا کردن [[مولفه‌های قویا همبند]] یک [[گراف جهت‌دار]] می‌توانمی‌توان از [[الگوریتمPath-basedالگوریتم strongجهت‌دار component]]مولفه قوی استفاده کرد. قبل از این الگوریتم، [[الگوریتم کساراجو]] و [[الگوریتم تارجان]] نیز به همین منظور ارایه شده است.
'''الگوریتم Path-based strong component'''
 
در [[نظریه گراف]] برای پیدا کردن [[مولفه‌های قویا همبند]] یک [[گراف جهت‌دار]] می‌توان از [[الگوریتمPath-based strong component]] استفاده کرد. قبل از این الگوریتم، [[الگوریتم کساراجو]] و [[الگوریتم تارجان]] نیز به همین منظور ارایه شده است.
 
== مفاهیم ==
* گراف قویا همبند
به گراف جهت‌داری گویند که هر جفت راس آن از یکدیگر قابل دسترس باشد.
مانند شکل زیر:
[[پرونده:Strong graphhh.jpeg|بندانگشتی|وسط|400px |گراف قویا همبند]]
* مولفه قویا همبند:
مولفه قویا همبند یک گراف به بیشینه زیرمجموعه‌ای از راس هاراس‌ها گویند که قویا همبند هستند.
یعنی از هر جفت راس در آن مجموعه به یکدیگر مسیر مستقیم وجود دارد. مانند شکل زیر:
[[پرونده:Scc.png|بندانگشتی|وسط|400px|مولفه هایمولفه‌های قویا همبند]]
 
== الگوریتم ==
فرض کنید گراف G داده شده است. در این الگوریتم رأس‌هایرأس‌های گراف را از 1۱ تا n و مولفه‌هایمولفه‌های قویا همبند را با شروع از n+1۱ شماره‌گذاریشماره‌گذاری می‌کنیممی‌کنیم. همچنین در این الگوریتم گراف H را که در ابتدا همان گراف G می‌باشدمی‌باشد در نظر می‌گیریممی‌گیریم و در این گراف مسیر P را به صورت زیر می‌سازیممی‌سازیم:
ابتدا یک رأس دلخواه از گراف را در نظر می‌گیریممی‌گیریم و از این رأس در جهت کاملا دلخواه حرکت می‌کنیممی‌کنیم تا یکی از دو حالت زیر رخ دهد:
* اگر به رأسی رسیدیم که قبلا در مسیر P وجود داشت، تمام گره‌هایگره‌های بین این رأس که تا کنون پیموده شده است را هم در گراف H و هم در مسیر p منقبض می‌کنیممی‌کنیم. یعنی همه آن هاآن‌ها را به عنوان یک رأس در نظر می‌گیریممی‌گیریم.
* اگر به رأسی رسیدیم که دیگر نتوانستیم مسیر P را ادامه دهیم، گره آخر مسیر P را هم در گراف H وهم در مسیر P حذف کرده و آن را به عنوان یک مولفه قویا همبند معرفی می‌کنیممی‌کنیم.
 
این الگوریتم از الگوریتم [[جستجوی عمق اول]] و همچنین دو [[پشته]] برای نمایش مسیر P استفاده می‌کندمی‌کند. پشته S که شامل دنباله رأس‌هایرأس‌های مسیر P است و پشته B که شامل کران‌هایکران‌های رأس‌هایرأس‌های منقبض شده است. در این الگوریتم آرایه I نیز وجود دارد که هم اندیس پشته S را و هم شماره مولفه قویا همبند را ذخیره می‌کندمی‌کند. به عبارت دقیق تر این ارایه به صورت زیر تعریف می‌شودمی‌شود:
* I[v]=0۰ هرگاه گره v در مسیر P نباشد.
* I[v]=j هرگاه گره v اکنون در مسیر P باشد و S[j]=v.
* I[v]=c هرگاه مولفه قویا همبند شامل v حذف شده و با عدد c شماره گذاری شده باشد.
 
این الگوریتم شامل قسمت اصلی STRONG و قسمت بازگشتی DFS است:
سطر ۲۹ ⟵ ۲۷:
 
'''Algorithm'''STRONG(G)
1۱ empty stacks S and B
2۲ '''for''' v ∈ V do I[v]=0۰
3۳ c=n
4۴ '''for''' v ∈ V do if I[v]=0۰ then DFS(v)
 
'''Algorithm'''DFS(G)
1۱ PUSH(v,S);I[v]=TOP(S);PUSH(I[v],B);/*add v to the end of P*/
2۲ '''for''' edges (v,w) ∈ E do
3۳ ''' if '''I[w]=0۰ then DFS(w)
4۴ '''else''' /*contract if necessary*/
5۵ '''while''' I[w]<B[TOP(B)] do POP(B)
6۶ '''if ''' I[v]=B[TOP(B)''' then'''{/*number vertices of the next strong component*/
7۷ POP(B);increase c by 1
8۸ '''while''' I[v]≤TOP(S) do I[POP(S)]=c}
{{پایان چپ‌چین}}
 
سطر ۴۹ ⟵ ۴۶:
 
=== قضیه ===
هنگامی که (STRONG(G متوقف شود هر رأس v ∈ V به مولفه قویا همبندی که توسط [I[v شماره گذاری شده است تعلق دارد. همچنین زمان و حافظه مصرفی (O(m+n می&zwnj;باشندمی‌باشند.
 
برای اثبات قضیه فوق می&zwnj;توانیدمی‌توانید به [1۱] مراجعه کنید.
 
== الگوریتم&zwnj;هایالگوریتم‌های مرتبط ==
برای دیدن الگوریتم&zwnj;هایالگوریتم‌های مرتبط با این الگوریتم میتوانیدمی‌توانید به [[الگوریتم کساراجو]] و [[Tarjan'sالگوریتم stronglyمولفه‌های connectedهمبند componentsقوی algorithmتارجان]] مراجعه کنید.
 
==الگوریتم گابو==
'''الگوریتم چریَن- ملورن/ گابو''' در [[نظریه گراف]]، یک روش با [[پیچیدگی زمانی]] خطی برای یافتن مولفه‌های همبندی قوی در یک [[گراف جهتدار]] است<ref>{{citation
| last = Sedgewick | first = R.
| contribution = 19.8 Strong Components in Digraphs
| edition = 3rd
| location = Cambridge MA
| pages = 205–216
| publisher = Addison-Wesley
| title = Algorithms in Java, Part 5 – Graph Algorithms
year = 2004}}</ref>
. این الگوریتم در سال ۱۹۹۶ توسط جوزف چِریَن و{{سخ}}کورت ملورن<ref>{{citation
| last1 = Cheriyan | first1 = J.
| last2 = Mehlhorn | first2 = K. | author2-link = Kurt Mehlhorn
| doi = 10.1007/BF01940880
| journal = [[Algorithmica]]
| pages = 521–549
| title = Algorithms for dense graphs and networks on the random access computer
| volume = 15
| year = 1996}}</ref> ارائه شد و در سال 1999 توسط هارولد گابو<ref>{{citation
| last = Gabow | first = H.N.
| contribution = Searching (Ch 10.1)
| editor1-last = Gross | editor1-first = J. L.
| editor2-last = Yellen | editor2-first = J.
| pages = 953–984
| publisher = CRC Press
| title = Discrete Math. and its Applications: Handbook of Graph Theory
| volume = 25
| year = 2003}}</ref> بهبود یافت.{{سخ}}
الگوریتم گابو همانند الگوریتم مولفه‌های همبند قوی تارجان، تنها یک [[جستجوی عمق اول]] در گراف داده شده انجام می‌دهد،
و از یک [[پشته]] برای نگهداری گره‌هایی که{{سخ}}به مولفه‌ای اختصاص داده نشده‌اند استفاده می‌کند، و بعد از اختصاص دادن آخرین گره به مولفه همبندی، این گره‌ها را به یک مولفهٔ جدید منتقل می‌کند.{{سخ}}الگوریتم تارجان از یک آرایه با اندیس گره‌ها شامل اعداد پیش‌ترتیب استفاده می‌کند، که به ترتیب دیده شدن در جستجوی عمق اول مقداردهی شده‌اند.{{سخ}}از آرایهٔ پیش‌ترتیبی برای دانستن اینکه چه زمانی مولفهٔ همبندی جدید ایجا شود استفاده می‌گردد. الگوریتم گابو به جای استفاده از آرایه، از پشتهٔ دیگری به این منظور استفاده می‌کند.
 
== الگوریتم گابو ==
 
الگوریتم گابو با پشتیبانی دو پشتهٔ S و P یک جستجوی عمق اول بر روی گراف داده شدهٔ G انجام می‌دهد. پشتهٔ S تمامی گره‌هایی را تاکنون به یک مولفهٔ همبندی قوی{{سخ}}
اختصاص داده نشده‌اند، شامل می‌شود. گره‌ها در این پشته به ترتیبی که جستجوی عمق اول به آن می‌رسد قرار دارند. پشتهٔ P شامل گره‌هایی است که هنوز اختصاص آن‌ها به
مولفه‌های همبندی{{سخ}}قوی متفاوت از هم، تعیین نشده است. همچنین در الگوریتم از یک شمارندهٔ C که تعداد گره‌های مشاهده شده تاکنون است، برای محاسبهٔ اعداد پیش‌ترتیب گره‌ها استفاده می‌شود.{{سخ}}
 
هنگامی که جستجوی عمق اول به یک گره v می‌رسد، الگوریتم مراحل زیر را به ترتیب انجام می‌دهد:
# عدد پیش‌ترتیب v را برابر C قرار می‌دهد، و مقدار C را یکی افزایش می‌دهد.
# گره v را در پشتهٔ S و همینطور P قرار می‌دهد.
# برای هر یال از گره v به گره مجاور w:
#* اگر عدد پیش‌ترتیب w هنوز مقدار‎دهی نشده، به طور بازگشتی جستجو را روی w انجام می‌دهد؛
#* در غیر اینصورت، اگر w هنوز به یک مولفهٔ همبندی قوی اختصاص داده نشده:
#** تا زمانی که عدد پیش‌ترتیب عنصر بالای پشته P، بزرگتر اکید عدد پیش‌ترتیب w است، عنصر بالای P را خارج می‌کند.
# اگر v عنصر بالای P بود:
#* عناصر بالای S را تا زمانی که v خارج شود، خارج کرده و این عناصر را به یک مولفهٔ همبندی اختصاص می‌دهد.
#* گره v را از P خارج می‌کند.
 
الگوریتم کلی شامل یک حلقه روی گره‌های گراف G است، که این جستجوی بازگشتی را برای گره‌هایی که هنوز عدد پیش‌ترتیب آن‌ها مقدار دهی نشده است، صدا می‌زند.
 
== منابع ==
{{پانویس}}
{{چپ‌چین}}
* [1۱]Path-based depth-first search for strong and biconnected components. Harold N. Gabow
{{پایان چپ‌چین}}
 
 
[[رده:الگوریتم‌ها]]
[[رده:الگوریتم‌های گراف]]
[[رده:همبندی گراف]]