Я просто хочу получить подтверждение временной сложности алгоритма ниже.
РЕДАКТИРОВАТЬ : далее мы не предполагаем, что используются оптимальные структуры данных. Однако не стесняйтесь предлагать решения, использующие такие структуры (четко указав, какие структуры данных используются и какое благотворное влияние они оказывают на сложность).
Обозначение : далее n = | V |, m = | E |, а avg_neigh обозначает среднее число соседей любого данного узла в графе.
Предположение : график является невзвешенным, неориентированным, и у нас загружено представление списка смежности (список списков, содержащий соседей каждой вершины).
Вот что мы имеем до сих пор:
Строка 1 : вычисление степеней - это O (n), поскольку оно просто включает получение длины каждого подсписка в представлении списка смежности, то есть выполнение n O (1) операций.
Строка 3 : для нахождения наименьшего значения требуется проверка всех значений, то есть O (n). Так как он вложен в цикл while, который посещает все узлы один раз, он становится O (n ^ 2).
Строки 6-7 : удаление вершины v равно O (avg_neigh ^ 2)как мы знаем соседей v из представления списка смежности и удаление v из каждого из подсписков соседей равно O (avg_neigh). Строки 6-7 вложены в цикл while, поэтому он становится O (n * avg_neigh ^ 2).
Строка 9 : это O (1), потому что он просто включает получениедлина одного списка. Он вложен в цикл for и цикл while, поэтому он становится O (n * avg_neigh).
Сводка : общая сложность O (n) + O (n ^ 2) +O (n * avg_neigh ^ 2) + O (n * avg_neigh) = O (n ^ 2).
Примечание 1 : если длина каждого подсписка недоступна (например,Поскольку список смежности не может быть загружен в память), вычисление степеней в строке 1 равно O (n * avg_neigh), так как каждый список имеет в среднем элементы avg_neigh и имеется n подсписков. В строке 9 общая сложность становится равной O (n * avg_neigh ^ 2).
Примечание 2 : если весовой коэффициент графа, мы можем сохранить веса ребер в представлении списка смежности. Однако получение степеней в строке 1 требует суммирования по каждому подсписку и теперь равно O (n * avg_neigh), если список смежности загружен в ОЗУ, а O (n * avg_neigh ^ 2) остальное. Аналогично, строка 9 становится O (n * avg_neigh ^ 2) или O (n * avg_neigh ^ 3).