通过键从一小组项目中查找项目的最快方法是什么?

What is the fastest way to lookup an item from a small set of items by key?

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

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

构建数据结构和算法以通过键获取字段的方法是什么,这样它 (a) 就操作次数而言速度很快,并且 (b) 就内存/数据而言最小-结构尺寸?

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

找到这些

现在,每个 class 的键数将相对较少。在这个例子中只有 2 keys/fields.

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

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

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

但这 3 种技术在迭代次数方面大致相同。

有没有其他类型的魔法可以给你最少的iterations/steps?

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

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

字段列表有多“小”?

如果保持 field-list 按键排序,则可以使用二进制搜索。

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

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

这与您的线性搜索解决方案一样节省内存。内存效率高于 trie 解决方案。