改進的sql計算n王后
原來的版本,不能計算大於11的N,因為那使oracle的bitand溢位了。在newkid的指點下,用同列,同左斜線,同右斜線3個bitmap代替用格子標號的1個bitmap。
with p(p,r,c) as(select level,ceil(level/:n),mod(level-1,:n)+1 from dual connect by level<=:n*:n) ,w as(select p,power(2,c-1)w,power(2,:N-1+r-c)w1,power(2,r+c-2)w2 from p) ,b(board, n_queens,w,w1,w2)as( SELECT lpad('-',p-1,'-')||'*', 1 ,w,w1,w2 FROM w where p<=:N UNION all SELECT rpad(board,p-1,'-') || '*' ,N_queens + 1 ,b.w+w.w,b.w1+w.w1,b.w2+w.w2 FROM b, w WHERE n_queens <:N and p >n_queens*:N and p<=(n_queens+1)*:N and bitand(b.w,w.w)=0 and bitand(b.w1,w.w1)=0 and bitand(b.w2,w.w2)=0 ) select rpad(board,:N*:N,'-')board from b where n_queens =:N ;
計算n=12大約50秒.
with p(p,r,c) as(select level,ceil(level/:n),mod(level-1,:n)+1 from dual connect by level<=:n*:n) ,w as(select p,power(2,c-1)w,power(2,:N-1+r-c)w1,power(2,r+c-2)w2 from p) ,b(board, n_queens,w,w1,w2)as( SELECT lpad('-',p-1,'-')||'*', 1 ,w,w1,w2 FROM w where p<=ceil(:N/2) UNION all SELECT rpad(board,p-1,'-') || '*' ,N_queens + 1 ,b.w+w.w,b.w1+w.w1,b.w2+w.w2 FROM b, w WHERE n_queens <:N and p >n_queens*:N and p<=case when mod(:N,2)=1 and b.w=power(2,(:N-1)/2) -- mid of row 1 is set then (n_queens+1)*:N-(:N+1)/2 else (n_queens+1)*:N end and bitand(b.w,w.w)=0 and bitand(b.w1,w.w1)=0 and bitand(b.w2,w.w2)=0 ), hf as(select rpad(board,:N*:N,'-')board from b where n_queens =:N) select * from hf union all select listagg(reverse(substr(board,(l-1)*:N+1,:N))) within group(order by l) from hf a,(select level l from dual connect by level<=:N)b group by board ;
利用對稱,大約26秒。看來對於大的N,基本可以節約1半時間。
相關文章
- 計算2的N次冪n 可輸入,n為自然數
- SQL 層功能改進 - lookupJoin 的最佳化SQL
- 10個SQL技巧之三:進行總計算SQL
- SQL 有序計算SQL
- SQL 的後計算指令碼SQL指令碼
- Python計算1到n的和常用方法!Python
- [20210428]改進pr.sql指令碼.txtSQL指令碼
- SQL 轉置計算SQL
- sql1035NSQL
- 區塊鏈如何更好地改進雲端計算解決方案區塊鏈
- 【Quant102】如何計算 N 日斜率
- 實現同比、環比計算的N種姿勢
- 遺傳演算法的改進——跳出區域性最優機制的研究(選擇運算元、交叉運算元、變異運算元的改進)演算法
- [20211009]使用bash計算sql語句的sql_id.txtSQL
- 量子計算將如何改變世界?
- 需求改進&系統設計
- io.EOF設計的缺陷和改進
- 模擬計算hash前面N個0需要的時間
- [20191101]通過zsh計算sql語句的sql_id.txtSQL
- [20191011]通過bash計算sql語句的sql_id.txtSQL
- 最簡單的sql語句(增刪改查統計)SQL
- 邊緣計算如何改變企業IT
- 量子計算機改變世界的7大方式計算機
- 需求改進與系統設計
- MySQL的SQL等價改寫MySql
- 改進,從一個陣列中找出 N 個數,其和為 M 的所有可能陣列
- SQL217 對所有員工的薪水按照salary降序進行1-N的排名SQL
- SQL面試必考——計算留存率SQL面試
- SQL Server各種日期計算方法SQLServer
- Flink流計算中SQL表的概念和原理SQL
- 初級程式設計師的SQL拾遺(增刪改查)程式設計師SQL
- 計算機中的二進位制計算機
- Scanner的進階使用——基礎計算
- 使用面向 Aspect 的程式設計改進模組性程式設計
- SQL改寫的方法,select group by sumSQL
- SQL增刪改查SQL
- 雲端計算開發技術,雲端計算改變企業的四種途徑
- [20220111]該語句的sql_id如何計算的.txtSQL
- SQL 如何計算每個分組的中位數SQL