簡體   English   中英

數獨求解器的算法復雜度(Big-O)

[英]Algorithm Complexity (Big-O) of sudoku solver

我正在尋找“如何找到它”,因為我不知道如何找到程序的算法復雜性。

我使用Java編寫了一個sudoku求解器,但沒有考慮到效率(我想嘗試使其遞歸工作,我成功了!)

一些背景:

我的策略是利用回溯來確定給定Sudoku拼圖的拼圖是否只有一種獨特的解決方案。 所以我基本上讀了一個給定的謎題,並解決了。 一旦找到一個解決方案,就不一定要做,需要繼續探索進一步的解決方案。 最后,發生以下三種可能的結果之一:難題根本無法解決,難題具有獨特的解決方案,或者難題具有多種解決方案。

我的程序從一個文件中讀取拼圖坐標,該文件的每個給定數字都有一行,由行,列和數字組成。 按照我自己的約定,左上角的7表示為007。

執行:

我從文件中加載值,並將它們存儲在二維數組中,然后向下查找數組,直到找到空白(未填充的值),並將其設置為1。然后檢查是否存在任何沖突(是否值i輸入的有效與否)。 如果是,我將移至下一個值。 如果否,則將值增加1,直到找到一個有效的數字為止,或者如果它們均不起作用(1到9),則將步驟返回到我調整的最后一個值,然后再遞增一個值(使用遞歸)。 當所有81個元素都填滿且沒有沖突時,我就解決了。 如果找到任何解決方案,我將它們打印到終端上。 否則,如果我嘗試對最初修改的FIRST元素“退一步”,則意味着沒有解決方案。

我的程序算法復雜度如何? 我以為它可能是線性的[O(n)],但是我要多次訪問該數組,所以我不確定:(

任何幫助表示贊賞

O( n ^ m )其中n是每個正方形的可能性數(即,經典Sudoku中為9), m是空白的數目。

這可以通過僅從單個空白向后工作來看到。 如果只有一個空白,那么在最壞的情況下您就必須解決所有n種可能性。 如果有兩個空格,則必須到n准備工作,為每一個為第一空白准備第二空白的第一個空白和n的可能性。 如果有三個空白,則必須為第一個空白處理n種可能性。 這些可能性中的每一個都會產生一個拼圖,其中兩個空白的n ^ 2個可能性。

該算法通過可能的解決方案執行深度優先搜索。 圖的每個級別代表單個正方形的選擇。 圖形的深度是需要填充的正方形數。 在分支因子為n且深度為m的情況下,在圖中找到解決方案的性能為O( n ^ m )。

在許多數獨游戲中,會有一些數字可以直接考慮一下。 通過在第一個空單元格中放置數字,您將放棄很多機會來減少可能性。 如果前十個空單元格有很多可能性,您將得到指數增長。 我會問一些問題:

數字1可以在第一行到哪里?

2可以在第一行到哪里?

...

數字9可以在最后一行到哪里?

一樣,但是有九列?

一樣,但是有九個盒子?

哪個號碼可以進入第一個單元格?

哪個數字可以進入第81個單元?

那是324個問題。 如果任何問題都只有一個答案,則選擇該答案。 如果有任何問題根本沒有答案,那您就回頭了。 如果每個問題都有兩個或多個答案,則選擇一個答案最少的問題。

可能會得到成倍的增長,但僅限於確實很難解決的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM