Чому часова складність як DFS, так і BFS O (V + E)


132

Основний алгоритм для BFS:

set start vertex to visited

load it into queue

while queue not empty

   for each edge incident to vertex

        if its not visited

            load into queue

            mark vertex

Тому я думаю, що часова складність буде такою:

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges) 

де vзнаходиться вершина 1вn

По-перше, правильно сказане? По-друге, як це O(N + E), і інтуїція щодо того, чому було б дійсно приємно. Дякую

Відповіді:


268

Ваша сума

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)

можна переписати як

(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]

і перша група, O(N)поки друга O(E).


1
Але кожна вершина повинна бути вилучена з черги, і це журнал (| Q |) Що з цією частиною?
Йола

3
log (| Q |) <log (N) <N, отже, ви можете сміливо ігнорувати термін в асимптотиці
Mihai Maruseac

2
Якщо у списку суміжності кожна вершина з'єднана з усіма іншими вершинами, складність була б еквівалентною O (V + E) = O (V + V ^ 2) = O (V ^ 2). E = V ^ 2, оскільки найбільше число ребер = V ^ 2.
Макс

Відповідно до вашої відповіді, чи не стане складність O (V + 2E)? Оскільки кожен край може мати спільний край з іншим краєм?
каранський

2
Постійні умови можна скидати.
Михай Марусеак

41

DFS (аналіз):

  • Встановлення / отримання мітки вершини / краю вимагає O(1)часу
  • Кожна вершина позначається двічі
    • один раз як НЕВИСЛОВА
    • колись відвідав
  • Кожен край маркується двічі
    • один раз як НЕВИСЛОВА
    • один раз як ВІДКРИТТЯ або НАЗАД
  • Метод incidentEdges викликається один раз для кожної вершини
  • DFS працює в O(n + m)часі за умови, що графік представлений структурою списку суміжності
  • Нагадаємо, що Σv deg(v) = 2m

BFS (аналіз):

  • Встановлення / отримання мітки вершини / краю займає O (1) час
  • Кожна вершина позначається двічі
    • один раз як НЕВИСЛОВА
    • колись відвідав
  • Кожен край маркується двічі
    • один раз як НЕВИСЛОВА
    • один раз як ВІДКРИТТЯ чи КРЕС
  • Кожна вершина вставляється один раз у послідовність Li
  • Метод incidentEdges викликається один раз для кожної вершини
  • BFS працює в O(n + m)часі за умови, що графік представлений структурою списку суміжності
  • Нагадаємо, що Σv deg(v) = 2m

tnx для редагування я тут новий, тому я все ще намагаюся керувати екраном редагування :)
TheNewOne

1
дякую за те, що зазначив, що графіки мають бути представлені структурою списку суміжності, я помилявся, чому DFS - це O (n + m), я думаю, що це O (n + 2m), оскільки кожне ребро проходить два рази за допомогою зворотного треку.
mib1413456

22

Дуже спрощено без особливої ​​формальності: кожен край вважається рівно вдвічі, і кожен вузол обробляється рівно один раз, тому складність повинна бути постійною кратною кількістю ребер, а також кількістю вершин.


Набагато простіше зрозуміти, ніж математичне позначення без додаткових пояснень, хоча саме для цього і є Google.
mLstudent33

11

Часова складність O(E+V)замість того, O(2E+V)що якщо часова складність дорівнює n ^ 2 + 2n + 7, то вона записується як O (n ^ 2).

Отже, O (2E + V) записується як O (E + V)

тому що різниця між n ^ 2 і n має значення, але не між n і 2n.


@Am_I_Helpful хтось просить вище про 2E у великій-ой нотації .... що чому 2 не враховується в часі складності.
Dhruvam Gupta

@Am_I_Helpful просто дивіться пост над моєю відповіддю .... там користувач на ім'я Kehe CAI написав "Я думаю, що кожен край був розглянутий двічі, і кожен вузол був відвіданий один раз, тому загальна часова складність повинна бути O (2E + V ) ". Тому я відповів акуратно .... Зрозумів !!!
Dhruvam Gupta

Я зняв свою прихильність лише тому, що ви відредагували свою відповідь,
Am_I_Helpful

3

Я думаю, що кожне ребро було розглянуто двічі, і кожен вузол було відвідано один раз, тому загальна часова складність повинна бути O (2E + V).


Навіть я відчуваю те саме. Чи може хтось дати додаткові пояснення з цього приводу?
Чайтанья,

12
Аналіз Big O ігнорує константу. O (2E + V) - O (E + V).
Гемм

3

Інтуїтивне пояснення цьому полягає у простому аналізі одного циклу:

  1. відвідати вершину -> O (1)
  2. a для циклу на всіх падаючих краях -> O (e), де e - кількість ребер, що падають на дану вершину v.

Тож загальний час для однієї петлі дорівнює O (1) + O (e). Тепер підсумовуйте її для кожної вершини, оскільки кожна вершина відвідується один раз Це дає

For every V
=> 

    O(1)
    +

    O(e)

=> O(V) + O(E)

2

Коротке, але просте пояснення:

Я найгірший випадок, який вам знадобиться відвідати всю вершину і край, отже, складність часу в гіршому випадку - O (V + E)

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