{CodeGate}

جستجوی اول سطح در جاوا (Breadth First Search)

در این جلسه تیم کدگیت را با آموزش جستجوی اول سطح در جاوا همراهی کنید. این آموزش پیش نیازهای زیر را دارد:

  1. رابط برنامه نویسی گراف
  2. پشته
  3. صف
  4. آشنایی با گراف
  5. آشنایی با لیست پیوندی در جاوا
  6. Iterator در جاوا
  7. آشنایی با This در جاوا
  8. آشنایی با Constructor در جاوا
  9. آشنایی با متد در جاوا
  10. آشنایی با آرایه
  11. آشنایی با خواندن و نوشتن فایل در جاوا
  12. حلقه while در جاوا
  13. آشنایی مدیریت استثناها
  14. آشنایی با if
  15. آشنایی به for
  16. آشنایی با شی گرایی

اگر با مطالب بالا آشنا نیستید در آموزش های قبل درباره این مطالب صحبت شده است بنابراین پیشنهاد میشود مطالب بالا را بخوانید و سپس به مطالعه این آموزش بپردازید.

جستجوی اول سطح

در نظریه گراف، جستجوی اول سطح یکی از الگوریتم‌های پیمایش گراف است. استراتژی جستجوی سطح اول برای پیمایش گراف، همانطور که از نامش پیداست «جستجوی سطح به سطح گراف» است.

الگوریتم از ریشه شروع می‌کند (در گراف‌ها و یا درخت‌های بدون ریشه رأس دلخواهی به عنوان ریشه انتخاب می‌شود) و آن را در سطح یک قرار می‌دهد. سپس در هر مرحله همه همسایه‌های رئوس آخرین سطح دیده شده را که تا به حال دیده نشده‌اند بازدید می‌کند و آنها را در سطح بعدی می‌گذارد. این فرایند زمانی متوقف می‌شود که همه همسایه‌های رئوس آخرین سطح قبلاً دیده شده باشند. همچنین در مسائلی که حالات مختلف متناظر با رئوس یک گراف‌اند و حل مسئله مستلزم یافتن رأس هدف با خصوصیات مشخصی است که در عین حال در بین همه رئوس هدف با آن خصوصیات به ریشه نزدیک‌ترین باشد، جستجوی سطح اول به صورت غیرخلاق عمل می‌کند. بدین ترتیب که الگوریتم هر دفعه همه همسایه‌های یک رأس را بازدید کرده و سپس به سراغ رأس بعدی می‌رود و بنابراین گراف سطح به سطح پیمایش خواهد شد. این روند تا جایی ادامه می‌یابد که رأس هدف پیدا شود و یا احتمالاً همه گراف پیمایش شود. براساس آنچه گفته شد پیاده‌سازی هوشمندانه الگوریتم آنقدر مؤثر نخواهد بود.

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

جستجوی اول سطح در جاوا

برای پیاده سازی جستجوی اول سطح در جاوا همانطور که گفته شد از صف استفاده میکنند. ما قبلا صف در جاوا را پیاده سازی کردیم و از همان صف استفاده میکنیم.نکته بعدی این است که ما از گراف استفاده میکنیم و در آموزش های قبل درباره رابط برنامه نویسی گراف توضیج دادیم. در کدی که به شما ارایه میدهیم از پشته نیز استفاده کردیم(در ادامه دلیل آن را میبینید).پشته را نیز قبلا پیاده سازی کردیم و از آن استفاده میکنیم (در کد پشته  اگر implement نمیکرد کلاسی را، شما به آن implements Iterable<Item>  اضافه کنید).

کد جستجوی اول سطح در جاوا فیلد های زیر را دارد:

  1. Marked : این فیلد یک آرایه به تعداد راس هاست.اگر در جستجوی اول سطح راسی دیده شود مقدار اندیس آن true میشود.
  2. INFINITY: این فیلد را همان عدد بی نهایت گذاشتیم و وقتی دو راس به هم مسیری ندارند فاصله آن را بینهایت قرار میدهیم.
  3. EdgeTo: این آرایه نیز به تعداد راسهاست. اگر ما از راس 2 به راس 5 رسیده باشیم EdgeTo[5]=2 قرار میدهیم.(به طور کلی مسیر را نگه میدارد.)
  4. DistTo : این آرایه نیز به تعداد راس هاست و فاصله هر راس از نقطه شروع را در خود ذخیره میکند.

متدهایی که در کد بالا استفاده شده :

  1. BreadthFirstSearch: این متد constructor است و یک گراف و راس شروع را میگیرد و جستجوی اول سطح را شروع میکند.
  2. Bfs: این متد جستجوی اول سطح در جاوا را پیاده سازی کرده. است. ابتدا distto همه راس ها را برابر بینهایت قرار میدهد. یک صف را میسازد و هر راسی که قبلا دیده نشده بود به صف اضافه میکند.
  3. Haspathto: این متد به ما میگوید آیا از راس شروع تا راسی خاص (ورودی متد) مسیری وجود دارد یا خیر!
  4. Disto: این متد به ما میگوید فاصله راس شروع تا راس خاص (ورودی متد) چقدر است.
  5. PathTo: مسیر بین دو راس شروع و راس خاص (ورودی متد) را به میدهد.

تست جستجوی اول سطح در جاوا

برای تست جستجوی اول سطح در جاوا کد زیر را بزنید.

در کد بالا فایل graph.txt به صورت زیر است:

خروجی برنامه نیز به صورت زیر است:

پسورد: www.codegate.ir

 

دسته : java, جاوا, ساختمان داده در جاوا, گراف در جاوا

دیدگاه بگذارید

نظر شما چیست؟

مطلع کردن شما از
avatar

wpDiscuz