برنامه نویسی

Entendendo o Algoritmo Wyth-First Search (BFS)

در دنیای الگوریتم ها ، BFS (اولین جستجوی یا جستجو در عرض) این یک تکنیک کلیدی است که می خواهیم مسیرها را در یک نمودار به طور کارآمد کشف کنیم. این رویکرد به شما امکان می دهد کوچکترین مسیر را بین دو نقطه پیدا کنید و “کوچکترین مسیر” می تواند به معنای چندین چیز باشد:

  • حرکات کمتری برای دستیابی به نتیجه خاص ؛
  • کمترین تعداد مراحل برای رفتن از یک نقطه به یک نقطه B ؛
  • نامه بعدی احتمالی در دنباله ای از کلمات ، در میان دیگران.

نمودار چیست؟

هنگام مطالعه BFS، ما با یک ساختار داده ضروری روبرو می شویم: شمردنبشر این تشکیل شده است رئوس (یا ما)، که عناصر مشکل را نشان می دهد ، و لبه، که ارتباط بین این عناصر را نشان می دهد.

به عنوان مثال ، تصور کنید که ما یک نقطه A به یک نقطه B متصل هستیم:

نمونه نمودار

در این حالت ، ما می گوییم که A و B همسایگان هستند زیرا مستقیماً توسط یک لبه به هم وصل می شوند.

تفاوت بین BFS و جستجوی باینری

اگر الگوریتم هایی را مطالعه کرده اید ، احتمالاً می دانید جستجوی دودویی، به طور گسترده ای برای یافتن عناصر در لیست های سفارش داده شده ، با استفاده از استراتژی تسخیر کردنبشر بدون آنتنتو ، الف BFS هدف دیگری دارد:

او به این سؤال پاسخ می دهد: “من می توانم از نقطه A خارج شوم و به نقطه B برسم؟ اگر چنین است ، کمترین تعداد مراحل مورد نیاز چیست؟”

حال ، بیایید این مفهوم را با یک مثال بهتر ببینیم:

مثال حداقل راه

در مثال اول ، ما یک مسیر مستقیم بین A و B. داریم اما هرچه نمودار پیچیده تر شود ، پیدا کردن کوچکترین مسیر به یک چالش بیشتر تبدیل می شود.

اجرای BFS در جاوا

حال ، بیایید یک نمونه عملی از BFS در جاوا بسازیم.

نمایندگی گرافو

ما می توانیم از بسیاری جهات نمودار را نشان دهیم. در اینجا ، ما از a استفاده خواهیم کرد خط نقشه، جایی که هر کلید یک گره و مقادیر مرتبط را نشان می دهد ، لیست همسایگان آن است:

var graph = new HashMap<String, List<String>>();
graph.put("Voce", List.of("Alice", "Bob", "Claire"));
graph.put("Bob", List.of("Anuj", "Peggy"));
graph.put("Alice", List.of("Peggy"));
graph.put("Claire", List.of("Thom", "Jonny"));
graph.put("Anuj", List.of());
graph.put("Peggy", List.of());
graph.put("Thom", List.of());
graph.put("Jonny", List.of());
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون که نمودار خود را داریم ، بیایید جستجو را پیاده سازی کنیم.

اجرای الگوریتم

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

private static void example(Map<String, List<String>> graph) {
    var filaDeBusca = new ArrayList<>(graph.get("Voce"));
    var verificados = new HashSet<String>();

    while (!filaDeBusca.isEmpty()) {
        String first = filaDeBusca.remove(0);

        // Se o nó já foi verificado, pulamos para o próximo
        if (verificados.contains(first)) {
            continue;
        }

        // Lógica de verificação do elemento desejado
        if (first.startsWith("Jon")) {
            System.out.println("Encontrado: " + first);
            break;
        }

        verificados.add(first);
        filaDeBusca.addAll(Optional.ofNullable(graph.get(first)).orElseGet(List::of));
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

توضیح کد

  1. ما یک خط جستجو ایجاد کردیم که حاوی همسایگان مستقیم گره اولیه است.
  2. ما مجموعه ای از تأیید شده را ایجاد کردیم تا بیش از یک بار از بازدید از همان گره خودداری کنیم.
  3. تا زمانی که خط خالی نباشد ، اولین عنصر را حذف می کنیم و تأیید می کنیم که آیا معیار مورد نظر را برآورده می کند یا خیر.
  4. اگر این گره مورد نظر باشد ، ما به جستجو پایان می دهیم.
  5. در غیر این صورت ، همسایگان خود را به خط اضافه می کنیم و گره را به صورت تأیید شده مشخص می کنیم.

پیشرفت ها و ملاحظات

  • منطق تأیید می تواند برای مشکلات مختلف شخصی سازی شود.
  • استفاده از مجموعه برای ذخیره گره های بازدید شده ، از پیوندهای بی نهایت و تکرارهای غیر ضروری جلوگیری می کند.
  • در صورت لزوم ذخیره مسیر گرفته شده ، می توانیم ساختار را اصلاح کنیم تا این اطلاعات را درج کنیم.

پایان

الگوریتم BFS ابزاری قدرتمند برای یافتن راه های حداقل در نمودارها است. این برنامه دارای چندین برنامه مانند شبکه های اجتماعی ، مسیریابی نقشه و حتی بازی است.

امیدوارم این مقاله به درک بهتر BFS کمک کرده باشد! اگر سؤال یا پیشنهادی دارید ، نظر خود را بگذارید.

منبع کد: Luliveira

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا