最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python環(huán)形單鏈表的約瑟夫問(wèn)題詳解

 更新時(shí)間:2018年09月27日 14:18:10   作者:冬日新雨  
這篇文章主要為大家詳細(xì)介紹了python環(huán)形單鏈表的約瑟夫問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

題目:

一個(gè)環(huán)形單鏈表,從頭結(jié)點(diǎn)開(kāi)始向后,指針每移動(dòng)一個(gè)結(jié)點(diǎn),就計(jì)數(shù)加1,當(dāng)數(shù)到第m個(gè)節(jié)點(diǎn)時(shí),就把該結(jié)點(diǎn)刪除,然后繼續(xù)從下一個(gè)節(jié)點(diǎn)開(kāi)始從1計(jì)數(shù),循環(huán)往復(fù),直到環(huán)形單鏈表中只剩下了一個(gè)結(jié)點(diǎn),返回該結(jié)點(diǎn)。

這個(gè)問(wèn)題就是著名的約瑟夫問(wèn)題。

代碼:

首先給出環(huán)形單鏈表的數(shù)據(jù)結(jié)構(gòu):

class Node(object):
 def __init__(self, value, next=0):
  self.value = value
  self.next = next # 指針

class RingLinkedList(object):
 # 鏈表的數(shù)據(jù)結(jié)構(gòu)
 def __init__(self):
  self.head = 0 # 頭部

 def __getitem__(self, key):
  if self.is_empty():
   print 'Linked list is empty.'
   return
  elif key < 0 or key > self.get_length():
   print 'The given key is wrong.'
   return
  else:
   return self.get_elem(key)

 def __setitem__(self, key, value):
  if self.is_empty():
   print 'Linked list is empty.'
   return
  elif key < 0 or key > self.get_length():
   print 'The given key is wrong.'
   return
  else:
   return self.set_elem(key, value)

 def init_list(self, data): # 按列表給出 data
  self.head = Node(data[0])
  p = self.head # 指針指向頭結(jié)點(diǎn)
  for i in data[1:]:
   p.next = Node(i) # 確定指針指向下一個(gè)結(jié)點(diǎn)
   p = p.next # 指針滑動(dòng)向下一個(gè)位置
  p.next = self.head

 def get_length(self):
  p, length = self.head, 0
  while p != 0:
   length += 1
   p = p.next
   if p == self.head:
    break
  return length

 def is_empty(self):
  if self.head == 0:
   return True
  else:
   return False

 def insert_node(self, index, value):
  length = self.get_length()
  if index < 0 or index > length:
   print 'Can not insert node into the linked list.'
  elif index == 0:
   temp = self.head
   self.head = Node(value, temp)
   p = self.head
   for _ in xrange(0, length):
    p = p.next
   print "p.value", p.value
   p.next = self.head
  elif index == length:
   elem = self.get_elem(length-1)
   elem.next = Node(value)
   elem.next.next = self.head
  else:
   p, post = self.head, self.head
   for i in xrange(index):
    post = p
    p = p.next
   temp = p
   post.next = Node(value, temp)

 def delete_node(self, index):
  if index < 0 or index > self.get_length()-1:
   print "Wrong index number to delete any node."
  elif self.is_empty():
   print "No node can be deleted."
  elif index == 0:
   tail = self.get_elem(self.get_length()-1)
   temp = self.head
   self.head = temp.next
   tail.next = self.head
  elif index == self.get_length()-1:
   p = self.head
   for i in xrange(self.get_length()-2):
    p = p.next
   p.next = self.head
  else:
   p = self.head
   for i in xrange(index-1):
    p = p.next
   p.next = p.next.next

 def show_linked_list(self): # 打印鏈表中的所有元素
  if self.is_empty():
   print 'This is an empty linked list.'
  else:
   p, container = self.head, []
   for _ in xrange(self.get_length()-1): #
    container.append(p.value)
    p = p.next
   container.append(p.value)
   print container

 def clear_linked_list(self): # 將鏈表置空
  p = self.head
  for _ in xrange(0, self.get_length()-1):
   post = p
   p = p.next
   del post
  self.head = 0

 def get_elem(self, index):
  if self.is_empty():
   print "The linked list is empty. Can not get element."
  elif index < 0 or index > self.get_length()-1:
   print "Wrong index number to get any element."
  else:
   p = self.head
   for _ in xrange(index):
    p = p.next
   return p

 def set_elem(self, index, value):
  if self.is_empty():
   print "The linked list is empty. Can not set element."
  elif index < 0 or index > self.get_length()-1:
   print "Wrong index number to set element."
  else:
   p = self.head
   for _ in xrange(index):
    p = p.next
   p.value = value

 def get_index(self, value):
  p = self.head
  for i in xrange(self.get_length()):
   if p.value == value:
    return i
   else:
    p = p.next
  return -1

然后給出約瑟夫算法:

 def josephus_kill_1(head, m):
  '''
  環(huán)形單鏈表,使用 RingLinkedList 數(shù)據(jù)結(jié)構(gòu),約瑟夫問(wèn)題。
  :param head:給定一個(gè)環(huán)形單鏈表的頭結(jié)點(diǎn),和第m個(gè)節(jié)點(diǎn)被殺死
  :return:返回最終剩下的那個(gè)結(jié)點(diǎn)
  本方法比較笨拙,就是按照規(guī)定的路子進(jìn)行尋找,時(shí)間復(fù)雜度為o(m*len(ringlinkedlist))
  '''
  if head == 0:
   print "This is an empty ring linked list."
   return head
  if m < 2:
   print "Wrong m number to play this game."
   return head
  p = head
  while p.next != p:
   for _ in xrange(0, m-1):
    post = p
    p = p.next
   #print post.next.value
   post.next = post.next.next
   p = post.next
  return p

分析:

我采用了最原始的方法來(lái)解決這個(gè)問(wèn)題,時(shí)間復(fù)雜度為o(m*len(ringlinkedlist))。
但是實(shí)際上,如果確定了鏈表的長(zhǎng)度以及要?jiǎng)h除的步長(zhǎng),那么最終剩余的結(jié)點(diǎn)一定是固定的,所以這就是一個(gè)固定的函數(shù),我們只需要根劇M和N確定索引就可以了,這個(gè)函數(shù)涉及到了數(shù)論,具體我就不細(xì)寫(xiě)了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python用61行代碼實(shí)現(xiàn)圖片像素化的示例代碼

    Python用61行代碼實(shí)現(xiàn)圖片像素化的示例代碼

    這篇文章主要介紹了Python用61行代碼實(shí)現(xiàn)圖片像素化的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python自動(dòng)化測(cè)試pytest中fixtureAPI簡(jiǎn)單說(shuō)明

    Python自動(dòng)化測(cè)試pytest中fixtureAPI簡(jiǎn)單說(shuō)明

    這篇文章主要為大家介紹了Python自動(dòng)化測(cè)試pytest中fixtureAPI的簡(jiǎn)單說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • python實(shí)現(xiàn)圖像處理之PiL依賴庫(kù)的案例應(yīng)用詳解

    python實(shí)現(xiàn)圖像處理之PiL依賴庫(kù)的案例應(yīng)用詳解

    這篇文章主要介紹了python實(shí)現(xiàn)圖像處理之PiL依賴庫(kù)的案例應(yīng)用詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Python+OpenCV內(nèi)置方法實(shí)現(xiàn)行人檢測(cè)

    Python+OpenCV內(nèi)置方法實(shí)現(xiàn)行人檢測(cè)

    OpenCV附帶一個(gè)預(yù)訓(xùn)練的HOG+線性SVM模型,可用于在圖像和視頻流中執(zhí)行行人檢測(cè)。本文我們將使用Opencv自帶的模型實(shí)現(xiàn)對(duì)視頻流中的行人檢測(cè)。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • Python+LyScript實(shí)現(xiàn)自定義反匯編

    Python+LyScript實(shí)現(xiàn)自定義反匯編

    LyScript?插件默認(rèn)提供了一個(gè)get_disasm_code()方法可以直接獲取到指定行數(shù)的反匯編代碼。本文將利用LyScript實(shí)現(xiàn)自定義反匯編,感興趣的可以了解一下
    2022-07-07
  • python中eval的用法及說(shuō)明

    python中eval的用法及說(shuō)明

    這篇文章主要介紹了python中eval的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • pandas.concat實(shí)現(xiàn)DataFrame豎著拼接、橫著拼接方式

    pandas.concat實(shí)現(xiàn)DataFrame豎著拼接、橫著拼接方式

    這篇文章主要介紹了pandas.concat實(shí)現(xiàn)DataFrame豎著拼接、橫著拼接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Python中文件操作簡(jiǎn)明介紹

    Python中文件操作簡(jiǎn)明介紹

    這篇文章主要介紹了Python中文件操作簡(jiǎn)明介紹,本文講解了打開(kāi)文件、讀取方法、寫(xiě)入方法、文件內(nèi)移動(dòng)、文件迭代、關(guān)閉文件、截取文件等內(nèi)容,并給出了一個(gè)完整操作實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Python tkinter 下拉日歷控件代碼

    Python tkinter 下拉日歷控件代碼

    這篇文章主要介紹了Python tkinter 下拉日歷控件代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Python操作Redis數(shù)據(jù)庫(kù)的詳細(xì)教程與應(yīng)用實(shí)戰(zhàn)

    Python操作Redis數(shù)據(jù)庫(kù)的詳細(xì)教程與應(yīng)用實(shí)戰(zhàn)

    Redis是一個(gè)高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),支持多種類型的數(shù)據(jù)結(jié)構(gòu),如字符串、哈希表、列表、集合和有序集合等,在Python中,通過(guò)redis-py庫(kù)可以方便地操作Redis數(shù)據(jù)庫(kù),本文將詳細(xì)介紹如何在Python代碼中操作Redis,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

涿鹿县| 哈密市| 鹤庆县| 龙泉市| 沙雅县| 新田县| 毕节市| 伊宁县| 侯马市| 琼海市| 霍城县| 乌恰县| 崇信县| 红桥区| 明星| 白银市| 双峰县| 永兴县| 洪洞县| 黔东| 揭西县| 永定县| 嘉义市| 尼玛县| 楚雄市| 邳州市| 西城区| 拉萨市| 察隅县| 高青县| 礼泉县| 潞城市| 运城市| 马鞍山市| 图片| 光山县| 垦利县| 汶上县| 远安县| 安仁县| 锦屏县|