是否存在大型二维数组的搜索算法?

时间:2012-05-23 23:09:52

标签: ruby algorithm search multidimensional-array

这不是一个现实生活中的问题,只是理论上的制作。

我有一个大数组,其中包含[1,140,245,123443]等所有元素 具有低选择性的整数或浮点数,唯一值的数量为10 次数小于数组的大小。在这种情况下,B *树索引不好。

我也试图实现位图索引,但在Ruby中,二进制操作并不是那么快。

是否有任何好的算法可以搜索固定大小矢量的二维数组?

而且,主要的问题是,如何转换值中的向量,其中转换函数必须是单调的,因此我可以应用范围查询,例如:

(v[0]<10, v[2]>100, v[3]=32, 0.67*10^-8<v[4]<1.2154241410*10^-6)

我唯一的想法是为矢量的每个组件创建单独的排序索引...二进制搜索然后合并...但这是一个坏主意,因为在最坏的情况下它将需要O(N * N )操作...

2 个答案:

答案 0 :(得分:2)

假设每个“列”在已知范围内模糊地均匀分布,您可以跟踪每列的一系列桶以及满足桶的行列表。每列的桶数可以相同也可以不同,它完全是任意的。更多的桶更快,但需要稍微更多的内存。

my table:
range:    {1to10} {1to4m}    {-2mto2m}
row1:     {7      3427438335 420645075}
row2:     {5      3862506151 -1555396554}
row3:     {1      2793453667 -1743457796}

buckets for column 1:
bucket{1-3} : row3
bucket{4-6} : row2
bucket{7-10} : row1

buckets for column 2:
bucket{1-2m} : 
bucket{2m-4m} : row1, row2, row4

buckets for column 3:
bucket{-2m--1m} : row2, row3
bucket{-1m-0} : 
bucket{0-1m} : 
bucket{1m-2m} : row1

然后,根据一系列标准:{v[0]<=5, v[2]>3*10^10},我们提取符合该条件的存储桶

 column 1:
v[0]<=5 matches buckets {1-3} and {4-6}, which is rows 2 and 3.
 column 2:
v[2]>3*10^10} matches buckets {2m-4m} and {4-6}, which is rows 1, 2 and 3.
 column 3:
"" matches all , which is rows 1, 2 and 3.

现在我们知道我们要查找的行符合所有三个条件,因此我们列出了匹配所有条件的桶中的所有行,在本例中为第2行和第3行。即使对于大量数据量,剩余的行数也会很小,具体取决于您的存储桶的粒度。您只需检查此时剩下的每一行,看它们是否匹配。在此示例中,我们看到第2行匹配,但第3行不匹配。

这个算法技术上 O(n),但实际上,如果你有大量的小桶,这个算法可以非常快。

答案 1 :(得分:0)

使用索引:)

基本思想是将二维数组转换为一维排序数组(同时保持原始位置)并在后面应用二进制搜索。

此方法适用于任何n维数组,并被数据库广泛使用,可被视为具有可变长度的n维数组。