第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么偶數(shù) N 比奇數(shù) N 花費(fèi)更長的時間?

為什么偶數(shù) N 比奇數(shù) N 花費(fèi)更長的時間?

森林海 2022-01-18 17:02:16
我這里有一些代碼可以在 python 中使用回溯來解決 n 個皇后問題。當(dāng)我運(yùn)行它時,賠率總是比偶數(shù)花費(fèi)的時間少得多。當(dāng) n 達(dá)到 20+ 左右時,這一點(diǎn)尤其明顯。有人知道為什么是這樣嗎?import timeglobal NN = int(input("Enter N: "))def display_solution(board):    print('\n'.join(['\t'.join([str(cell) for cell in row]) for row in     board]))def safe(board, row, col):    for i in range(col):        if board[row][i] == 1:            return False    for i, j in zip(range(row, -1, -1), range(col, -1, -1)):        if board[i][j] == 1:            return False    for i, j in zip(range(row, N, 1), range(col, -1, -1)):        if board[i][j] == 1:            return False    return Truedef solve_help(board, col):    if col >= N:        return True    for i in range(N):        if safe(board, i, col):            board[i][col] = 1            if solve_help(board, col + 1) is True:                return True            board[i][col] = 0    return Falsedef solve():    board = [[0 for x in range(N)] for y in range(N)]    if solve_help(board, 0) is False:        print("Solution does not exist")        return False    display_solution(board)    return Truestart = time.clock()solve()end = time.clock()print(N, "\t", end-start)我假設(shè)它必須與對角線的賠率與偶數(shù)不同有關(guān)。我也不確定這是否是所有回溯算法的問題,或者只是這個特定的代碼。不管怎樣,謝謝你的幫助。
查看完整描述

1 回答

?
MMTTMM

TA貢獻(xiàn)1869條經(jīng)驗 獲得超4個贊

當(dāng)在第一列之一發(fā)生回溯并且必須嘗試下一行時,該算法需要相當(dāng)多的時間。將奇數(shù) N 板與 N-1 板進(jìn)行比較確實(shí)表明,偶數(shù)板的解決方案通常需要進(jìn)行更多此類回溯/嘗試下一個處理。例如,N=19 的解的左上角如下所示:


1 0 0 0 0

0 0 0 1 0

0 1 0 0 0

0 0 0 0 1*

0 0 1 0 0

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

前五列中的這 5 個皇后很快找到,因為它們是第一個不與之前的皇后發(fā)生碰撞的皇后。顯然可以放置其他皇后而不必重新考慮前五個皇后。


對于 N=18,解決方案的同一角落如下所示:


1 0 0 0 0

0 0 0 1 0

0 1 0 0 0

0 0 0 0 0-

0 0 1 0 0

0 0 0 0 0

0 0 0 0 0

0 0 0 0 1*

注意標(biāo)有減號的位置。這個看起來很有希望(就像 19 板一樣):它的調(diào)查需要相當(dāng)長的時間才能得出無法正確放置其他皇后的結(jié)論。這種早期失敗的代價。


因此,19 板的解決方案比 18 板更快地找到。


請注意,27 的解決方案比 26 的解決方案花費(fèi)的時間略多,盡管這并不重要:看起來時間復(fù)雜度是O(2 n ),因此要比較不同板尺寸的時間,最好在對數(shù) Y 軸:

http://img1.sycdn.imooc.com//61e682350001ac7812530484.jpg

“work”表示函數(shù)safe執(zhí)行的次數(shù)。


這種算法是否總是對偶數(shù)板花費(fèi)相對更多的時間(與 N+1 板所需的時間相比)尚不清楚,但對于這幾個板尺寸,它似乎與該算法自然形成的騎士跳躍有關(guān),開始從左上角。請注意,這種模式如何完美地適用于 5 號和 7 號棋盤:下一個皇后可以坐在而不干擾先前定位的皇后的第一個位置始終是解決方案的一部分。而對于 4 號和 6 號棋盤,甚至沒有任何解決方案在角落里有一個皇后,這是該算法的起點(diǎn)。


備擇方案

從程序員的角度來看這個問題,有一種補(bǔ)救方法可以(平均而言)消除差異:以不同(甚至隨機(jī))的順序選擇列。事實(shí)證明,采用正常順序是獲得解決方案的效率較低的方法之一。


換檔選擇

該算法的一個簡單轉(zhuǎn)變,除非所有其他行都失敗,否則您不考慮前兩行,已經(jīng)大大改變了統(tǒng)計數(shù)據(jù):


在solve_help改變這個:


for i in range(N):

到:


for i in range(N):

   i = (i + 2) % N

http://img1.sycdn.imooc.com//61e68246000117fe12540484.jpg

看看現(xiàn)在平均性能是如何提高的:log(work)/n的所有測量值都低于 1,除了 n=6。而且:現(xiàn)在更頻繁地查看 N 的奇數(shù)值。

隨機(jī)挑選

for i in random.sample(range(N), N):

以下是這樣一次隨機(jī)運(yùn)行的結(jié)果:

http://img1.sycdn.imooc.com//61e68255000176c612490486.jpg

比原始訂單更好的統(tǒng)計數(shù)據(jù)!當(dāng)然,你會時不時地得到一個糟糕的統(tǒng)計數(shù)據(jù),......因為它是隨機(jī)的。但平均而言,它的表現(xiàn)(好得多)。

其他非隨機(jī)順序的方式可能包括col, 和N//2不同的系數(shù), 如i = (i + col*2 + N//2) % N, ...等。但請參閱下面的最后評論。

其他備注

我將應(yīng)用以下優(yōu)化:跟蹤哪些行、前向“對角線”和后向“對角線”已被采用。您可以為此使用列表或集合。請注意,如果兩個單元格的坐標(biāo)之和相等,則兩個單元格位于同一對角線上。后對角線上的單元格的共同點(diǎn)是它們的坐標(biāo)差相等。這樣您就不必每次都在這些行中掃描“1”。

此外,board可能只是列號列表。無需存儲所有這些零。僅保留用于顯示。

最后,有一些簡單的方法可以在線性時間內(nèi)獲得解決方案。參見維基百科。


查看完整回答
反對 回復(fù) 2022-01-18
  • 1 回答
  • 0 關(guān)注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號