我有一个特定范围内的数字(通常从 0 到大约 1000)。算法会从这个范围内选择一些数字(大约 3 到 10 个数字)。这种选择经常进行,我需要检查是否已经选择了所选数字的排列。
例如,一个步骤选择[1, 10, 3, 18]
另一个步骤,[10, 18, 3, 1]
然后第二个选择可以被丢弃,因为它是一个排列。
我需要非常快地进行这项检查。现在我将所有数组放在一个哈希图中,并使用一个自定义哈希函数:只是对所有元素求和,所以 1+10+3+18=32,还有 10+18+3+1=32。对于 equals,我使用 bitset 快速检查元素是否在两个集合中(使用 bitset 时我不需要排序,但它仅在数字范围已知且不太大时才有效)。
这可以正常工作,但会产生大量冲突,因此经常调用 equals() 方法。我想知道是否有更快的方法来检查排列?
有没有好的排列散列函数?
更新
我做了一个小基准测试:生成 0 到 6 范围内的所有数字组合,以及 1 到 9 的数组长度。有 3003 种可能的排列,一个好的散列应该生成接近这么多不同的散列(我使用 32 位数字对于哈希):
- 仅添加 41 个不同的哈希(因此有很多冲突)
- 8 种不同的哈希值一起进行异或运算
- 286 种不同的哈希乘法
- (R + 2e) 的 3003 个不同的哈希值并按照 abc 的建议相乘(对 R 使用 1779033703)
所以 abc 的 hash 可以计算得非常快,而且比其他的都好很多。谢谢!
PS:我不想在不需要时对值进行排序,因为这会变得太慢。