我有一组项目,我想从中选择 DISSIMILAR 元组(稍后将详细介绍不同元组的定义)。该集合可能包含数千个项目,但通常仅包含数百个。
我正在尝试编写一个通用算法,该算法将允许我从原始集合中选择 N 个项目来形成一个 N 元组。新的一组选定的 N 元组应该是DISSIMILAR。
当且仅当:
- 出现在 A 中的每一对(2 元组)都不会出现在 B 中
注意:对于这个算法,如果一个 2 元组(对)包含相同的元素,则认为它是 SIMILAR/IDENTICAL,即 (x,y) 被认为与 (y,x) 相同。
这是经典Urn Problem的(可能的变体) 。该算法的简单(伪代码)实现将类似于以下内容
def fetch_unique_tuples(original_set, tuple_size):
while True:
# randomly select [tuple_size] items from the set to create first set
# create a key or hash from the N elements and store in a set
# store selected N-tuple in a container
if end_condition_met:
break
我认为这不是最有效的方法——虽然我不是算法理论家,但我怀疑这个算法运行的时间不是O(n) ——事实上,它可能更有可能是O (n!)。我想知道是否有更有效的方法来实现这种算法,最好是减少时间到O(n)。
实际上,正如 Mark Byers 所指出的,还有第二个变量m
,即被选择元素数量的大小。这个(即m
)通常在 2 到 5 之间。
关于示例,这将是一个典型的(尽管缩短了)示例:
original_list = ['CAGG', 'CTTC', 'ACCT', 'TGCA', 'CCTG', 'CAAA', 'TGCC', 'ACTT', 'TAAT', 'CTTG', 'CGGC', 'GGCC', 'TCCT', 'ATCC', 'ACAG', 'TGAA', 'TTTG', 'ACAA', 'TGTC', 'TGGA', 'CTGC', 'GCTC', 'AGGA', 'TGCT', 'GCGC', 'GCGG', 'AAAG', 'GCTG', 'GCCG', 'ACCA', 'CTCC', 'CACG', 'CATA', 'GGGA', 'CGAG', 'CCCC', 'GGTG', 'AAGT', 'CCAC', 'AACA', 'AATA', 'CGAC', 'GGAA', 'TACC', 'AGTT', 'GTGG', 'CGCA', 'GGGG', 'GAGA', 'AGCC', 'ACCG', 'CCAT', 'AGAC', 'GGGT', 'CAGC', 'GATG', 'TTCG']
# Select 3-tuples from the original list should produce a list (or set) similar to:
[('CAGG', 'CTTC', 'ACCT')
('CAGG', 'TGCA', 'CCTG')
('CAGG', 'CAAA', 'TGCC')
('CAGG', 'ACTT', 'ACCT')
('CAGG', 'CTTG', 'CGGC')
....
('CTTC', 'TGCA', 'CAAA')
]
[[编辑]]
实际上,在构建示例输出时,我已经意识到我之前给 UNIQUENESS 的定义是不正确的。由于这一发现,我更新了我的定义并引入了一个新的 DISSIMILARITY 指标。