Пошук по графіку: Перша ширина проти першої глибини


78

Під час пошуку графіків існує два простих алгоритми: широта-перший та глибина-перша (зазвичай це робиться шляхом додавання всіх суміжних вузлів графіків у чергу (широта-перша) або стека (глибина-перша)).

Тепер, чи є переваги одного над іншим?

Те, про що я міг придумати:

  • Якщо ви очікуєте, що ваші дані будуть досить далеко внизу графіка, глибина спочатку може знайти їх раніше, оскільки ви дуже швидко спускаєтесь у більш глибокі частини графіка.
  • І навпаки, якщо ви очікуєте, що ваші дані будуть досить далеко в діаграмі, ширина першої може дати результат раніше.

Чи є щось, що я пропустив, або це в основному зводиться до особистих уподобань?

Відповіді:


43

Я хотів би процитувати відповідь від hstoerr Stack Overflow , що добре висвітлює проблему:

Це сильно залежить від структури дерева пошуку та кількості та розташування рішень .
Якщо ви знаєте, що рішення знаходиться недалеко від кореня дерева, перший пошук по ширині (BFS) може бути кращим. Якщо дерево дуже глибоке і рішення рідкісні, то перший пошук по глибині (DFS) може назавжди прокотитися, але BFS може бути швидшим. Якщо дерево дуже широке, BFS може потребувати занадто багато пам'яті, тому це може бути абсолютно непрактично. Якщо розчини часті, але розташовані глибоко в дереві, BFS може бути недоцільним. Якщо дерево пошуку дуже глибоке, у будь-якому випадку вам доведеться обмежити глибину пошуку для глибини першого пошуку (DFS) (наприклад, з ітераційним поглибленням).

Але це лише великі правила; вам, мабуть, доведеться експериментувати.

Рафал Доугірд також зауважує:

Деякі алгоритми залежать від конкретних властивостей DFS (або BFS) для роботи. Наприклад, алгоритм Hopcroft і Tarjan для пошуку 2-з'єднаних компонентів використовує той факт, що кожен вже відвіданий вузол, з яким стикається DFS, знаходиться на шляху від кореня до досліджуваного на даний момент вузла.


5
Я не можу зрозуміти, чому ця відповідь має 27 результатів, і це саме злиття двох інших відповідей, які, до речі, просто загальні думки про ...
nbro

37

Один важливий момент у нашому багатоядерному світі: BFS набагато легше паралелізувати. Це інтуїтивно розумно (надсилайте теми для кожної дитини), і це може бути доведено. Тож якщо у вас є сценарій, коли ви можете використовувати паралелізм, тоді BFS - це шлях.


8
Якщо DFS інакше вигідний у заданих налаштуваннях, ви можете застосовувати BFS, поки ви не породили достатню кількість потоків і продовжуєте роботу з DFS. Більш конкретно, ви можете робити DFS і коли ви спускаєтесь і не вистачає ниток, породжуйте одну для наступного брата.
Рафаель

Ця відповідь не заслуговує на 20 оновлень. Питання стосується загального використання двох алгоритмів, а не конкретного використання.
nbro

31

(Я зробив це вікі спільноти. Будь ласка, не соромтесь редагувати.)

Якщо

  • b - коефіцієнт розгалуження
  • d - глибина, де знаходиться розчин
  • h - висота дерева (так, )dh

Тоді

  • DFS займає час і простірO(bh)O(h)
  • BFS займає часу і простірO(bd)O(bd)
  • IDDFS займає час і простірO(bd)O(d)

Причини вибору

  • ДФС
    • повинно бачити ціле дерево все одно
    • ви знаєте , рівень відповідіd
    • байдуже, чи відповідь є найближчим до кореня
  • BFS
    • відповідь близька до кореня
    • ви хочете, щоб відповідь була найближчою до кореня
    • мають кілька ядер / процесорів
  • IDDFS
    • ви хочете BFS, не вистачає пам'яті, але це дещо повільніше

IDDFS = ітеративне поглиблення глибини пошуку


1
Це відмінна відповідь. Я зауважую, що, хоча запитання про графіки, ця відповідь стосується дерев. Дерево - це графік звичайно, і його, можливо, слово можна замінити ... а як же h, "висота дерева". Це означає безпосередньо "висоту графіка"?
користувач2023370

Ще одна причина використання IDDFS полягає в тому, що залежно від того, яким чином ви хочете його використовувати, після кожної ітерації ви можете отримати відповідь (якщо ви шукаєте, скажімо, максимум чи мінімум). Це означає, що ви можете вийти з алгоритму рано, якщо ваша відповідь "достатньо хороша" або ви можете кинути роботу з користувачем (наприклад, шаховий двигун, що використовує IDDFS, щоб знайти оптимальне рішення, але його перериває гравець, який переміщує шматок).
jedd.ahyoung

Ще одним моментом, який слід додати, є те, що DFS використовує стек, тоді як BFS використовує чергу.
Картик Балагуру

17

Один сценарій (крім пошуку найкоротшого шляху, про який вже згадувалося), де вам, можливо, доведеться вибрати один за іншим, щоб отримати правильну програму, - це нескінченні графіки:

Якщо ми розглянемо, наприклад, дерево, де кожен вузол має кінцеву кількість дітей, але висота дерева нескінченна, DFS ніколи не знайде потрібний вузол - він просто продовжує відвідувати першу дитину кожного вузла. бачить, тому якщо той, кого ви шукаєте, не є першою дитиною свого батька, він ніколи не потрапить. BFS, однак, гарантовано знайде його в обмежений час.

Аналогічно, якщо ми розглянемо дерево, де кожен вузол має нескінченну кількість дітей, але дерево має кінцеву висоту, BFS може не закінчуватися. Він відвідає лише дітей кореневого вузла, і якщо той вузол, який ви шукаєте, є дитиною якогось іншого вузла, він не буде досягнутий. У цьому випадку DFS гарантовано знайде його в обмежений час.


7
Примітно, що обидва дають лише алгоритми напіврішень для нескінченних графіків; ви не можете вирішити в кінцевий час, що елемент не є в дереві (очевидно). Що стосується практичних застосувань, зауважте, що (концептуально) можна визначити нескінченну структуру даних (див. Параграф 3.4)!
Рафаель

15

Перша ширина та перша глибина, безумовно, мають однакову поведінку в гіршому випадку (потрібний вузол - останній знайдений). Я підозрюю, що це справедливо і для середнього рівня, якщо у вас немає інформації про ваші графіки.

Один із приємних бонусів пошуку за ширину - це те, що він знаходить найкоротші шляхи (у значенні найменших країв), які можуть зацікавити або не зацікавити.

Якщо ваш середній ранг вузла (кількість сусідів) високий по відношенню до кількості вузлів (тобто графік щільний), у ширину перших з'являться величезні черги, а в глибині перших будуть невеликі стеки. У розріджених графіках ситуація зворотна. Отже, якщо пам'ять є обмежуючим фактором, форма графіку, що знаходиться в руці, може мати потребу повідомити ваш вибір стратегії пошуку.


Довжина черги в bfs та висота стека в dfs дуже залежить від реалізації. Якщо у випадку з dfs ви завжди розгортаєте всю сусідську силу на стеку, то вона сильно зростає, особливо коли графік щільний. Натискання лише посилання, яке вказує, куди продовжувати, коли dfs повертається від рекурсії, економить багато місця.
uli

3

Все вищезазначене є правильним, але примітно, що BFS та DFS створюють власні дерева на основі порядку, який вони використовують для обходу дерева. Кожне з цих дерев має своє власне майно, яке може бути корисним у деяких проблемах.

Наприклад, всі ребра в початковому графіку, які не є у дереві BFS, є поперечними краями; краї, які знаходяться між двома гілками дерева BFS. Усі ребра в початковому графіку, які не є у дереві DFS, є задніми краями; краї, які з'єднують дві вершини у гілці дерева DFS. Такі властивості можуть бути корисні при таких проблемах, як спеціальні фарбування тощо.


1

І DFS, і дерево BFS мають свої унікальні властивості, які можуть дати вам більше корисної інформації про графік. Наприклад, з однією DFS ви можете зробити наступне:

  • Знайдіть мости та точки артикуляції (для непрямих графіків)
  • Виявлення циклу
  • Пошук сильно пов'язаних компонентів (алгоритм Таряна)

За допомогою BFS ви можете знайти найкоротші шляхи між вихідним вузлом та будь-якими іншими вузлами в графіку.

Розділ Алгоритми графіків у CLRS дуже добре підсумовує ці властивості DFS та BFS.


-2

Я думаю, було б цікаво написати їх обом таким чином, що лише перемикаючи рядки коду, ви дасте вам один алгоритм чи інший, щоб ви побачили, що ваша дилема не така сильна, як здається спочатку .

Мені особисто подобається трактування BFS як затоплення ландшафту: спочатку затоплені ділянки з низькою висотою, і лише після цього слідкують за висотними районами. Якщо ви уявляєте висоту ландшафту такою ж ізолінією, як ми бачимо в географічних книгах, легко зрозуміти, що BFS заповнює всю площу під одним і тим же ізоліном одночасно, як це було б з фізикою. Таким чином, інтерпретація висот як відстань чи масштабована вартість дає досить інтуїтивне уявлення про алгоритм.

Маючи це на увазі, ви можете легко адаптувати ідею за шириною першого пошуку, щоб легко знайти мінімальне прольотове дерево, найкоротший шлях, а також безліч інших алгоритмів мінімізації.

Я ще не бачив будь-якої інтуїтивно зрозумілої інтерпретації DFS (лише стандартну про лабіринт, але вона не така потужна, як BFS та затоплення), тому для мене здається, що BFS здається краще співвідноситься з фізичними явищами, як описано вище, тоді як DFS краще співвідноситься з варіантами дилеми на раціональних системах (тобто люди чи комп’ютери, які вирішують, який рух рухати в шахову гру чи виходити з лабіринту).

Отже, для мене різниця між брехнею, щодо того, яке природне явище найкраще відповідає їхній моделі поширення (поперек) у реальному житті.


2
Ласкаво просимо на сайт! Однак я не бачу, як це відповідає на питання. Здається, це ваші загальні почуття та інтуїція щодо BFS та DFS, але питання не про почуття та інтуїцію: це питання про переваги та недоліки. Здається, ваша відповідь зовсім не відповідає цьому.
Девід Річербі

Частина, яка найбільше пов'язана з питанням, полягає у адаптації алгоритму для пошуку мінімальних прольотних дерев, найкоротшого шляху та ін., А також про те, що BFS відтворює деякі природні явища, тоді як дерева рішень DFS
user5193682

1
Питання не запитує, що пов’язано з BFS та DFS. Це не питання про те, щоб знайти розкинуті дерева або найкоротші шляхи або як "відтворити природні явища".
Девід Річербі

Його просять переваги. Якщо можна моделювати фізичні явища, тоді як інше не може, його перевага, якщо потрібно моделювати ці явища. Думаю, ви дотримуєтесь стандартних понять підручника алгоритмів, коли інтерпретуєте слово "перевага", а я
користувач5193682,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.