Для школьной задачи я должен создать график и сделать с ним кое-что. На входе каждая вершина имеет идентификатор, который является номером 0-999'999'999. Поскольку я не могу создать массив так долго, я не могу использовать этот идентификатор в качестве ключа в матрице смежности. Моим первым решением было создать отдельный идентификатор, который является произвольным исходным, и сохранить его в каком-то словаре/карте, но поскольку я получаю 10 000 записей вершин, поиск, вероятно, будет медленным. Алгоритм должен быть под O (n ^ 2), и у меня уже есть BFS и топопорт. Что было бы лучшим решением в этом случае? В качестве побочного примечания - я не могу использовать уже установленные библиотеки (поэтому я не могу использовать граф, карту, вектор, классы строк и т.д.), Но я могу сам их кодировать, если это лучший вариант.
Вы хотите, чтобы бинарное дерево поиска выполняло поиск в O(logn)
или хеш-карте, чтобы выполнять поиск в ~O(1)
раз, или вы можете пойти с маршрутом массива, и в этом случае размер вашего массива будет равен максимальное значение, которое может иметь ваш идентификатор (в вашем случае 10^9
).
Как сказал @amit, проверьте деревья AVL/Red-Black и хеш-карты. Нет лучшего способа сделать поиск в графе ниже O(n)
если вы не можете изменить топологию графика, чтобы превратить его в "график поиска".
Зачем вам нужно создать массив размером 1 миллиард. Вы можете просто создать матрицу смежности или список смежности количества узлов.
Будь число вершин постоянным или нет, я предлагаю вам перейти на список смежности. Например, у вас есть 10 узлов, поэтому вам нужно создать массив размером 10, затем для каждого узла создайте список ребер, как вы можете видеть в приведенной выше ссылке.
Рассмотрим этот график, вы действительно думаете, что вам нужно иметь 10 ^ 10 элементов в списке смежности вместо 4 элементов?
value
а next
, внутри значения вы скажете 89777371
а значением следующего элемента будет 13876873
, поэтому нет необходимости в отображении.