如何实现列表的组合

时间:2015-04-01 02:19:39

标签: kdb

所有

我需要获得列表的组合和排列。

已针对排列实施了一项功能。

perm:{[N;l]$[N=1;l;raze .z.s[N-1;l]{x,/:y except x}\:l]}

但是,我不知道组合,就像这样:

l: 1 2 3
comb[2;l]
1 2
1 3
2 3

l: 1 2 3 4
comb[3;l]
1 2 3
1 2 4
1 3 4
2 3 4

谢谢!

2 个答案:

答案 0 :(得分:1)

从您的解决方案中,您可以:

q)comb:{[N;l]$[N=1;l;raze .z.s[N-1;l]{x,/:y where y>max x}\:l]}
q)comb[2;1 2 3]
1 2
1 3
2 3

使用over的另一种方法:

q)perm:{{raze x{x,/:y except x}\:y}[;y]/[x-1;y]}
q)comb:{{raze x{x,/:y where y>max x}\:y}[;y]/[x-1;y]}

答案 1 :(得分:0)

一种选择是使用这样的排列函数:

q) comb:{[N;l]  distinct asc each  perm[N;l] }

q)l: 1 2 3 4
q) comb[3;l]

输出:

1 2 3

1 2 4

1 3 4

2 3 4

注意:由于asc,这会更改元素的顺序。因此,如果您的列表中包含(1 3 2),则会提供(1 2 3)

要维护顺序,请使用任何其他函数/逻辑代替asc来过滤集合中的重复元素(例如:(1 2 3)(1 3 2)是重复的)。