【问题标题】:Data Structure which allows efficent searching of objects允许有效搜索对象的数据结构
【发布时间】:2017-01-15 19:25:48
【问题描述】:

我有一个非常大的对象数据库(读取一组键/值对,如标准 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}
}

这种解决方案至少将问题减少到大量比较,但是有更好的方法吗?请注意,我几乎没有接受过正式的计算机科学培训,因此我可能遗漏了一些简化或证明不可能解决此问题的主要细节。

附:这是too broad?如果是这样,我很乐意删除它

【问题讨论】:

  • 对所有属性的单个索引会在相同的值针对不同的行和属性多次出现时造成困难,并且通过增加要搜索的值的空间来增加查找时间。更好的选择可能是每个属性都有一个索引,并将每个值与一个位置数组相关联。
  • @reaanb 在我快速实现的那个解决方案中,它只是准备了一个由这些对象组成的数组,结果非常快
  • 当然,我说的不是数量级差异。对于 n 个对象和 p 个属性,二分搜索需要对组合索引进行 log(np) 比较,对单独的索引进行 log(n) 比较。更重要的是在索引中查找值时知道对象的哪个属性匹配的能力。
  • @reaanb 没错,但你可以在准备阶段标记它,不是吗?我真正关心的唯一事情是(1)准备时间和(2)搜索时间和准确性,可搜索数据库的最终大小对我来说并不重要(只要它是合理的大小)
  • 我不确定您的标记方案将如何工作。使用我的方案应该会稍微减少准备时间,因为插入到较小的索引中应该更快。组合索引似乎更适合全文搜索,而对于特定属性的搜索,我更喜欢单独的索引,例如 a == 32

标签: database algorithm data-structures


【解决方案1】:

您的组合索引更适合全文搜索,但不指示在对象的哪个属性中找到值。另一种提供更多上下文的技术是为每个属性建立一个索引。

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

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

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多