通过键从一小组项目中查找项目的最快方法是什么?
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 解决方案。
假设我有一个 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 解决方案。