|
|
1
0
如何计算列表中所有元素的哈希代码之和,每个元素乘以一个任意值? 有点像
|
|
|
2
15
因此,您需要一个哈希代码计算,它为“picture”和“turepic”提供相同的结果,但(最好)不同于“expurtic”的哈希代码。因此,仅仅简单地将单词中包含的字母的哈希代码相加是不够的——您还需要一些位置信息,但是,它应该独立于单词的实际排列。您需要定义“等价类”,并始终为类的每个成员计算相同的哈希代码。 最简单的方法是 选择等价类的特定成员,并始终对所有等价词使用该变量的哈希代码。 . 例如,按字母顺序选择第一个变体(感谢@michael简明地总结)。对于“picture”等,这将是“ecurepi”。“picture”和“turepic”(以及所有其他等效变体)都应返回“cturepi”的哈希代码。散列代码可以通过标准的LinkedList方法或任何其他首选方法计算。 有人可能会说这个计算非常昂贵。是的,但是可以缓存结果,这样只有第一次计算的开销才会很大。我猜在一般情况下,第一个字母变体的选择可以得到相当多的优化(与在特定的等价类中生成所有置换的平凡解相比,然后对它们进行排序并选择第一个置换)。 例如,在许多单词中,第一个字母按字母顺序是唯一的(“picture”是其中之一-其第一个字母按字母顺序是“c”,其中只有一个“c”)。所以你只需要找到它,然后从那里开始计算散列码。如果它不是唯一的,您需要比较第二个、第三个等字母,直到您发现不同之处(或翻滚)。 更新2-示例
更新:
最后,归根结底,您到底需要多少散列代码——也就是说,您计划将循环列表放入一个像这样的关联集合中吗?
更新3:样本代码
在
算法实现于
最后,如果我还有一个候选词,它可能在单词的中间,我需要得到最小单词旋转的开始。然而,由于这是一个单独的链表,所以向后退是很难的。幸运的是,计数器很好地帮助了我:它记录了到目前为止我比较了多少个字母,但在一个循环列表中,这相当于我可以向前移动多少个字母,然后滚动过来。因此,我知道要向前移动多少个字母,以便再次到达我正在寻找的最小单词旋转的开头。 希望这能帮助别人——至少写起来很有趣——) |
|
|
3
5
你真的需要使用你的哈希码吗?如果不打算将对象成员放在任何类型的哈希结构中,则可以忽略该问题:
这满足了相同实例具有相同哈希代码的要求。除非我知道我需要一个更好的散列分布,否则这可能对我自己的需要足够好。 但我想我可能有一个想法,可以更好地分配散列。PSuedo代码:
因为hash()可能是o(n),那么这个算法是o(n^2),虽然有点慢,但是hash反映了等价性测试的方法,hash代码的分布可能相当不错。任何其他可交换的内核(prod、xor)都可以和本例中使用的和一起工作。 |
|
|
4
3
因为+是交换的,所以相等的单词将具有相等的哈希码。散列代码不是很有识别力(所有字母排列都得到相同的散列代码),但它应该做到这一点,除非您通常在散列集中放入许多排列。
注:我补充
注2:具有相同哈希代码的不相等列表do 不 违反了哈希代码的约定。这种“冲突”应该避免,因为它们会降低性能,但不会威胁程序的正确性。一般来说,碰撞可以 不 避免,尽管比起我的答案,避免它们确实是可能的,但是这样做会使哈希代码的计算成本更高,这可能比消耗任何性能增益都要高。 |
|
|
5
0
另一种方法是将这些暗语规范化,将它们表示为:
然后您将实现
|
|
|
6
0
我误解了你的问题——我认为你想要“picture”和“turepic”使用不同的haschodes;我认为在这种情况下,你可以从两个相等的对象必须具有相同的哈希代码这一事实中得到提示,但具有相同哈希代码的两个对象未必是相等的。
因此,您可以使用Vivien的解决方案,它将确保“picture”和“turepic”具有相同的哈希代码。然而,它也意味着“picture”和“pitch”也将具有相同的哈希代码。在这种情况下,您的
|
|
|
7
0
记住,哈希代码不是唯一的。两个不同的对象可以哈希到完全相同的值。因此,hashcode不足以确定相等性;您必须在equals()中进行实际比较。[删除推测性评论。OMG] hashcode()在所有情况下都只能返回一个常量。这可能会影响性能,但完全有效。一旦完成了所有其他工作,就可以使用更高效的hashcode()算法。 This is a good article . 注意“lazy hashcode”部分。 |
|
|
redcodefinal · 用另一个整数哈希一个整数[closed] 10 年前 |