【发布时间】:2016-07-27 22:21:36
【问题描述】:
输入是G系列和P系列两个数据集,是真实数据中的字符串。
X = 3,
G series
G1
G2
G3
Y = 2,
P series
P1
P2
G 系列的 X 数量始终 > = P 系列的 Y 数量。
我想将所有可能匹配的可用 P 值返回到 G 值,但所有相同的 P 值都分配给 G。在每个组中,G 值的序列是固定的,始终是 G1、G2、G3。
预期结果之一:
1 G1 P1
1 G2 P1
1 G3 P2
---------------
2 G1 P2
2 G2 P2
2 G3 P1
---------------
3 G1 P1
3 G2 P2
3 G3 P1
---------------
4 G1 P2
4 G2 P1
4 G3 P2
---------------
5 G1 P1
5 G2 P2
5 G3 P2
---------------
6 G1 P2
6 G2 P1
6 G3 P1
如您所见,对于 X = 3、Y = 2,我想要 6 或 X*Y 组可能的配对排列:
| Group 1 | Group 2 | Group 3 | Group 4 | Group 5 | Group 6 |
-----------------------------------------------------------
| G1 P1 | G1 P2 | G1 P1 | G1 P2 | G1 P1 | G1 P2 |
| G2 P1 | G2 P2 | G2 P2 | G2 P1 | G2 P2 | G2 P1 |
| G3 P2 | G3 P1 | G3 P1 | G3 P2 | G3 P2 | G3 P1 |
P 值到 G1 - G3 的模式: 换句话说,需要像 112,221,121,212,122,211 这样的 P 组合。 但是不需要 111、222 个 P 值。对六组的任何排序方式都开放,只要所有排列都列出。
由于所有相同的 P 都分配给同一组中的 G,因此不需要以下组合:
1 G1 P1
1 G2 P1
1 G3 P1
-----------
2 G1 P2
2 G2 P2
2 G3 P2
我的计划: 先做两个数据集的笛卡尔积:
1 G1 P1
2 G1 P2
3 G2 P1
4 G2 P2
5 G3 P1
6 G3 P2
然后插入 X 个笛卡尔积,并希望创建笛卡尔积的组合序列以获得预期结果,但我无法从中找到模式。
1 G1 P1
2 G2 P1
3 G3 P2
4 G1 P2
5 G2 P2
6 G3 P1
7 G1 P1
8 G2 P2
9 G3 P1
10 G1 P2
11 G2 P1
12 G3 P2
13 G1 P1
14 G2 P2
15 G3 P2
16 G1 P2
17 G2 P1
18 G3 P1
另外,您可能会注意到可能的结果有 X * (Y^X - Y) 行,在上述情况下,当 X = 3 和 Y = 2 时,它是 3*(2^3-2) = 18 行和 6组或 (Y^X - Y)。
此过程会创建不需要的序列:
Create or replace Procedure Permutation ( X in Number, Y in Number )
AS j Number:=1;
Begin
For k in 1 .. X
Loop
For i in 1 .. X*Y
Loop
CASE
WHEN i = 1 THEN
Insert into Table_1 ("INJECTION") values ( j );
Commit;
WHEN mod(i,2)= 0 Then
j := j + X ;
Insert into Table_1 ("INJECTION") values ( j );
Commit;
WHEN mod(i,2)<>0 then
j := j - Y ;
Insert into Table_1 ("INJECTION") values ( j );
Commit;
End CASE;
End Loop;
j := j + 1;
Commit;
End Loop;
EXCEPTION
WHEN OTHERS
THEN
null;
End;
结果:1,4,2,5,3,6,7,10,8,11,9,12,13,16,14,17,15,18
1 G1 P1 1
2 G1 P2 4
3 G2 P1 2
4 G2 P2 5
5 G3 P1 3
6 G3 P2 6
7 G1 P1 7
8 G1 P2 10
9 G2 P1 8
10 G2 P2 11
11 G3 P1 9
12 G3 P2 12
13 G1 P1 13
14 G1 P2 16
15 G2 P1 14
16 G2 P2 17
17 G3 P1 15
18 G3 P2 18
对你有以下的数字进行排序,这正是不想要的结果:
1 G1 P1 1
3 G2 P1 2
5 G3 P1 3
2 G1 P2 4
4 G2 P2 5
6 G3 P2 6
7 G1 P1 7
9 G2 P1 8
11 G3 P1 9
8 G1 P2 10
10 G2 P2 11
12 G3 P2 12
13 G1 P1 13
15 G2 P1 14
17 G3 P1 15
14 G1 P2 16
16 G2 P2 17
18 G3 P2 18
我想知道是否有更好的方法来处理这个问题? 数组?等级?
感谢您的投入,非常感谢。
更新:
我在考虑算法,本质上是关于从
一个P数组[P1,P2,P3,..PY]
进入G数组[G1,G2,G3...GX]
Python 3.5.2,
Create When X = 3, Y = 2, p = [1,2]
import itertools
for product in itertools.product([1,2],repeat=3):
print (product)
(1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 2, 2)
(2, 1, 1)
(2, 1, 2)
(2, 2, 1)
(2, 2, 2)
这正是我想要的结果,除了所有重复项,(1,1,1) 和 (2,2,2)...
【问题讨论】:
-
您需要明确您的要求。您预期结果的前五行与不想要的组合的前五行完全相同。这两个列表有何不同?
-
感谢您的评论,克里斯蒂安。如果您再看一遍,可能会注意到 Not Wanted 结果与同一组中的 G1、G2、G3 具有相同的 P 值,例如 G1P1、G2P1、G3P1 和 G1P2、G2P2、G3P2。预期结果是 G1P1、G2P1、G3P2 等组;组内的 P 值并不完全相同。
-
也许您需要定义组的含义?我看到诸如 G1P1 和 G2P1 之类的配对在通缉名单和不通缉名单中都出现了不止一次,您的问题中没有任何内容可以解释这种情况。
-
是的,我刚刚修改了问题,希望它更容易理解。在每个组中,所有 G 值都按固定顺序 G1、G2、G3,我想将 P 值与每个 G 值配对,不包括 G1 P1、G2 P1、G3 P1 之类的配对。和 G1 P2、G2 P2、G3 P2。谢谢你的耐心,克里斯蒂安。
-
好的,所以对于 X=3 和 Y=2,您需要六个组。每个组应包含 G(可能值 1..X)和 P(可能值 1..Y)的可能组合。任何组合都是有效的。但是在一个组中,没有两个组合应该是相同的,并且必须至少有两个不同的 P 值?
标签: sql oracle algorithm plsql permutation