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