news 2026/9/2 19:48:22

一个用postgresql的自定义函数求解数独的程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个用postgresql的自定义函数求解数独的程序

从这个网页看到一个用postgresql的自定义函数求解数独的程序,其实核心还是一个利用递归CTE的SQL。
然后把两个计算行列宫的临时表做成物理表。
对问题表中的每行执行上述标量函数,效率和单独的SQL差不多。难题耗时比较长。

postgres@b3490d8427cd:~$ psql psql (17.7 (Debian 17.7-3.pgdg13+1)) Type "help" for help. postgres=# table sudoku9_9; postgres=# CREATE TABLE allnum AS SELECT generate_series(1, 9) AS num ; SELECT 9 postgres=# CREATE TABLE grid AS SELECT (i - 1) * 9 + j AS indexof ,i ,j ,(i - 1) / 3 * 3 + 1 + (j - 1) / 3 AS grp FROM allnum n1(i) ,allnum n2(j) ; SELECT 81 postgres=# CREATE OR REPLACE FUNCTION sudoku(text) RETURNS text LANGUAGE sql IMMUTABLE AS $$ WITH RECURSIVE _sudoku AS ( -- 初期値 SELECT $1 kekka -- 再帰with句で追加されていく行 UNION ALL( WITH latest AS ( SELECT kekka ,(ROW_NUMBER() OVER())::int parallelid FROM _sudoku ) ,gridnum AS ( SELECT latest.parallelid ,indexof, i, j, grp ,substr(latest.kekka, indexof, 1) AS num FROM latest, grid ) ,used AS ( SELECT gridnums.parallelid ,gridnums.indexof ,array_agg(DISTINCT usednums.num :: int) usednumarray FROM gridnum usednums ,gridnum gridnums WHERE usednums.num <> ' ' AND gridnums.num = ' ' AND usednums.parallelid = gridnums.parallelid AND( usednums.i = gridnums.i OR usednums.j = gridnums.j OR usednums.grp = gridnums.grp ) GROUP BY gridnums.parallelid ,gridnums.indexof ) ,insertnum AS ( SELECT parallelid ,indexof ,usednumarray ,DENSE_RANK() OVER( PARTITION BY used.parallelid ORDER BY ARRAY_LENGTH(used.usednumarray, 1) DESC, indexof ) AS insertorder FROM used ) SELECT overlay(latest.kekka placing allnum.num::text FROM insertnum.indexof FOR 1) AS kekka FROM latest ,allnum ,insertnum WHERE latest.parallelid = insertnum.parallelid AND insertnum.insertorder = 1 AND allnum.num <> ALL(insertnum.usednumarray) ) ) SELECT kekka FROM _sudoku WHERE strpos(kekka, ' ') = 0; $$ ; CREATE FUNCTION postgres=# CREATE TABLE sudoku_q AS SELECT 1 id, ' 6 3 1 9 5 2 31 14 678 786529 34567 93 1891456372 24 875 9'::text as question UNION SELECT 2, ' 7 3 6 9152 23 48 7418 65 7 9325 876 9341 9215 37 5 18296' UNION SELECT 3, ' 3 1967 4 8 2 34157 2 62315 68 9 13 68 9 258479 6 2 9143857' UNION SELECT 4, ' 9 8 7 42 6 3 7 1 2 5 836 992 651 475 63491831 8 7452 9521 63' UNION SELECT 5, ' 5 3 6 824 7 1 2954167 1 86 2954 6 7 9312 39784 563241 7 9 5283' ; SELECT 5 postgres=# SELECT * FROM sudoku_q ORDER BY id; id | question ----+----------------------------------------------------------------------------------- 1 | 6 3 1 9 5 2 31 14 678 786529 34567 93 1891456372 24 875 9 2 | 7 3 6 9152 23 48 7418 65 7 9325 876 9341 9215 37 5 18296 3 | 3 1967 4 8 2 34157 2 62315 68 9 13 68 9 258479 6 2 9143857 4 | 9 8 7 42 6 3 7 1 2 5 836 992 651 475 63491831 8 7452 9521 63 5 | 5 3 6 824 7 1 2954167 1 86 2954 6 7 9312 39784 563241 7 9 5283 (5 rows) postgres=# \timing Timing is on. postgres=# SELECT id, sudoku(question) FROM sudoku_q ORDER BY id; id | sudoku ----+----------------------------------------------------------------------------------- 1 | 472931658635842917918765423259314786143678295786529134567293841891456372324187569 2 | 694857123387142659152639784235481967418976532769325841876293415921564378543718296 3 | 458326719672914385913857426341579268896231574725468193137685942584792631269143857 4 | 235976841178342596694158327867419235541283679923765184752634918316897452489521763 5 | 635217849741893526982456731329541678178632954564789312213978465856324197497165283 (5 rows) Time: 35.973 ms postgres=# insert into sudoku_q SELECT 8 AS id, E'8 36 7 9 2 5 7 457 1 3 1 68 85 1 9 4 '; INSERT 0 1 Time: 3.909 ms postgres=# SELECT id, sudoku(question) FROM sudoku_q ORDER BY id; id | sudoku ----+----------------------------------------------------------------------------------- 1 | 472931658635842917918765423259314786143678295786529134567293841891456372324187569 2 | 694857123387142659152639784235481967418976532769325841876293415921564378543718296 3 | 458326719672914385913857426341579268896231574725468193137685942584792631269143857 4 | 235976841178342596694158327867419235541283679923765184752634918316897452489521763 5 | 635217849741893526982456731329541678178632954564789312213978465856324197497165283 8 | 812753649943682175675491283154237896369845721287169534521974368438526917796318452 (6 rows) Time: 4808.878 ms (00:04.809) postgres=#
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 2:02:51

LP2178BY/LP2178B非隔离5V350mA语音小夜灯电源芯片解析

传统阻容降压方案效率低下、发热严重&#xff1b;普通开关电源芯片又常因开关频率落入音频段而产生恼人的"啸叫"。LP2178B&#xff08;丝印LP2178BY&#xff09;芯片正是针对这一应用场景的精准解决方案。该芯片集成750V高压功率管&#xff0c;采用特有的PFM控制方式…

作者头像 李华
网站建设 2026/9/2 23:57:27

AiP650E带键盘扫描电路接口LED驱动控制专用电路芯片特点及型号

传统设计方案通常需要LED驱动芯片键盘扫描芯片MCU GPIO扩展三颗器件协同工作&#xff0c;不仅占用宝贵的PCB空间&#xff0c;还增加了软件复杂度和EMI风险。AiP650E以"单芯片解决显示按键"为设计理念&#xff0c;将8段4位LED驱动、74位键盘扫描、8级亮度调节、组合按…

作者头像 李华
网站建设 2026/9/3 1:50:49

promptAction.openCustomDialog弹窗关闭动画问题?

本问答帖原创发布在华为开发者联盟社区 &#xff0c;欢迎开发者前往论坛提问交流。 问题描述&#xff1a; promptAction.openCustomDialog如何实现在打开的时候蒙层立马出现&#xff0c;弹窗从底部向上划出&#xff1b;关闭的时候弹窗先向下划出去&#xff0c;然后蒙层再消失&…

作者头像 李华
网站建设 2026/9/3 1:52:32

网站巡查处置方案如何有效制定?

制定一份有效的《网站巡查处置方案》&#xff0c;不能仅停留在“纸面文件”上&#xff0c;必须构建一套“标准量化、技术支撑、流程闭环”的实战体系。方案的有效性取决于能否真正发现问题&#xff0c;并能否在最短时间内解决问题。以下是制定该方案的五个关键步骤及核心内容&a…

作者头像 李华
网站建设 2026/9/3 0:58:18

TikTok近期新规重点与卖家/创作者应对

过去一段时间&#xff0c;TikTok的规则变化有个很明显的方向&#xff1a;交易侧更重“履约与售后体验”、内容侧更重“透明与合规”、平台侧更重“区域化监管要求”。如果你做带货或内容变现&#xff0c;建议把“规则理解”升级成“流程化风控”&#xff0c;否则一次违规就可能…

作者头像 李华
网站建设 2026/9/3 3:34:28

<span class=“js_title_inner“>【AI时代生存指南】拒做时代的燃料:在算法迷雾中,夺回属于“人”的阵地</span>

如果说前一篇文章是在午夜里敲响的一记重锤&#xff0c;提醒我们文明可能正在滑向深渊&#xff0c;那么这篇文章&#xff0c;我更想和你像老友般坐下来&#xff0c;聊聊在这一地鸡毛的现实里&#xff0c;我们每一个鲜活的人&#xff0c;究竟该如何守住自己的阵地。 AI的味道是冰…

作者头像 李华