گره سلطه گر
در گراف های جهت دار، زمانی میگوییم گره بر گره غلبه میکند که به ازای هر گره همه مسیر ها از به ، از گره عبور کند. در نتیجه میتوان گفت هر گره بر خودش غلبه میکند. با توجه به تعریف میتوان برای هر گره مجموعهای از گره های سلطه گر در نظر گرفت که بر این گره غلبه میکنند. همچنین میتوان برای هر گراف یک درخت سلطه گر تعریف کرد که به ازای هر گره در گراف، اجداد این گره در درخت، گره های سلطه گر بر این گره در گراف هستند.
- گره بر گره اکیداً غلبه میکند زمانی که گره بر گره غلبه کرده و باشد.
- گرههای سلطه گر آنی گره به مجموعه گرههایی می گویند که فقط بر گره به صورت اکید غلبه کرده و بر هیچ گره دیگری اکیداً غلبه نکند[1].
- گرههای سلطه گر مرزی گره به مجموعه گرههایی میگویند که گره بر والدهای مستقیم آنها غلبه کرده ولی به صورت اکید بر آن گرهها غلبه نکند.
بنابر تعریف میتوان برای سلطه گری اکید نتیجه گرفت که نزدیک گره سلطه گر اکید برای هر گره یکتا بوده و یک گره برای آن وجود دارد.
تاریخچه و کاربرد
تعریف گره سلطه گر یا غالب برای اولین بار توسط ریس پروسر در مقالهای تحت عنوان کاربردهای ماتریس بولی برای تحلیل نمودارهای جریان[2] ارائه شد. او در این مقاله الگوریتمی برای پیدا کردن گره های سلطه گر ارائه نکرد و صرفاً آن را تعریف کرده. اولین الگوریتم برای این مساله ده سال بعد توسط ادوارد لوری و مدلاک ارائه شد[3]. از کاربرد های آن میتوان به زمینه های بهینه سازی برنامه، تولید کد، تست مدار اشاره کرد. همچنین در کامپایلر ها از اطلاعات حاصل از سلطه گری گرهها استفاده زیادی میشود. برای مثال یک کاربرد آن در کامپایلر برای پیدا کردن حلقه ها در بهینه سازی کد به کمک بلوک های پایه است[4].
الگوریتم پیدا کردن گرههای سلطه گر
با توجه به تعریف برای هر گره اگر برابر با مجموعه گرههای سلطه گر بر گره در نظر بگیریم آنگاه رابطه زیر را خواهیم داشت.
در اینجا برابر است با مجموعه تمام گرههایی که وارد گره میشوند یعنی یک یال از سمت آنها به وجود دارد. همچنین برای گره شروع در گراف داریم
با داشتن این اطلاعات برای پیدا کردن گرههای سلطه گر هر گره در گراف میتوان الگوریتم زیر را پیاده سازی کرد.
// n0 : start node
for n in graph - {n0}:
Dom[n] = graph
changed = True
while changed:
changed = False
for n in graph:
new = []
for p in preds(n):
new = intersection(new, Dom[p])
new = new + [n]
if new != dom[n]:
dom[n] = new
changed = True
این الگوریتم در زمان اجرای تمام مجموعه های سلطه گر را مییابد که میتوان با استفاده از داده ساختار های خاص زمان اجرا را بهتر کرد[5]. الگوریتم دیگری توسط رابرت تارجان و توماس لینگوار ارائه شده که به وسیله الگوریتم جستجوی اول عمق (الگوریتم dfs) در زمان تقریباً خطی این کار را انجام میدهد[1].
الگوریتم پیدا کردن گرههای سلطه گر مرزی
با توجه به تعریف برای گره سلطه گر مرزی میتوان رابطه های زیر را بدست آورد.
که در اینجا همان مجموعه گرههای سلطه گر مرزی است و برابر مجموعه گرههایی است که بر آنها غلبه میکند و برابر است با . همچنین برای که یک مجموعه است داریم که اینجا برای گره برابر است مجموعه تمام گره هایی که از به آنها در گراف جهت دار مسیر وجود دارد. با این رابطه ها میتوان رابطه زیر را بدست آورد.
که در اینجا فرزندان در درخت سلطه گر اند. برابر است با تمام که بر آنها را به صورت اکید غلبه نمیکند. زیر مجموعهای از است که بر آنها به صورت اکید غلبه نمیکند. با توجه به این رابطه الگوریتم زیر بدست میآید[6].
def FindDF(v):
DF[v] = []
for w in children(v):
FindDF(w)
for u in DF[w]:
if not strictly_dom(v,u):
DF[v].append(u)
for w in succ(v):
if not strictly_dom(v,w):
DF[v].append(w)
منابع
- LengauerThomas; Endre, TarjanRobert (1979-01-01). "A fast algorithm for finding dominators in a flowgraph". ACM Transactions on Programming Languages and Systems (TOPLAS). doi:10.1145/357062.357071.
- "Applications of Boolean matrices to the analysis of flow diagrams | Papers presented at the December 1-3, 1959, eastern joint IRE-AIEE-ACM computer conference". dl.acm.org. doi:10.1145/1460299.1460314. Retrieved 2020-01-26.
- S, LowryEdward; W, MedlockC (1969-01-01). "Object code optimization". Communications of the ACM. doi:10.1145/362835.362838.
- Loukas Georgiadis, Robert E. Tarjan, Renato F. Werneck. «Finding Dominators in Practice» (PDF).
- Keith D. Cooper, Timothy J. Harvey, and Ken Kennedy. «A Simple, Fast Dominance Algorithm» (PDF).
- «Dominator Algorithms» (PDF).