Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用哈希表和/或尝试的字谜算法_Java_Algorithm_Anagram - Fatal编程技术网

Java 使用哈希表和/或尝试的字谜算法

Java 使用哈希表和/或尝试的字谜算法,java,algorithm,anagram,Java,Algorithm,Anagram,我已经在互联网上搜索了一段时间,寻找使用哈希表和trie查找字符串(单词)的所有字谜(即团队生成单词tame)的步骤。我在这里所发现的就是验证这两个单词是否是字谜。我想更进一步,用英语找到一个算法,这样我就可以用Java编程了 比如说, 循环遍历所有字符 对于每个唯一字符,将其插入哈希表 等等 我不想要一个完整的程序。是的,我正在练习面试。如果出现这个问题,我会知道它,知道如何解释它,而不仅仅是记住它。 String到char[] 对其排序char[] 从排序的char[]生成String

我已经在互联网上搜索了一段时间,寻找使用哈希表和trie查找字符串(单词)的所有字谜(即团队生成单词tame)的步骤。我在这里所发现的就是验证这两个单词是否是字谜。我想更进一步,用英语找到一个算法,这样我就可以用Java编程了

比如说,

  • 循环遍历所有字符
  • 对于每个唯一字符,将其插入哈希表
  • 等等
我不想要一个完整的程序。是的,我正在练习面试。如果出现这个问题,我会知道它,知道如何解释它,而不仅仅是记住它。

  • String
    char[]
  • 对其排序
    char[]
  • 从排序的
    char[]生成
    String
  • 将其用作
    HashMap
  • 将当前原始字符串插入关联值列表
例如

car、acr、rca、abc

acr: car, acr, rca
abc: abc

“编程珍珠”一书中引用了一些人的话,最简洁的回答是(意译):

“按此方式排序(波浪从左到右水平移动),然后按此方式排序(波浪从上到下垂直移动)”

这意味着,从一列表(word)开始,创建一个两列表:(sorted_word,word),然后在第一列对其进行排序

现在要查找单词的字谜,首先计算排序后的单词,并对其在表的第一列中的第一个匹配项进行二进制搜索,然后在第一列相同的情况下读取第二列的值

输入(不需要排序):

按“此方式”排序(水平):

排序为“那样”(垂直):

查找“团队”->“aemt”


就哈希表/尝试而言只有在您希望稍微加快查找速度的情况下,它们才会出现在图片中。使用哈希表,可以根据第一列的哈希值将2列垂直排序的表划分为k个分区。这将给您一个恒定的加速因子,因为您只需要在一个分区内进行二进制搜索。尝试是一种不同的优化方法,通过帮助您避免进行太多的字符串比较,您可以为trie中的每个终端挂起表的适当部分的第一行索引。

哈希表不是最佳解决方案,因此我怀疑您是否需要使用它们

查找字谜对(据我所知)的最简单方法如下:

将字符映射如下:

a->2 b->3 c->5 d->7

以此类推,字母a..z被映射到前26个素数

将单词中每个字符的字符值相乘,称之为“字谜号”。很容易看到团队和TAME将产生相同的数字。事实上,两个不同单词的字谜值是相同的,当且仅当它们是字谜时


因此,在两个列表之间查找字谜的问题简化为查找出现在两个列表上的字谜值。这很容易做到,通过对每个列表按字谜编号进行排序,然后逐步查找公共值,以nlog(n)次为单位。

@user2864740抱歉。我不清楚。我刚刚编辑了我的示例。单词团队产生了一个名为Tame@atomman的单词,这是一个非常好的链接。然而,根据一些采访者的说法,递归的开销如此之高,以至于有些人正在寻找使用哈希表或尝试的实现。@JigarJoshi,我们花了很长时间才摆脱了
采访问题,请不要重新引入它。这是我一直在寻找的,但我不清楚您的步骤。例如,使用“团队”这个词和你的步骤:1T“E”A“M”2A“E”M“T”3。AEMT 4。地图上只有一个项目,我在完成输入之前按了Enter。例如,使用单词Team和您的步骤:1)“T”E“A”M“2”A“E”M“T”3)“AEMT”4。地图中只有一项,AEMT Bullet 4:字符串列表中有什么?根据您的步骤,地图似乎只包含一个键为“AEMT”的项目。根据我的步骤,将有
{AEMT:{TEAM,AEMT}}
感谢您的解释,但我不明白您是如何从输入部分到排序的“this way”部分的?你是如何通过算法找到第二列的?我的问题是用单词中的字母找到我能找到的所有有效单词。@Allen
elephant->aeehlnpt
xerox->eorxx
谢谢->ahknst
for->for
the
eht
解释->aaeilnotx
。。了解了?
mate
tame
mote
team
tome
aemt, mate
aemt, tame
emot, mote
aemt, team
emot, tome
aemt, mate
aemt, tame
aemt, team
emot, mote
emot, tome
aemt, mate
aemt, tame
aemt, team