布尔搜索数组

时间:2011-07-26 04:32:13

标签: c database algorithm database-design

我有多个数组,大约有100个可能的值,即:

a[0] = (a, b, c, d)
a[1] = (a, e)
a[2] = (d, f, g)

我想快速返回哪些数组包含(a || b)&& (d || e)

在本例中,0和1

我在考虑按位操作......就像用“1111”代表“abcd”一样; “ad”by“1001”,依此类推。然后我可以用一个按位OR解决“OR”,然后检查两者是否都是非零

任何人都可以考虑更好的解决方案吗?这个不是很实用,因为它看起来不是很容易上升

有没有可以快速完成的DBMS?我尝试使用mongodb,但似乎他们还没有添加“$和”功能(doc说它是1.9.1版本,但是我只能下载1.9.0,而且它不稳定)

我认为这是一个“布尔搜索”,类似于谷歌一直在做的...所以我猜测有一种更好的方式(可能不是那么快,但更可升级)

4 个答案:

答案 0 :(得分:1)

是的,一个按位解决方案对此非常有效。是的,一些数据库包括这样的功能,通常命名为位图列(或位图索引,取决于)。通常的建议是将它应用于具有相对较低基数的列(即,相当少的可能值,例如性别)。

答案 1 :(得分:0)

在什么意义上它不可扩展?每个(位)数组16个字节的数据也不错!我不确定你为什么要这样做DBMS;如果需要(希望是数组块),你可以将二进制数据放在那里,并将其全部用于查询。除非你计划拥有数十亿个数组。

对于少量元素,位逻辑最快。但是如果你开始远远超过100个值,那么保持数组排序并进行二进制(甚至线性!)搜索会更快。您需要在系统上进行基准测试以找到确切的截止点,但如果您的数组各有~4个元素,我通常会更快地找到线性搜索(在布尔逻辑中将您要查找的元素的出现计为你去),并且它在二进制表示也变得更大的同一点上胜过二进制数学。

答案 2 :(得分:0)

将数组存储为trie,例如

a
 b
  c
   d
 e
d
 f
  g

也可以从表达式创建一个trie,例如,

a
 b
  d
  e
 d
 e
b
 d
 e

您可以将后一个trie与前者匹配(忽略表达式中没有的任何值,即'c','f'和'g')以获得解决方案。我将trie表示和匹配算法的细节留给你。

答案 3 :(得分:0)

正如你所说,可能的值大约是100,但你有很多数组,我认为哈希表比位级操作更好。
例如,
 有一个哈希表设置表达式中的值,即a,b设置为1,d,e设置为2.

for each array a in arrays      
  for each value v in array
    sum+= ht[v]
    if sum == 3
      print found
      break

(上面不会有重复!) 第一个for循环可以并行化,可能是map-reduce框架甚至是openMP (顺便说一句,第二个也可以并行化!)
这应该比构造数组中的整个元素的位表示并执行AND或OR更快。你基本上受益于最好的情况(例如a和d是前2个元素!)两种方法的最坏情况相同(可能是每个元素的开销都是如此)