算法 - 组合和排列

时间:2011-02-15 05:07:01

标签: algorithm performance permutation combinations

一个hwk问题,显然也是一个常见的面试问题,我遇到了麻烦:

编写一个算法(伪代码),打印出一组n个元素中三个元素的所有子集。此集合的元素存储在作为算法输入的列表中。“

因此,例如,如果S = {1,2,3,4},算法将打印出这四种组合:

123 124 134 234

有人能提出他们的想法/解决方案吗?

4 个答案:

答案 0 :(得分:10)

递归:

def subset (prefix, list, count):
    if count is 0:
        print prefix
        return
    for each element in list:
        subset (prefix & element, list beyond element, count - 1)

subset ("", {1,2,3,4}, 3)

Python概念证明:

def subset (prefix, list, count):
    if count is 0:
        print prefix
        return
    for i in range (len(list)):
        subset ("%s%s"%(prefix,list[i]), list[i+1:], count - 1)

subset ("", "1234", 3)

输出,输出字符串的各种值(第二个参数为subset):

123456   12345   1234   123   12
------   -----   ----   ---   --
123      123     123    123
124      124     124
125      125     134
126      134     234
134      135
135      145
136      234
145      235
146      245
156      345
234
235
236
245
246
256
345
346
356
456

答案 1 :(得分:3)

第4卷的Knuth's fascile 2有一个优雅的解决方案。

http://cs.utsa.edu/~wagner/knuth/

编辑:它是分册3A http://cs.utsa.edu/~wagner/knuth/fasc3a.pdf

答案 2 :(得分:2)

递归思考。你想要长度为3的子集。我能做的是,对于子集中的所有n,我将简单地将所有长度为2的子集附加到n。在考虑长度2时,我不会考虑1到n的任何元素,因为这些元素已经处理过了。 所有n的S(3,n)= n.S(2,n + 1);

e.g。当n = 1时,我将创建长度为2的所有子集以及其余元素。 (2,3),(3,4),(2,4)。现在附上1我会得到(1,2,3),(1,3,4),(1,2,4)。我将继续这个2.只有在创建长度为2的子集时才2,我不会考虑1.所以我只有一个长度为2(3,4)的子集。将其附加到2我得到(2,3,4)并将我得到的所有结合起来 (1,2,3),(1,3,4),(1,2,4),(2,3,4)。

答案 3 :(得分:1)

当S = {1,2,3,4}和n = 3时,我首先尝试解决它的具体情况,但后来我决定只为S = m元素列表和n任意做数> = 1。另外,这是我在Java中的第一个程序:)所以我希望你喜欢!

SELECT w.*
FROM tbl_Worker as w INNER JOIN
     (SELECT Personeelsnummer, MAX(GeldigOp) as max_GeldigOp
      FROM tbl_Worker
      GROUP BY Personeelsnummer
     ) as ww
     ON ww.Personeelsnummer = w.Personeelsnummer and ww.max_GeldigOp = w.GeldigOp;