【问题标题】:What is the fastest way to lookup an item from a small set of items by key?按键从一小组项目中查找项目的最快方法是什么?
【发布时间】:2020-12-15 21:36:47
【问题描述】:

假设我有一个 class 和一个 fields 数组。每个字段都有一个name。基本上,就像一个 SQL 表。

 class X {
   foo: String
   bar: String
   ...
 }

构建数据结构和算法以通过键获取字段的方法是什么,以便(a)在操作数量方面快速,并且(b)在内存/数据结构方面最小尺寸?

显然,如果您知道该字段的索引,最快的方法是通过数组中的 index 查找该字段。但我需要通过 key 找到这些。

现在,每个类的键数将相对较少。在此示例中,只有 2 个键/字段。

这样做的一种方法是创建一个哈希表,例如像this JS 中的一个。你给它键,它会遍历键中的每个字符,并通过一些混合函数运行它。但这首先取决于密钥的大小。对于我期望的不应该太大的字段名称类型来说还不错,假设它们通常不超过 100 个字符。

另一种方法是创建一个 trie。您首先必须计算 trie,然后在进行查找时,trie 的每个节点都会有一个字符,因此它需要 name.length 查找该字段的步数。

但我想知道,由于字段的数量会很小,为什么我们需要遍历字符串中的键?一种可能更简单的方法,只要字段的数量很少,就是遍历字段并对每个字段名称进行直接字符串匹配。

但就迭代次数而言,所有这 3 种技术都大致相同。

还有其他类型的魔法可以让您的迭代/步骤最少吗?

似乎有一种可能的散列算法可以利用散列表中的项目数量很少这一事实来发挥其优势。您将为每个类创建一个新的哈希表,并为其指定一个“大小”(用于此哈希表的特定类的字段数)。不知何故,也许它可以使用这个大小信息来构建一个简单的散列算法,以最大限度地减少迭代次数。

这样的事情可能吗?如果是这样,你会怎么做?如果不是,那么知道为什么不可能得到比这些更优化的结果会很有趣。

【问题讨论】:

  • 根据您存储字符串的方式和使用的语言,您可以使用字符串的指针值作为哈希值,以便快速找到它在哈希表中的位置。

标签: algorithm optimization data-structures hashtable


【解决方案1】:

字段列表有多“小”?

如果你保持字段列表按键排序,你可以使用二分搜索。

如果考虑到线性搜索的最坏情况,对于非常少量的字段(例如 4 个),它将执行与线性搜索大致相同数量的迭代和键比较。 (对于这种情况,线性搜索将非常有效(速度和内存)。)

要击败线性搜索的平均情况,您需要更多字段(例如 8 个)。

这与您的线性搜索解决方案一样具有内存效率。比 trie 解决方案更节省内存。

【讨论】:

  • 你是说二分查找比三分查找更好吗?
  • 是的,从内存和速度的角度来看。
猜你喜欢
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多