Для школьной задачи я должен создать график и сделать с ним кое-что. На входе каждая вершина имеет идентификатор, который является номером 0-999'999'999. Поскольку я не могу создать массив так долго, я не могу использовать этот идентификатор в качестве ключа в матрице смежности. Моим первым решением было создать отдельный идентификатор, который является произвольным исходным, и хранить его в каком-то словаре/карте, но по мере того, как я получаю 10 000 записей вершин, поиск, вероятно, должен замедляться. Алгоритм должен быть под O (n^2), и у меня уже есть BFS и топопорт. Что было бы лучшим решением в этом случае? В качестве побочного примечания - я не могу использовать уже установленные библиотеки (поэтому я не могу использовать граф, карту, вектор, классы строк и т. Д.), Но я могу сам их кодировать, если это лучший вариант.Создание быстрого словаря
ответ
Что вы хотите бинарное дерево поиска, чтобы сделать поиски в O(logn)
времени или хэш-карта, чтобы сделать поиски в ~O(1)
времени или вы можете пойти с маршрутом массива, в этом случае размер вашего массива будет максимальное значение вашего ID может иметь (в вашем случае, 10^9
).
Как сказал вам @amit, проверьте деревья AVL/Red-Black и хеш-карты. Нет лучшего способа сделать поиск в графе ниже O(n)
, если вы не можете изменить топологию графика, чтобы превратить его в «график поиска».
Зачем вам нужно создать массив размером 1 миллиард. Вы можете просто создать матрицу смежности или список смежности количества узлов.
Будь то число вершин постоянным или нет, я предлагаю вам пойти за adjacency list. Например, у вас есть 10 узлов, поэтому вам нужно создать массив размером 10, затем для каждого узла создайте список ребер, как вы можете видеть в приведенной выше ссылке.
Рассмотрим этот граф, неужели вы думаете, что вам нужно иметь 10^10 элемент в списке смежности вместо 4-х элементов?
Проблема в том, что если у меня есть 10 вершин, в массиве их идентификаторы 1-10, но в каждой вершине его соседние единицы показаны, например. 89777371 и 13876873, которые я должен перевести на 1-10. Для каждой вершины это занимает время. Если бы массив размером 1 миллиард я сразу узнал, где находится конкретная вершина. – vvolis
Почему, если имя вершин было 10-значной строкой? Вам нужно использовать 26^10 строк для матрицы? В каждом списке смежности узлов есть 'значение' и' next', внутри значения вы скажете '89777371', а значение следующего элемента будет равно« 13876873 », поэтому нет необходимости в сопоставлении. – smttsp
Они не находятся в упорядоченном списке. Поэтому на каждой вершине я должен искать их смежные вершины через карту. Я вижу, что следующий узел, например, 36827648736, но я не знаю, из каких из 10 элементов в моем массиве это один. – vvolis
- 1. быстрого возвращение неправильного индекса словаря
- 2. Запись быстрого словаря в файл
- 3. Создание быстрого списка функций
- 4. Как объявить переменную словаря в классе быстрого?
- 5. словаря содержит определенное значение быстрого 3
- 6. Создание более быстрого запроса MySQL
- 7. Создание самого быстрого C++ GUI
- 8. Создание словаря в python
- 9. Создание пользовательского упорядоченного словаря
- 10. Создание словаря из строки
- 11. Создание SKTextureAtlas из словаря
- 12. Создание datatable из словаря
- 13. Автоматическое создание словаря
- 14. Создание XML из словаря
- 15. Создание словаря из списка
- 16. Создание вложенного словаря python
- 17. Создание списка из словаря
- 18. Создание вложенного словаря
- 19. Создание словаря без значения?
- 20. Создание словаря из списка
- 21. Создание исходного словаря вменяемый
- 22. Создание словаря любого объекта
- 23. Создание словаря в C
- 24. Создание словаря из .txt
- 25. Создание списка словаря
- 26. Создание словаря из итерабельного
- 27. Создание словаря из файла
- 28. Создание ярлыков из словаря
- 29. Создание словаря с делегатами
- 30. Создание статического словаря ресурсов
Мне кажется, что задание состоит в том, чтобы научить вас об этих структурах данных, построив их самостоятельно. Вы узнали о хэш-таблицах? AVL/Красно-Черные деревья? – amit
Нет, мы не узнали о хэш-таблицах, но это не пункт назначения. Тема для этого - Graphs (toposort, BFS, DFS, DAG и т. Д.). Я мог бы создать двоичное дерево для поиска, но мне просто интересно, если это лучшее решение (кажется слишком сложным) – vvolis
Если ваш массив упорядочен по идентификатору, то гораздо быстрее искать конкретные идентификаторы (подсказка: начать проверку значение ID в средней ячейке f массив) –