Недавно я сделал нечто подобное для реализации очереди с приоритетами с использованием сегментов.
Я использовал хеш-таблицы (unordered_map), поэтому вам не нужно хранить 1000 пустых векторов, и вы по-прежнему получаете O (1) произвольный доступ (общий случай, не гарантируется).Теперь, если вам нужно только один раз сохранить / создать этот графовый класс, это, вероятно, не имеет значения.В моем случае мне нужно было создавать приоритетную очередь десятки / сотни раз в секунду, и использование хэш-карты имело огромное значение (из-за того, что я создал unordered_sets только тогда, когда у меня действительно был элемент с таким приоритетом, поэтому нет необходимостиинициализировать 1000 пустых хеш-наборов).Хэш-наборы и карты являются новыми в C ++ 11, но уже некоторое время доступны в std :: tr1, или вы можете использовать библиотеки Boost.
Единственное отличие, которое я вижу между вашими &Мой пример использования заключается в том, что вы также должны иметь возможность удалять соседние узлы.Я предполагаю, что каждый узел содержит список указателей на его соседей.Если это так, удаление соседей должно занять k * O(1)
с k
количеством соседей (опять же, O (1) в общем случае, не гарантировано, наихудший случай - O (n) в unordered_map / set).Вы просто просматриваете каждый соседний узел, получаете его приоритет, что дает вам правильный индекс в хэш-карте.Затем вы найдете указатель в хэш-наборе, которому соответствует приоритет, этот поиск в общем случае будет O (1), а удаление элемента снова будет O (1) в общем.
В целом, я думаюу вас есть довольно хорошее представление о том, что делать, но я считаю, что использование хеш-карт / наборов значительно ускорит ваш код (конечно, зависит от точного использования).Для меня улучшение скорости реализации с unordered_map<int, unordered_set>
против vector<set>
составило около 50х.