91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

济宁市| 偃师市| 瑞昌市| 根河市| 新晃| 永顺县| 巨野县| 枣强县| 满洲里市| 湖北省| 墨竹工卡县| 同德县| 陆川县| 朔州市| 阳新县| 西盟| 屯留县| 永新县| 阜阳市| 四会市| 汝阳县| 嵊泗县| 安远县| 东宁县| 临江市| 乐东| 类乌齐县| 南部县| 兰考县| 连山| 吉林市| 通辽市| 紫金县| 乳山市| 昌吉市| 潼南县| 文安县| 中牟县| 阿瓦提县| 翼城县| 建阳市|