|
合成一个SQL: (最后的求和没有做)
WITH c AS ( ---- 求出所有NUM个不同字符构成的四位编码
SELECT num,n,POWER(2,ROW_NUMBER() OVER(PARTITION BY num ORDER BY n)) id
FROM (SELECT 4-NVL(LENGTH(TRANSLATE('ABCD','$'||n,'$')),0) num,n
FROM (SELECT REPLACE(SYS_CONNECT_BY_PATH(n,','),',') n
FROM (SELECT CHR(64+ROWNUM) n FROM DUAL CONNECT BY ROWNUM<=4)
WHERE LEVEL=4
CONNECT BY LEVEL<=4
)
)
WHERE TRANSLATE(n,'$'||SUBSTR('ABCD',1,num),'$') IS NULL
)
,s AS ( ----求出所有发生冲突的编码
SELECT t1.num,t1.id,t1.n,SUM(t2.id) rev_bits ---- 这些都是不能出现的id, 每个占一位,按照二进制的位求和就得到所有发生冲突的id的一个总集合
FROM c t1,c t2
WHERE t1.num=t2.num AND
t2.n IN (t1.n
--- 两位反序
,SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)||SUBSTR(t1.n,3,2) -- 2134
,SUBSTR(t1.n,1,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,4,1) -- 1324
,SUBSTR(t1.n,1,2)||SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1) -- 1243
--- 三位反序
,SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)||SUBSTR(t1.n,4,1) -- 3214
,SUBSTR(t1.n,1,1)||SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1) -- 1432
--- 四位反序
,SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1) -- 4321
)
GROUP BY t1.num,t1.id,t1.n
)
,t(num,id,cnt,bits,path) AS ( ---- 递归求出所有不冲突的编码的集合
SELECT num,id,1,id,n FROM s
UNION ALL
SELECT t.num,s.id,t.cnt+1,t.bits+s.id,t.path||','||s.n
FROM t,s
WHERE t.num=s.num AND t.id<s.id AND BITAND(t.bits,s.rev_bits)=0 ---- 和所有ID都没有冲突
)
SELECT cnt,path FROM (SELECT t.*,ROW_NUMBER() OVER(PARTITION BY num ORDER BY cnt DESC) rn FROM t)
WHERE rn=1
;
CNT PATH
---------- -----------------------------------------------------------------------------------
1 AAAA
4 ABBA,ABBB,BAAA,BAAB
15 AACB,ABAC,ABCB,ABCC,ACBA,BABC,BACA,BBCA,BCAB,BCAC,CABB,CABC,CBAA,CBCA,CCAB
8 ACBD,ADCB,BADC,BDCA,CADB,CBAD,DBAC,DCBA
Elapsed: 00:00:24.17 |
|