当前位置: 首页 > news >正文

一个用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=#
http://www.jsqmd.com/news/334077/

相关文章:

  • AlertDialog.show()中message的字体大小和颜色如何修改?
  • LP2178BY/LP2178B非隔离5V350mA语音小夜灯电源芯片解析
  • 2025-2026宣城本地生活团购运营服务商综合实力五强盘点 - 野榜数据排行
  • 2026年家用净水器怎么选?家用净水器十大品牌权威排行 - 水业策论
  • TikTok跨境电商:从“爆单逻辑”走向“合规与履约”时代的实战打法
  • <span class=“js_title_inner“>【AI时代生存指南】拒做时代的燃料:在算法迷雾中,夺回属于“人”的阵地</span>
  • 2026国内有实力的湖州花园设计施工公司排行 - 品牌排行榜
  • CH58X/CH59X的中断优先级配置机制
  • 2026年GEO源头厂家决策指南:深度解析摘星AI登顶之道与五大服务商全景测评 - 2026年企业推荐榜
  • <span class=“js_title_inner“>从数据供给到价值变现的闭环构建|大模型与数据要素论坛圆满落幕!</span>
  • 2026亚马逊自养号测评技术全解:五大核心维度构建安全运营体系
  • 2026全自动均质器实力厂家TOP5推荐:质量好、口碑出众、售后无忧 - 品牌推荐大师1
  • 2026四川盲道砖厂家权威榜单 全场景适配 品质与口碑双优全景指南 - 深度智识库
  • 2026年西安升学职高推荐榜单:聚焦艺术升学优势,优选优质教育平台 - 深度智识库
  • <span class=“js_title_inner“>VFP调用EXCEL的补充方法</span>
  • 2026年GEO源头厂家推荐 摘星AI登顶TOP1!服务商综合选购全指南 - 2026年企业推荐榜
  • 领航智联时代:阿里云 MQTT+Kafka 车/物联网实时数据分析解决方案
  • 大厂前端面试最新整理笔记(50万字经验总结)
  • 血珀戒指选购攻略:看图辨真假与品质
  • 上海开放大学电子商务导论作业答案
  • <span class=“js_title_inner“>聚辰半导体冲刺港股:9个月营收9.3亿 利润3.1亿 陈作涛控制24%股权</span>
  • CF2141B 学习笔记
  • Java awt包不存在错误解决:检查JDK安装与环境变量配置
  • 百考通「降重+降AI」双效合一,轻松通过查重与AI检测双重关卡
  • 2026扫码点单系统-亿坊-一套系统搞定门店经营管理全部所需!
  • <span class=“js_title_inner“>将Visual FoxPro的数据转给Excel</span>
  • 双向链表是什么?和单向链表区别详解
  • 收藏必学!AI Agent核心模块全解析:从“会聊天“到“能干活“的进化之路
  • 反内卷健身叙事:海外网红营销如何以“适度锻炼”理念撬动新消费群体
  • <span class=“js_title_inner“>何用 OLE Automation 打印指定范围的 Word 文档</span>