Мы знаем, что поиск по односвязному списку - это O (n) с указателем на голову. Скажем, я всегда поддерживаю указатель на половину связанного списка. Могу ли я улучшить время поиска?тривиальный запрос сложности с одиночным соединением
ответ
Приятно подумать, но это все еще не улучшает работу по поиску. Независимо от того, сколько указателей у вас есть в разных частях списка, вам все равно придется анализировать каждый элемент в списке. Тем не менее, вы можете - два потока искать каждую половину списка, делая операцию в два раза быстрее в теории.
Только в случае, если данные связанного списка отсортированы. В противном случае, как уже сказано в другом ответе.
Да, это может уменьшить сложность с постоянным коэффициентом 2, если у вас есть какой-то способ определить, начинать ли с начала или середины списка (как правило, но необязательно, сортируемый список). Это, однако, постоянный фактор, поэтому с точки зрения сложности большого O это не имеет значения.
Чтобы иметь отношение к сложностям с большими значениями, вам требуется более чем постоянное изменение коэффициента. Если, например, у вас был указатель на деление пополам каждой половины, и снова каждая половина этого и т. Д., Вы бы закончили логарифмическую сложность вместо линейной - и вы бы превратили свой «связанный список» в (уже хорошо известное) резьбовое дерево.
Это было бы, но асимптотически было бы все равно. Тем не менее, есть структура данных, которая использует эту идею, она называется списком пропуска. Список пропусков - это связанный список, в котором некоторые узлы имеют больше указателей, которые в каком-то смысле указывают на середину остального списка. Идея хорошо проиллюстрирована на this image. Эта структура обычно имеет логарифмическую вставку для поиска и удаления.
- 1. Синтаксическая ошибка, анализирующая тривиальный запрос с JPA
- 2. Запрос Django с соединением?
- 3. Соответствующий запрос с соединением
- 4. SQL-запрос с соединением
- 5. SQL-запрос с левым соединением
- 6. Как оптимизировать запрос с соединением
- 7. Запрос с соединением между документами
- 8. Вставить запрос с внутренним соединением
- 9. Oracle SQL запрос с соединением
- 10. Как оптимизировать запрос с соединением
- 11. Запрос Mysql с внутренним соединением
- 12. TSQL: запрос с дополнительным соединением
- 13. Запрос с левым наружным соединением
- 14. Запрос Mysql с условным соединением
- 15. LINQ запрос с соединением с ICollection
- 16. Как связать запрос с соединением с DataGridView?
- 17. Запрос BDD с внутренним соединением с Yii
- 18. Казалось бы, тривиальный запрос MySQL с операторами if
- 19. Django ORM запрос с несколькими внутреннего соединением
- 20. Запрос MySQL, проблема с моим соединением?
- 21. Запрос с соединением не выбирает связанный объект
- 22. Попытка написать MySQL запрос с соединением
- 23. SQL-запрос с последующим внутренним соединением
- 24. запрос обновления mysql с внутренним соединением
- 25. SQLite: запрос дополнительные колонки с соединением выберите
- 26. OleDbException (ACCESS) внутренний запрос с соединением
- 27. Laravel «как» запрос с соединением MongoDB
- 28. Update MySQLi запрос с внутренним соединением
- 29. найти все значения формируют запрос с соединением
- 30. Slow MySQL оставил запрос с соединением
Добавление потоков может улучшить время работы на некоторых процессорах, но это не меняет сложность алгоритма, которая остается O (N). –
@Brian, правда правда. –
, поэтому наши сравнения остаются эффективными одинаковыми, даже если мы сократили количество времени, которое мы прокручиваем по списку – Aks