Algorithm 按需返回n中k个元素的连续组合的算法
演示如何编写一个算法,一次从n中吐出k个元素的所有组合,避免排列。但是,如何编写一个算法,在不预先计算和存储它们的情况下,根据需要给出下一个组合呢?它将用符号n和整数k的有序集合初始化,然后调用它以返回下一个组合Algorithm 按需返回n中k个元素的连续组合的算法,algorithm,combinations,Algorithm,Combinations,演示如何编写一个算法,一次从n中吐出k个元素的所有组合,避免排列。但是,如何编写一个算法,在不预先计算和存储它们的情况下,根据需要给出下一个组合呢?它将用符号n和整数k的有序集合初始化,然后调用它以返回下一个组合 伪代码或一篇好的英语叙述对我来说很好——除了Perl和C以及一点Java之外,我还不太流利。下面是如何做到这一点的散文描述。从您最喜欢的生成所有组合的迭代算法开始。然后将每个循环变量转换为状态变量,并将其打包为一个类。用k和n构造一个类的实例,并根据算法初始化每个状态变量。下面是如何实
伪代码或一篇好的英语叙述对我来说很好——除了Perl和C以及一点Java之外,我还不太流利。下面是如何做到这一点的散文描述。从您最喜欢的生成所有组合的迭代算法开始。然后将每个循环变量转换为状态变量,并将其打包为一个类。用k和n构造一个类的实例,并根据算法初始化每个状态变量。下面是如何实现这一点的散文描述。从您最喜欢的生成所有组合的迭代算法开始。然后将每个循环变量转换为状态变量,并将其打包为一个类。用k和n构造类的实例,并根据算法初始化每个状态变量。您可以通过将这些算法转换为。这要求您在连续的nextELement调用之间保存算法的状态
如果您的语言支持协同程序,则可以更轻松地转换代码。Python和C都有一个yield关键字,可以用来将控制权转移回调用函数,同时保留正在执行的算法的状态。您可以通过将这些算法转换为。这要求您在连续的nextELement调用之间保存算法的状态 如果您的语言支持协同程序,则可以更轻松地转换代码。Python和C都有一个yield关键字,可以用来将控制权转移回调用函数,同时保留正在执行的算法的状态。原文 跳到下面的更新 让我们假设n个元素是整数1..n。 以递增的顺序表示每个k-组合此表示消除了k-组合中的置换。 现在考虑n个元素的k个组合之间的字典序。换句话说,{i_1..i_k}<{j_1..j_k}如果存在这样的索引t i_s=所有s
SequenceableCollection >> #nextChoiceFrom: n
| next k r ar |
k := self size.
(self at: 1) = (n - k + 1) ifTrue: [^nil].
next := self shallowCopy.
r := (self at: k) = n
ifTrue: [(1 to: k-1) findLast: [:i | (self at: i) + 1 < (self at: i+1)]]
ifFalse: [k].
ar := self at: r.
r to: k do: [:i |
ar := ar + 1.
next at: i put: ar].
^next
原文
跳到下面的更新
让我们假设n个元素是整数1..n。
以递增的顺序表示每个k-组合此表示消除了k-组合中的置换。
现在考虑n个元素的k个组合之间的字典序。换句话说,{i_1..i_k}<{j_1..j_k}如果存在这样的索引t
i_s=所有sSequenceableCollection >> #nextChoiceFrom: n
| next k r ar |
k := self size.
(self at: 1) = (n - k + 1) ifTrue: [^nil].
next := self shallowCopy.
r := (self at: k) = n
ifTrue: [(1 to: k-1) findLast: [:i | (self at: i) + 1 < (self at: i+1)]]
ifFalse: [k].
ar := self at: r.
r to: k do: [:i |
ar := ar + 1.
next at: i put: ar].
^next
你比我快,所以我会简化一下。前两个项目可能是:找到最大的r,使i_r-r