زمان شروع و پایان گرهها در پیمایش عمقاول
تعریف
زمان ورود یا شروع (Starting Time) و خروج یا پایان (Finishing Time) را به ترتیب اینگونه تعریف میکنند: اولین زمان دیده شدن رأس و آخرین زمان دیده شدن رأس. یعنی زمانی که برای اولین بار وارد یک رأس میشویم و آن را علامت گذاری میکنیم را زمان ورود و آخرین زمانی که از رأس خارج میشویم و تمام همسایههایش دیده شده است و در حال بازگشت به راس پدر هستیم را زمان خروج میگیریم. یعنی فرض کنید شمارندهی $C$ داشته باشیم که مقدار آن در ابتدا برابر یک باشد و با هر ورود و خروج از هر رأسی در طول پیمایش، یک واحد به مقدار آن افزوده شود. زمان شروع یک رأس در پیمایش را مقدار $C$ در زمان ورود به آن و زمان پایان رأس را مقدار $C$ در زمان خروج از آن در نظر میگیریم. پس اگر بخواهیم با رنگها این دو زمان را معادل کنیم، زمان خاکستری شدن برابر زمان شروع و زمان سیاه شدن برابر زمان خروج است. دقت کنید در اینجا منظور از درخت، درخت جستوجوی عمقاول است.
در زیر سه لم در مورد این زمانها آوردهایم که اثبات دو لم اول راحت است و لم سوم نیز با استفاده از این دولم ثابت میشود.
- لم: زمان شروع رأس $v$ کمتر از $u$ است اگر و تنها اگر $v$ جد $u$ باشد یا در درخت ریشهدار قبل از $u$ آمده باشد.
- لم: زمان خاتمه رأس $v$ کمتر از $u$ است اگر و تنها اگر $u$ جد $v$ باشد یا در درخت ریشهدار قبل از $u$ آمده باشد.
- لم: اگر زمان شروع رأس $v$ کمتر از $u$ و زمان پایان رأس $u$ کمتر از $v$ باشد، آنگاه $v$ جد $u$ است.
پس یکی از خواص این درخت و این الگوریتم این است که هنگام خروج از یک رأس میدانیم پیمایش تمام رئوس زیر درخت آن نیز تمام شده است. در نتیجه اگر همراه با این پیمایش مقادیری را حساب کنیم، با توجه به مقادیر حساب شده برای بچههای این رأس، میتوانیم مقادیری را برای این راس نیز محاسبه کنیم. به همین دلیل این ساختار برای استفاده از برنامهریزی پویا مناسب است.
الگوریتم
فرض کنید بر روی درخت $T$ پیمایش عمقاول را اجرا کنیم. در این پیمایش بازگشتی در زمان ورود به رأس $x$ مقدار $s[x]$ را برابر $C$ و در حین پایان کار الگوریتم بر روی رأس $x$، مقدار $f[x]$ را برابر با $C$ قرار میدهیم.
به مقادیر $s[x], f[x]$ به ترتیب زمان شروع و زمان پایان رأس $x$ میگوئیم.
خواص
- راس $u$ جزء اجداد راس $v$ است اگر و تنها $s[u] \le s[v]$ و $f[v] \le f[u]$. یعنی پیمایش عمقاول به راس $u$ قبل از راس $v$ وارد شده باشد و از راس $v$ قبل از راس $u$ خارج شده باشد.
- رئوس زیردرخت هر راس $u$ تمام رئوسی هستند که زمان شروع آنها در بازه $\left [ s[u], f[u]\right ]$ باشد. برعکس این قضیه هم درست است.
کاربردها
- تبدیل درخت به آرایه برای استفاده از دادهساختار برای پرسمانهای محدودهای (روش RMQ)
مسائل نمونه
- سوال عملی دورهی تابستان ۲۴ [سطح: ساده]