一个hwk问题,显然也是一个常见的面试问题,我遇到了麻烦:
“编写一个算法(伪代码),打印出一组n个元素中三个元素的所有子集。此集合的元素存储在作为算法输入的列表中。“
因此,例如,如果S = {1,2,3,4},算法将打印出这四种组合:
123 124 134 234
有人能提出他们的想法/解决方案吗?
答案 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有一个优雅的解决方案。
答案 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;