پایینترین جد مشترک
در نظریه گراف و علوم کامپیوتر پایینترین جد مشترک (LCA) دو گره v و w در یک درخت پایینترین (یعنی عمیق ترین) گره است که هر دو v و w به عنوان فرزندان آن گره باشند . LCA دو راس v و w در درخت T جد مشترکی از v و w که در فاصله دورتری از ریشه واقع شدهاست . محاسبه پایینترین جد مشترک ممکن است مفید باشد به عنوان مثال به عنوان بخشی از یک روش برای تعیین فاصله بین جفت از گرهها در یک درخت: فاصله از v به w را میتوان جمع فاصله از ریشه به v و فاصله از ریشه به w منهای دو برابر فاصله از ریشه به پایینترین جد مشترک (Djidjev, Pantziou & Zaroliagis 1991) در نظر گرفت . در هستی شناسی, پایینترین جد مشترک به عنوان least common subsumer نیز مشهور است .
الگوریتم
[ویرایش]فرض کنید میخواهیم پایینترین جد مشترک دو راس v و w را پیدا کنیم . ابتدا با استفاده از الگوریتم جستجوی عمق اول پدر گره v را در ذخیره می کنیم . این الگوریتم از است .
سادهترین راه این است که ابتدا دو گره را هم ارتفاع کنیم سپس تا زمانی که دو گره برابر نشدند هر دو را بالا بیاوریم از آن رو که ریشه جد مشترک آن هاست ، این فرایند پایان پذیر است و گره ای که در آن متوقف می شویم همان پایینترین جد مشترک است . این الگوریتم با فرض داشتن پدر هر گره به عنوان پیش پردازش ، هر درخواست را در جواب میدهد .
راه بهتر استفاده از برنامه ریزی پویا است .
را گره بالای گره v در نظر می گیریم .
- به ازای هر v و i = 0 مقدار است .
- به ازای مقدار است .
این کار به عنوان پیش پردازش برای پاسخ دادن به درخواست هاست و از است .
حال می خواهیم پایینترین جد مشترک w و v را بیابیم .
ابتدا گره ای که در ارتفاع بیشتری قرار دارد با با دیگری هم ارتفاع می کنیم .
حال فرض می کنیم فاصله این دو گره از پایینترین جد مشترکشان ، حداکثر k بیتی است .
از پر ارزشترین بیت شروع می کنیم و مقدار بیتها را تعیین می کنیم .
فرض کنید روی بیت i ام هستیم :
اگر امین گره بالای v و w یکسان بود این بیت ۰ و در غیر این صورت این بیت ۱ است و هر دو گره به گره بالاتر منتقل میشوند .
در انتها پدر هر یک از دو گره ، پایینترین جد مشترک v و w اولیه است .
این الگوریتم از است .
کد الگوریتم
[ویرایش]کاربرد ها
[ویرایش]این مسئله در یافتن پایینترین جد مشترک کلاسها در وراثت (برنامهنویسی شیءگرا) و سامانه پیچیده کاربرد دارد .