(Этот вопрос относится к моему предыдущему вопросу , точнее к моему ответу на него.)
Я хочу хранить все кубы натуральных чисел в структуре и искать конкретные целые числа, чтобы увидеть, являются ли они идеальными кубами.
Например,
cubes = map (\x -> x*x*x) [1..]
is_cube n = n == (head $ dropWhile (<n) cubes)
Это намного быстрее, чем вычисление корня куба, но имеет сложность O(n^(1/3))
(я прав?).
Я думаю, было бы лучше использовать более сложную структуру данных.
Например, в C я могу сохранить длину уже сгенерированного массива (не списка - для более быстрой индексации) и выполнить бинарный поиск. Это будет O(log n)
с более низким коэффициентом, чем в другой ответ на , что вопрос. Проблема в том, что я не могу выразить это на Хаскеле (и не думаю, что должен).
Или я могу использовать хеш-функцию (например, mod
). Но я думаю, что было бы намного больше памяти, чтобы иметь несколько списков (или список списков), и это не снизило бы сложность поиска (все еще O(n^(1/3))
), только коэффициент.
Я думал о каком-то дереве, но без каких-либо умных идей (к сожалению, я никогда не изучал CS). Я думаю, тот факт, что все целые числа возрастают, сделает мое дерево плохо сбалансированным для поиска.
И я вполне уверен, что этот факт о возрастающих целых числах может быть большим преимуществом для поиска, но я не знаю, как правильно его использовать (см. Мое первое решение, которое я не могу выразить в Haskell).