允许有效搜索对象的数据结构

时间:2017-01-15 19:25:48

标签: database algorithm data-structures

我有一个非常大的对象数据库(读取一个键/值对数组,如标准C表示法中的[{}, {}, {}]),我需要能够搜索该集合中任何键的任何值对并找到包含它的对象(我将使用模糊搜索或类似的字符串比较算法)。我能想到的一种方法是创建一个巨大的主对象,其中一个键引用了对象内部每个值的原始对象:

DB = [
 {
   "a": 45,
   "b": "Hello World"
 },
 {
   "a": 32,
   "b": "Testing..."
 }
]

// ... Generation Code ... //

search = {
  45: {the 0th object},
  "Hello World": {the 0th object},
  32: {the 1st object},
  "Testing...": {the 1st object}
}

这个解决方案至少可以将问题简化为大量的比较,但是有更好的方法吗?请注意,我没有正式的计算机科学培训,所以我可能会遗漏一些重要的细节,简化或证明这个问题不可能。

P.S。这是too broad吗?如果是这样,我很乐意将其删除

1 个答案:

答案 0 :(得分:1)

您的组合索引更适合全文搜索,但不指示找到值的对象的属性。提供更多上下文的替代技术是为每个属性构建索引。

在准备和查找特定属性的搜索器(例如a == 32)时,这应该更快,因为对于n个对象和p属性,二进制搜索(在插入和查找中使用)将需要log(np) )对单一属性索引上的组合索引和log(n)进行比较。

在任何一种情况下,您都需要注意多次出现的相同值。您可以将偏移数组存储为每个索引条目的值,而不是仅存储单个值。

例如:

search = {
  "a": {
    45: [0],
    32: [1]
  },
  "b": {
    "Hello World": [0],
    "Testing...": [1]
  }
}