繁体   English   中英

组合学中需要有效的算法

[英]Need efficient algorithm in combinatorics

我正在尝试找到解决加密挑战的最佳(现实)算法,其中:

  • 给定的密​​文C由集合S = {A,B,C,...,Y,a,b,c,... y}中的约6000个字符组成。 因此| S | = 50。
  • 加密方案不允许在C中具有两个相同的相邻字符
  • S中的25个字母称为Null,并且未知
  • 必须将这些空值从C中删除,以获得可以被攻击的实际密文C'。
  • C中的Null列表被命名为N和| N | 接近| C | / 2 = 3000
  • 因此:| N | + | C'| = | C |

我的目标是确定满足以下两个条件的25个Null:

  • C'中可能没有两个相同的相邻字符
  • N中可能没有两个相同的相邻Null

显然,通过蛮力在S中有25个Null的50!/(25!25!)= 126410606437752组合,因此这不是现实的方法。

我试图尽可能快地递归地探索由Null和“剪切分支”组成的树。 例如,当将字母S添加到Null的子集时,如果序列“ x n1n2 x”出现在C中,其中x尚未为Null,而n1n2为Null,则x也应为Null。 但是,对于不足几个世纪的运行时间而言,这还不够...

您能想到一种更聪明的算法来识别这25个Null吗?

注意:满足两个条件的null可能不止一组

让我们尝试这样的事情:

  • 创建一个集合列表-每个集合包含一个来自S的字符。该集合为空字符。
  • 而您有两个以上的集合:
    • 每套
      • 在密文中搜索X[<set-chars>]+X
      • 如果找到,则将集合与集合X并集。
    • 如果没有集合,则从两个集合开始递归。

如果为每个集合保留不同的密文,则可以加快处理速度,从中删除集合中的字符。 如果这样做,搜索会更容易-您正在搜索XX,女巫的长度是恒定的。 每次将两个集合合并时,都需要从密文中删除集合中的所有字符。

花费的时间取决于您给定的字符串C。

有关集合的说明-每个集合都是C'或N的选项。如果发现A和X在同一组中,则{A,X}是N或C'的子集。 如果以后您会发现关于Y和B的相同内容,那么{Y,B}是一个子集。 稍后,找到子字符串YAXAXY意味着Y与A和X在同一组中,因此B与Y在同一组中,因为它与Y在同一组。最后,您将分为两组-一组用于C',另一组用于N,巫婆无法区分。

elyashiv的方法是不错的方法。

非常快。

我制作了两组C'和N,它们是等效的。 产生C'和N的S,S1和S2子集足以使S = S1 U S2。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM