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