المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


آموزش:الگوریتم‌های تکمیلی:تجزیه‌ی سبک-سنگین درخت‌ها

تجزیه سبک-سنگین درخت‌ها

تجزیه یک درخت ریشه‌دار به مسیر‌های مجزای سبک و سنگین،‌ روشی است که راه‌حل‌های بهینه‌ای برای حل بعضی مسائل درخت‌ها ارائه می‌دهد.

تعریف

تجزیه سبک-سنگین درخت $T = (V, E)$ رنگ‌آمیزی‌ای از یال‌‌های درخت با رنگ‌های سبک و سنگین است. برای تعیین رنگ یال $e$،‌ سری از آن که به ریشه نزدیک تر است را $v$ و دیگری را $u$ بنامید. رنگ $e$ سنگین است اگر و فقط اگر اندازه زیر‌درخت $u$ بزرگتر از نصف اندازه زیر‌درخت $v$ باشد.

خواص

اندازه زیردرخت $v$ را $size(v)$ می‌نامیم. فرض کنید راس $v$ دو فرزند $u$ و $w$ دارد که یال‌های $v-u$ و $v-w$ سنگین است. پس داریم:
$size(u) + size(w) > 1/2 size(v) + 1/2 size(v) = size(v)$
این متناقض است که با دانسته ما که می‌دانیم:
$size(u) + size(w) + 1 <= size(v)$
در نتیجه هر راس حداکثر یک یال سنگین دارد که به فرزندانش می‌رود.

در ضمن حداکثر دو یال هر راس می‌تواند سنگین باشد، یک یال به فرزند و یک یال به پدر. حال زیرگرافی از $T$ را در نظر بگیرید که تمام یال‌های سبک از آن حذف شده‌اند. حال تمام مولفه‌های همبند مسیر‌ند(که می‌توانند راس‌های تنها نیز باشند) و هر دو راس مجاور اختلاف ارتفاع یک دارند. در نتیجه یال‌های سنگین و راس‌هایی که روی آن‌ها واقع شده‌اند، درخت را به مسیر‌های مجزایی تقسیم می‌کنند که هر کدام قسمتی از مسیر ریشه به یک برگ است.

حال فرض کنید درختی N راس دارد. اگر از ریشه با یال سبکی پایین رویم، اندازه زیردرخت راسی که روی آن هستیم حداکثر برابر $ٔN/2$ است. اگر باز این کار را ادامه دهیم به زیر‌درختی به اندازه $N/4$ می‌رسیم. اگر این کار را ادامه دهیم مشاهده می‌کنیم که تعداد یال‌های سبک هر مسیر از ریشه به برگ حداکثر $lgN$ یال سبک خواهد داشت.

ساخت و ساز

مسیر‌ها به کمک شبه‌کد زیر بدست می‌آیند.

def getPath(node):
    if node is a leaf:
        return [node]
    for each subtree S:
        if S is not the largest subtree:
            allPaths.append(getPath(S))
    for each subtree S:
        if S is the largest subtree:
            return getPath(S).append(node)

حال تمام مسیر‌ها به کمک این خط بدست می‌آیند.

allPaths.append(getPath(root))

دقت کنید که با این روش ساخت‌ و ساز هر یال سنگین است اگر و تنها اگر دو راس آن در یک مسیر باشند. این روش یال‌های سنگین بیشتری ایجاد می‌کند(نسبت به یال‌هایی که بر اساس تعریف نیاز است).


ابزار صفحه