亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

如何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

邵东县| 阿坝县| 宁夏| 东宁县| 宜兴市| 卢湾区| 文成县| 凤翔县| 汨罗市| 陇南市| 平遥县| 武宣县| 平塘县| 镇沅| 常熟市| 扶沟县| 长武县| 易门县| 疏勒县| 如皋市| 林甸县| 邯郸县| 裕民县| 东港市| 抚顺市| 洛南县| 松滋市| 紫云| 宜君县| 沐川县| 将乐县| 新巴尔虎左旗| 弥勒县| 齐齐哈尔市| 乌海市| 天等县| 安新县| 桃江县| 黔西县| 宝坻区| 东阳市|