改進的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半時間。
相關文章
- 用sql實現的n王后SQL
- 多執行緒結合經典位運算解n王后問題的優化執行緒優化
- 多執行緒解n王后問題的優化執行緒優化
- 改變數學的命運——《計算進化史》變數
- 利用C++多執行緒優化n王后問題C++執行緒優化
- 計算2的N次冪n 可輸入,n為自然數
- 計算2..n的素數
- 一條sql語句的改進探索SQL
- SQL Server效能的改進得益於邏輯資料庫設計SQLServer資料庫
- 10個SQL技巧之三:進行總計算SQL
- 區塊鏈如何更好地改進雲端計算解決方案區塊鏈
- SQL 層功能改進 - lookupJoin 的最佳化SQL
- SQL 有序計算SQL
- Python計算1到n的和常用方法!Python
- 新手筆記-持續改進實踐:開發計劃的改進 (轉)筆記
- SQL 的後計算指令碼SQL指令碼
- MySQL中關於Qustions計算的改變MySql
- 改變世界的10大計算機病毒計算機
- 遺傳演算法的改進——跳出區域性最優機制的研究(選擇運算元、交叉運算元、變異運算元的改進)演算法
- 實現同比、環比計算的N種姿勢
- SQL 轉置計算SQL
- SQL Server日期計算SQLServer
- 需求改進&系統設計
- 程式設計太差,有待改進程式設計
- OpenMP平行計算程式設計-n以內的完數的個數程式設計
- 量子計算將如何改變世界?
- SQL Server 安裝後改動計算機名帶來的問題以及解決方法SQLServer計算機
- sql執行計劃是否改變SQL
- 改進資料庫效能-SQL查詢優化資料庫SQL優化
- SQL Server日期計算 (轉)SQLServer
- 需求改進與系統設計
- 邊緣計算如何改變企業IT
- 【Quant102】如何計算 N 日斜率
- 改進,從一個陣列中找出 N 個數,其和為 M 的所有可能陣列
- 使用面向 Aspect 的程式設計改進模組性程式設計
- Photoshop改進UI設計的一些技巧UI
- 雲端計算開發技術,雲端計算改變企業的四種途徑
- 量子計算機改變世界的7大方式計算機