Data structures haskell:一种用于存储升序整数的数据结构,具有非常快的查找速度

Data structures haskell:一种用于存储升序整数的数据结构,具有非常快的查找速度,data-structures,haskell,lookup,Data Structures,Haskell,Lookup,(这个问题与我的有关,或者更确切地说与它有关。) 我想把所有的自然数都存储在一个结构中,然后查找特定的整数,看看它们是否是完美的立方体 比如说, cubes = map (\x -> x*x*x) [1..] is_cube n = n == (head $ dropWhile (<n) cubes) cubes=map(\x->x*x*x)[1..] is_cube n=n==(head$dropWhile(几个注释: 如果您有有限多个立方体,请将它们放入Data.IntSet

(这个问题与我的有关,或者更确切地说与它有关。)

我想把所有的自然数都存储在一个结构中,然后查找特定的整数,看看它们是否是完美的立方体

比如说,

cubes = map (\x -> x*x*x) [1..]
is_cube n = n == (head $ dropWhile (<n) cubes)
cubes=map(\x->x*x*x)[1..]
is_cube n=n==(head$dropWhile(几个注释:

  • 如果您有有限多个立方体,请将它们放入
    Data.IntSet
    。查找是对数时间。算法基于Patricia树和Gill和Okasaki的论文

  • 如果排序列表中有无限多个多维数据集,则可以进行二进制搜索。从索引1开始,将其对数加倍多次,直到得到足够大的值,然后再以对数方式执行更多步骤以查找整数或排除整数。但不幸的是,对于列表,每次查找都与索引的大小成正比。而且,您不能使用常量时间查找创建无限数组

在此背景下,我提出以下数据结构:

多维数据集排序数组的排序列表。位于
i
位置的数组包含
exp(2,i)
元素

然后就有了稍微复杂一点的二进制搜索形式。
我还没有清醒到可以从头开始分析的程度,但我相信这会让你陷入O((logn)^2)最坏的情况。

你可以在懒惰的无限树上进行斐波那契搜索(或任何你喜欢的搜索):

data Tree a = Empty
            | Leaf a
            | Node a (Tree a) (Tree a)

rollout Empty = []
rollout (Leaf a) = [a]
rollout (Node x a b) = rollout a ++ x : rollout b

cubes = backbone 1 2 where
    backbone a b = Node (b*b*b) (sub a b) (backbone (b+1) (a+b))

    sub a b | (a+1) == b = Leaf (a*a*a)
    sub a b | a == b = Empty
    sub a b = subBackbone a (a+1) b

    subBackbone a b c | b >= c = sub a c
    subBackbone a b c = Node (b*b*b) (sub a b) (subBackbone (b+1) (a+b) c)

is_cube n = go cubes where
    go Empty = False
    go (Leaf x) = (x == n)
    go (Node x a b) = case (compare n x) of
                          EQ -> True
                          LT -> go a
                          GT -> go b