[英]Combinatorics algorithm for extracting subsets of lists for a password cracker
[英]Combinatorics: Trying to figure algorithm (about subsets)
我正在嘗試解決TopCoder上的問題。 基本上我需要的是以下算法:
令S = [1,2,...,n]為序列。 令m小於n。
1)找到大小為m的S的所有子序列(這很容易-n ^ m)。
2)找到大小為m的S的所有子序列,其中元素按降序排列。
3)找到大小為m的S的所有子序列,其中不允許重復元素(這也很容易-(n!)/((nm)!)。
4)找到大小為m的S的所有子序列,這些元素的順序為非遞減且不允許重復。
仍在嘗試尋找第2部分和第4部分的公式。將提供一點幫助。
提前致謝。
編輯:
原始問題:
https://docs.google.com/document/d/1X1VK8Vq2DlqMbZpXHGLoWv9ULfRLVoLtMTRRU5nh5qs/edit?usp=sharing
解決4),請注意,不重復“不減少”表示“增加”。 將由S
構建的長度為m
的所有長度序列的集合划分為沒有重復元素的等價類,該等價類由子序列中出現的元素集合定義。 在每個等價類中,只有一個遞增的序列(元素按<
排序)。 每個等價類的大小是元素的排列數量。 因此4)序列的數量為(n!)/((nm)! * m!) = n \\choose m
。
ad 2),將序列建模為S
所有元素的出現次數序列(包括0表示不包含在內)。 這可以寫成成對的序列(s_i, k_i), i=1..n; s_i \\in S, k_i \\in IN, \\foreach p,q in {1..n}, p!=q: s_p != s_q
(s_i, k_i), i=1..n; s_i \\in S, k_i \\in IN, \\foreach p,q in {1..n}, p!=q: s_p != s_q
長度為n
(s_i, k_i), i=1..n; s_i \\in S, k_i \\in IN, \\foreach p,q in {1..n}, p!=q: s_p != s_q
。 “不減少”表示通過根據增加s_i
排列元素而給出的序列的唯一允許排序。 因此,唯一的自由度是必須遵守求和為m的約束的出現次數: sum_{i=1..n} k_i = m
。
此問題等效於具有(特定)限制並計算晶格路徑的分區。 我不認為滿足這種條件的IN^n
的n元組的數量沒有封閉的公式。
但是,有一種標准算法可以枚舉所有可能性,例如。 這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.