H2-Advance

اینجا دریچه ای است برای نگاهی دیگر به المپیاد

H2-Advance

اینجا دریچه ای است برای نگاهی دیگر به المپیاد


کد هایی که این دفعه قراره یه جورایی توضیح بدیم عبارته از کوروسکال و پرایم ...

کد ها ...

کوروسکال : هدف این الگوریتم پیدا کردن یک درخت اِه که همه ی راس ها رو شامل بشه مجموع یال هاشَم مینیمم باشن ...

تو این الگوریتم اول یال ها رو sort می کنیم ...
بعدش با حرکت رو یال ها اونایی رو که دور ایجاد نمی کنن رو به جواب اضافه می کنیم ... (درخت مورد نظر)

اثبات : برهان خلف ... فرض کنیم  درخت فراگیری با مجموع یال های کمتری موجود باشد ... اولین یالی که در این درخت نبود ولی آن را انتخاب کردیم را درنظر میگیریم ...
این یال را به درخت اضافه میکنیم یک دور ایجاد میشود ... یالی در این دور وجود دارد که از این یال سنگینتر است اگر آن را حذف کنیم درختی سبک تر بدست می آید که با بهینه بودن درخت مفروض در تناقض است.
واسه این که بفهمیم یه یال دور ایجاد میکنه یا نه یه چیزی هست بهش میگن disjoint set  !! (برین خودتون بخونید !!)

پیچیدگی‌ :‌ سورت کردن یال ها از اوردر eloge  و disjoint set  هم از اوردر nlogn اِه ... ( اصلِش nlog*n  اِه البته ... )

پرایم : هدف این الگوریتم هم پیدا کردن یک درخت اِه که همه ی راس ها رو شامل بشه مجموع یال هاشَم مینیمم باشن ... (مثل همون قبلی اِه !!)

تو این یکی الگوریتم ۲ تا مجموعه در نظر میگیریم ... x , y ...
تعریف x : راس هایی که توشون جواب مساله رو پیدا کردیم ... تعریف y : بقیه ی راس ها ...
حالا تو هر مرحله بین یال های بین ۲ مجموعه!! مینیمم رو به جواب اضافه می کنیم ...
(که متعاقبا یه راس جدیدبه x  اضافه می شه)
حالا اگه این کار رو (n-1) بار انجام بدیم درخت مورد نظر رو بدست آوردیم ...

اثبات : برهان خلف ... درخت بهینه را t در نظر بگیرید ...
اولین یالی که در جواب ما هست ولی در t نیست را در نظر بگیرید - طبق روند حرکت الگوریتم ! -  (این یال را e بنامید) ...
 آن را به t  اضافه کنید ... یک دور ایجاد می شود (این دور را c بنامید) ...
که در آن e  ماکسیمم یال است ... (وگرنه درخت t بهینه نیست)
حال در الگوریتم خود زمانی را که یال e  را به جواب اضافه می کنیم در نظر می گیریم ...
یک سری از راس های c در مجموعه ی x هستند و بقیشون تو y ... یالی در درخت t وجود دارد که این دو مجموعه را به هم وصل کرده است ...این یال از یال e  کوچکتر است ... در نتیجه تناقض !! ...
پ.ن: یکم فکرم بد نیست ... :-"

برای بدست آوردن یال مینیمم بین دو مجموعه از set استفاده میکنیم , هر یال حداکثر یک بار وارد set  و یک بار خارج میشود درنتیجه الگوریتم از اوردر eloge است.

دو الگوریتم بالا هر دو درخت پوشای کمینه (MST) را پیدا می کند ...
اما به نظر من پیاده سازی الگوریتم کروسکال ساده تره .... ولی در کل صَلاح مملکت خویش خسروان دانند ...

درس زندگی : سعی کنید کد های این الگوریتم ها رو یه چند باری بزنید که یه وقت اگه وسط کانتستی, چیزی به دردتون خورد بدون باگ بزنیدشون .... (همه کد هایی که گذاشتیم نه فقط این ۲ تا ... )

نظرات  (۱)

  • محسن عروجی
  • ارسال نظر

    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی