我正在尝试编写一个程序,将列表中的所有字谜组合在一起,并且输出必须按字母顺序排序。我已经有一个程序按字母顺序对输入进行排序,使用heapsort在O(nlog(n))时间内完成。我的程序也对字谜进行分组,但速度太慢。我相信使用散列将提供一个有效的算法,但不太确定如何实现它。有没有人建议有效的算法来完成这项任务?
例如。
输入:
eat tea tan ate nat bat
输出:
ate eat tea
bat
nat tan
答案 0 :(得分:0)
看来你错了。根据我的理解,您首先按字母顺序对字符串进行排序,然后尝试将它们分组。
尝试相反的做法。首先,将字符串分组为字谜,然后对每个组进行排序。
可以通过各种方式对anagram进行分组,其中之一是:
Map<String,List<String>>
- 其中key是“sorted anagram”,值是包含的列表所有原始单词。答案 1 :(得分:0)
是的,哈希是。
你可以使用以下散列技术:(假设你的字符串都没有空格,只有小写字符,如果它们有大写字母,它将被区别对待(cat和Act不是字谜))< / p>
字符的哈希值将是其ascii值的平方,即
a = 97*97, b = 98*98, etc.
在每个单词中添加字符值,这将是其哈希值。
现在,将具有相同(相等)哈希值的单词组合在一起。
PS:如果cat和Act是字谜,请在计算前将A
转换为a
。
PPS:为了回应@ amit的评论,我将每个字符的ASCII值平方以减少冲突,但是,这不会完全没有碰撞。您可以使用第n个斐波纳契数的平方作为哈希值,然后添加它们。这进一步减少了碰撞。 因此,哈希值将类似于:
a = 98^2, b = 99^2, c = (98+99)^2, d = (b+c)^2 and so on...