中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何python解約瑟夫環問題

發布時間:2021-10-14 13:58:16 來源:億速云 閱讀:143 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關如何python解約瑟夫環問題,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

        約瑟夫環問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到k的那個人被殺掉;他的下一個人又從1開始報數,數到k的那個人又被殺掉;依此規律重復下去,直到圓桌周圍的人只剩最后一個。

        思路是:當k是1的時候,存活的是最后一個人,當k>=2的時候,構造一個n個元素的循環鏈表,然后依次殺掉第k個人,留下的最后一個是可以存活的人。代碼如下:

class Node():
	def __init__(self,value,next=None):
		self.value=value
		self.next=next

def createLink(n):
	if n<=0:
		return False
	if n==1:
		return Node(1)
	else:
		root=Node(1)
		tmp=root
		for i in range(2,n+1):
			tmp.next=Node(i)
			tmp=tmp.next
		tmp.next=root
		return root

def showLink(root):
	tmp=root
	while True:
		print(tmp.value)
		tmp=tmp.next
		if tmp==None or tmp==root:
			break

def josephus(n,k):
	if k==1:
		print('survive:',n)
		return
	root=createLink(n)
	tmp=root
	while True:
		for i in range(k-2):
			tmp=tmp.next
		print('kill:',tmp.next.value)
		tmp.next=tmp.next.next
		tmp=tmp.next
		if tmp.next==tmp:
			break
	print('survive:',tmp.value)

if __name__=='__main__':
	josephus(10,4)
	print('-----------------')
	josephus(10,2)
	print('-----------------')
	josephus(10,1)
	print('-----------------')

輸出結果如下:

如何python解約瑟夫環問題

第一種方法是直觀暴力裸搞,確實不太簡潔,下面寫出我的第二種方法,求模來搞起,代碼少了一些,如下:

def josephus(n,k):
	if k==1:
		print('survive:',n)
		return
	p=0
	people=list(range(1,n+1))
	while True:
		if len(people)==1:
			break
		p=(p+(k-1))%len(people)
		print('kill:',people[p])
		del people[p]
	print('survive:',people[0])

if __name__=='__main__':
	josephus(10,4)
	josephus(10,2)
	josephus(10,1)

運行結果和上面一樣。為了進一步對比性能,我用josephus(100000,4)測試,即n=100000,k=4。為了去掉IO消耗的時間干擾,把"kill:"的print注釋掉,只輸出最后的"survive:"結果,測試結果如下:

如何python解約瑟夫環問題

結果表明,第一種循環鏈表的方式比第二種取模運算的方式要快,由于比例不是線性的,不能說是幾倍,而且這個測試和python內部實現有關,換作C語言O3優化后結果就不一定一樣了,所以測試結果不能說明什么哈~

關于如何python解約瑟夫環問題就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴中市| 广平县| 调兵山市| 正安县| 三江| 渭源县| 云梦县| 桐柏县| 衡山县| 南涧| 广丰县| 高平市| 绥宁县| 南宫市| 滨海县| 武隆县| 大庆市| 社旗县| 健康| 林口县| 汉川市| 页游| 印江| 行唐县| 抚宁县| 清徐县| 阜平县| 辉南县| 布尔津县| 延寿县| 任丘市| 宝清县| 疏附县| 泸西县| 宁远县| 敦化市| 舒城县| 墨玉县| 黎川县| 宁南县| 云梦县|