2014-11-17 3 views
0

Для школьной задачи я должен создать график и сделать с ним кое-что. На входе каждая вершина имеет идентификатор, который является номером 0-999'999'999. Поскольку я не могу создать массив так долго, я не могу использовать этот идентификатор в качестве ключа в матрице смежности. Моим первым решением было создать отдельный идентификатор, который является произвольным исходным, и хранить его в каком-то словаре/карте, но по мере того, как я получаю 10 000 записей вершин, поиск, вероятно, должен замедляться. Алгоритм должен быть под O (n^2), и у меня уже есть BFS и топопорт. Что было бы лучшим решением в этом случае? В качестве побочного примечания - я не могу использовать уже установленные библиотеки (поэтому я не могу использовать граф, карту, вектор, классы строк и т. Д.), Но я могу сам их кодировать, если это лучший вариант.Создание быстрого словаря

+0

Мне кажется, что задание состоит в том, чтобы научить вас об этих структурах данных, построив их самостоятельно. Вы узнали о хэш-таблицах? AVL/Красно-Черные деревья? – amit

+0

Нет, мы не узнали о хэш-таблицах, но это не пункт назначения. Тема для этого - Graphs (toposort, BFS, DFS, DAG и т. Д.). Я мог бы создать двоичное дерево для поиска, но мне просто интересно, если это лучшее решение (кажется слишком сложным) – vvolis

+0

Если ваш массив упорядочен по идентификатору, то гораздо быстрее искать конкретные идентификаторы (подсказка: начать проверку значение ID в средней ячейке f массив) –

ответ

1

Что вы хотите бинарное дерево поиска, чтобы сделать поиски в O(logn) времени или хэш-карта, чтобы сделать поиски в ~O(1) времени или вы можете пойти с маршрутом массива, в этом случае размер вашего массива будет максимальное значение вашего ID может иметь (в вашем случае, 10^9).

Как сказал вам @amit, проверьте деревья AVL/Red-Black и хеш-карты. Нет лучшего способа сделать поиск в графе ниже O(n), если вы не можете изменить топологию графика, чтобы превратить его в «график поиска».

0

Зачем вам нужно создать массив размером 1 миллиард. Вы можете просто создать матрицу смежности или список смежности количества узлов.

Будь то число вершин постоянным или нет, я предлагаю вам пойти за adjacency list. Например, у вас есть 10 узлов, поэтому вам нужно создать массив размером 10, затем для каждого узла создайте список ребер, как вы можете видеть в приведенной выше ссылке.

graph

Рассмотрим этот граф, неужели вы думаете, что вам нужно иметь 10^10 элемент в списке смежности вместо 4-х элементов?

+0

Проблема в том, что если у меня есть 10 вершин, в массиве их идентификаторы 1-10, но в каждой вершине его соседние единицы показаны, например. 89777371 и 13876873, которые я должен перевести на 1-10. Для каждой вершины это занимает время. Если бы массив размером 1 миллиард я сразу узнал, где находится конкретная вершина. – vvolis

+0

Почему, если имя вершин было 10-значной строкой? Вам нужно использовать 26^10 строк для матрицы? В каждом списке смежности узлов есть 'значение' и' next', внутри значения вы скажете '89777371', а значение следующего элемента будет равно« 13876873 », поэтому нет необходимости в сопоставлении. – smttsp

+0

Они не находятся в упорядоченном списке. Поэтому на каждой вершине я должен искать их смежные вершины через карту. Я вижу, что следующий узел, например, 36827648736, но я не знаю, из каких из 10 элементов в моем массиве это один. – vvolis

Смежные вопросы