簡體   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