摘要:漢明距離可以用異或操作實(shí)現(xiàn)。這個(gè)問(wèn)題其實(shí)可以看作是,具有個(gè)節(jié)點(diǎn)的全連接無(wú)向圖,每條邊的權(quán)重值代表兩個(gè)節(jié)點(diǎn)所代表的數(shù)字的段碼顯示的二進(jìn)制表示之間的漢明距離。
目錄
????????問(wèn)題:求把10個(gè)數(shù)字全部顯示出來(lái)時(shí),亮燈/滅燈的切換次數(shù)最少的顯示順序,以及這個(gè)切換次數(shù)。
????????注:原題從答案來(lái)看是不包括第一個(gè)數(shù)字顯示時(shí)從全黑到顯示該數(shù)字所需要的亮滅切換次數(shù)的。不過(guò)這個(gè)不影響解題,但是可能會(huì)影響答案。
????????從暴力搜索(原書(shū)中使用“全量搜索”這個(gè)詞很貼切)著手。
????????10個(gè)數(shù)字的不同排列順序共有10!=factorial(10)=3628800種,針對(duì)每一種排列順序進(jìn)行切換次數(shù)的統(tǒng)計(jì)即可。
????????本題解中用numpy array存儲(chǔ)各數(shù)字顯示所需要的燈亮滅表示矩陣,每行表示一個(gè)數(shù)字,表示使用7段碼對(duì)應(yīng)的二進(jìn)制表示。
????????切換次數(shù)的計(jì)算可以理解為兩個(gè)二進(jìn)制序列之間的漢明距離(hamming distance),即兩個(gè)二進(jìn)制序列之間的不同的數(shù)的個(gè)數(shù)。漢明距離可以用異或操作實(shí)現(xiàn)。
????????此外,各數(shù)字的二進(jìn)制表示之間的漢明距離總共只有10*10=100個(gè)(連自己與自己之間的距離也算上,雖然不用。考慮到查找實(shí)現(xiàn)的便利,(k,j)和(j,k)也分開(kāi)來(lái)算,雖然它們是相等的)可以預(yù)先計(jì)算好,這樣可以避免在遍歷搜索時(shí)的大量的重復(fù)計(jì)算。
# -*- coding: utf-8 -*-"""Created on Wed Sep 22 07:37:19 2021@author: chenxy"""import sysimport timeimport datetimeimport mathimport randomfrom typing import List# from queue import Queuefrom collections import dequeimport itertools as itfrom math import sqrt, floor, ceilimport numpy as npclass Solution: segs = np.array([[1,1,1,1,1,1,0], [0,1,1,0,0,0,0], [1,1,0,1,1,0,1], [1,1,1,1,0,0,1], [0,1,1,0,0,1,1], [1,0,1,1,0,1,1], [1,0,1,1,1,1,1], [1,1,1,0,0,0,0], [1,1,1,1,1,1,1], [1,1,1,1,0,1,1]]) distArray = dict() minDistSum = np.sum(segs) minOrder = None def initDistArray(self): for i in range(len(self.segs)): for j in range(len(self.segs)): self.distArray[tuple([i,j])] = np.sum(self.segs[i] ^ self.segs[j]) def printDistArray(self): print(self.distArray) def minToggle(self): for order in it.permutations(list(range(10))): # print(order) distSum = 0 #np.sum(self.segs[0]) for k in range(9): distSum += self.distArray[(order[k],order[k+1])] if self.minDistSum > distSum: self.minDistSum = distSum self.minOrder = order return self.minDistSum, self.minOrder if __name__ == "__main__": sln = Solution() sln.initDistArray() # sln.printDistArray() t1 = time.perf_counter() minDistSum, minOrder = sln.minToggle() tCost = time.perf_counter() - t1 print("Number of toggles = {0}, order = {1}, tCost = {2}".format(minDistSum, minOrder,tCost))
運(yùn)行結(jié)果:
Number of toggles = 13, order = (0, 8, 6, 5, 9, 4, 1, 7, 3, 2), tCost = ?8.640sec
4. 后記
????????運(yùn)行時(shí)間有點(diǎn)長(zhǎng),需要考慮進(jìn)一步優(yōu)化。
????????這個(gè)問(wèn)題其實(shí)可以看作是,具有10個(gè)節(jié)點(diǎn)的全連接無(wú)向圖,每條邊的權(quán)重值代表兩個(gè)節(jié)點(diǎn)所代表的數(shù)字的7段碼顯示的二進(jìn)制表示之間的漢明距離。因此本題就轉(zhuǎn)化為就該圖中任意一條最長(zhǎng)無(wú)重復(fù)路徑的權(quán)重總和。這其實(shí)就是著名(惡名昭彰)的旅行商問(wèn)題。這是一個(gè)NP問(wèn)題,但是只有10個(gè)節(jié)點(diǎn)還可以對(duì)付。接下來(lái)考慮用遞歸+Memoization的方法來(lái)試一試會(huì)不會(huì)變得更快一些。
? ? ? ? 上一篇:Q36: 翻轉(zhuǎn)骰子
? ? ? ? 下一篇:
????????本系列總目錄參見(jiàn):程序員的算法趣題:詳細(xì)分析和Python全解
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/120960.html
摘要:由此可得初始狀態(tài)為終止?fàn)顟B(tài)黑白或交錯(cuò)有兩種,分別是翻轉(zhuǎn)運(yùn)算在圓圈上翻轉(zhuǎn)連續(xù)張牌,可以用一個(gè)比特的有個(gè)比特為的整數(shù)稱(chēng)為掩碼與表示排列狀態(tài)的整數(shù)進(jìn)行按比特異或運(yùn)算得到。求余部分代表沒(méi)有移出比特部分的值。 目錄 1. 問(wèn)題描述 2. 解題分析 2.1 圓圈排列的表示 2.2 翻轉(zhuǎn)運(yùn)算 ?2.3 ...
摘要:本文先考慮深度優(yōu)先搜索。深度優(yōu)先搜索算法流程如下最后,將初始化為,初始化,和分別初始化為適當(dāng)?shù)娜銛?shù)組,然后調(diào)用到最終退出后所得到的即為所求結(jié)果。 目錄 1. 問(wèn)題描述 2. 解題分析 3. 代碼及測(cè)試 4. 后記 1. 問(wèn)題描述 2. 解題分析 ????????本題是要找最長(zhǎng)路徑,應(yīng)該...
摘要:結(jié)合上下文猜測(cè)應(yīng)該是說(shuō)沙子同時(shí)漏完的意思。問(wèn)題的焦點(diǎn)在于如何表示不同的排列狀態(tài)以及如何處理沙漏翻轉(zhuǎn)。上一篇完美洗牌完美洗牌下一篇糖果惡作劇本系列總目錄參見(jiàn)程序員的算法趣題詳細(xì)分析和全解程序員的算法趣題詳細(xì)分析和全解 目錄 1. 問(wèn)題描述 1.1 原題的表述 2. 解題分析 2.1 轉(zhuǎn)換為線...
摘要:基于以上討論可得,本題求解流程如下所示代碼及測(cè)試運(yùn)行結(jié)果上一篇水果酥餅日下一篇異或楊輝三角形本系列總目錄參見(jiàn)程序員的算法趣題詳細(xì)分析和全解 目錄 1. 問(wèn)題描述 2. 解題分析 3. 代碼及測(cè)試 1. 問(wèn)題描述 ????????六度空間理論非常有名。大概的意思是1個(gè)人只需要通過(guò)6個(gè)中間人就...
閱讀 3296·2023-04-25 18:03
閱讀 1154·2021-11-15 11:38
閱讀 5568·2021-10-25 09:45
閱讀 850·2021-09-24 09:48
閱讀 2307·2021-09-22 15:34
閱讀 1744·2019-08-30 15:44
閱讀 2687·2019-08-30 13:12
閱讀 611·2019-08-29 16:05