Возможно, "это выглядит так, как будто это может занять очень много времени", но есть лучший способ выяснить: -)
Предположим, вы сохранили свой график в виде списка смежности. Чтобы найти искомое множество, вам обязательно нужно посмотреть на все ребра, поэтому для алгоритма у нас есть нижняя граница от Ω (| E |). Нахождение степени каждой вершины занимает время O (| E |) (потому что вы смотрите на каждое ребро ровно один раз; другое доказательство - использование факта, что ∑d (v) = 2 | E |). Сравнение степени каждой вершины со всеми ее соседями также занимает всего O (| E |) времени (опять же, для каждого ребра выполняется только одно сравнение). Это означает, что ваш алгоритм выполняется за O (| E |) времени (около 2 | E | «шагов», но точное количество инструкций процессора зависит от вашей реализации), что соответствует нижней границе. Таким образом, ваш алгоритм "грубой силы", в худшем случае, по существу (с небольшой константой) настолько быстр, насколько это возможно , поэтому его дальнейшая оптимизация не стоит.
Если вы делаете это для реального приложения, и вы действительно обнаружите, что ваш алгоритм занимает слишком много времени, тогда используйте профилировщик, чтобы найти, какие части оптимизировать. Совсем не очевидно, что оптимизация второй фазы алгоритма имеет решающее значение.