基于Java中的字母频率创建char数组的排列

时间:2014-03-17 12:25:00

标签: java arrays cryptanalysis

我有一个HashMap,它以字符,整数的形式存储密文块中每个字母的频率。然后按最频繁的降序将地图分类为LinkedHashMap

然后我将这些频率与已知的字母频率列表进行比较,以尝试猜测密码字母是什么。我遇到的问题是2个或更多字母出现的次数相同。

例如,如果我们采取:

E T A O I

作为5个最常见的字母desc,然后是密文中的字母频率:

D=30 B=25 I=22 G=19 H=17

然后将D映射到E是合理的,因为它是最常见的,然后是BT等。

如果字母频率为:

D=30 B=25 I=22 G=22 H=22

目前尚不清楚IGH是否应映射到A,因为它们是B之后的下一个最常见的。

我有点卡住,需要一种方法来创建一组char数组,每个排列频率列表。这样的东西需要在char数组中输出:

DBIGH
DBIHG
DBGIH
DBGHI
DBHIG
DBHGI

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

正如您所说,您需要创建字符串IGH的每个排列(字符串和char数组可以在此处同义使用)。 This question显示了该问题的解决方案。

要查找地图中必须为其创建排列的部分,只需按频率顺序迭代地图,并跟踪第一次出现的相同频率。

修改:添加其他想法以帮助您发表评论。 基本上你可以将26个字符串分成相同频率的组。在上面的示例中,可以是三个组:DBIGH。要创建整个字符串的所有组合,您需要将每个组的所有排列与所有其他组的所有排列组合在一起。对于那些微不足道的单个字符组。但是一旦你获得了更多3个以上的字符组,它就会成为一个很长的名单......