Однажды я реализовал нечто подобное для односвязного списка, содержащего отсортированные ключи.Мне нужно было найти в нем несколько ключей (зная только один из них в начале, остальные зависели от него), и я хотел избегать обхода списка снова и снова.И я не знал длины списка.
Итак, я закончил тем, что сделал это ... Я создал 256 указателей, чтобы указывать на элементы списка, и заставил их указывать на первые 256 элементов списка.Как только все 256 были использованы и 257-й требовался, я отбросил значения нечетных указателей (1,3,5 и т. Д.), Сжал четные (0,2,4 и т. Д.) В первые 128 указателейи продолжал присваивать оставшуюся половину (128) указателей остальным, на этот раз пропуская каждый второй элемент списка.Этот процесс повторялся до конца списка, после чего эти указатели указывали на элементы, равномерно распределенные по всему списку.Затем я мог бы выполнить простой двоичный поиск, используя эти 256 (или меньше) указателей, чтобы сократить поиск по линейному списку до 1/256-й (или 1 / независимо от-го) от первоначальной длины списка.причудливый или мощный, но иногда может быть достаточным улучшением с небольшими изменениями кода.