1. 程式人生 > 程式設計 >Python中順序表原理與實現方法詳解

Python中順序表原理與實現方法詳解

本文例項講述了Python中順序表原理與實現方法。分享給大家供大家參考,具體如下:

Python中的順序表

Python中的list和tuple兩種型別採用了順序表的實現技術,具有順序表的所有性質。

tuple是不可變型別,即不變的順序表,因此不支援改變其內部狀態的任何操作,而其他方面,則與list的性質類似。

list的基本實現技術

Python標準型別list就是一種元素個數可變的線性表,可以加入和刪除元素,並在各種操作中維持已有元素的順序(即保序),而且還具有以下行為特徵:

  • 基於下標(位置)的高效元素訪問和更新,時間複雜度應該是O(1);

    為滿足該特徵,應該採用順序表技術,表中元素儲存在一塊連續的儲存區中。

  • 允許任意加入元素,而且在不斷加入元素的過程中,表物件的標識(函式id得到的值)不變。

    為滿足該特徵,就必須能更換元素儲存區,並且為保證更換儲存區時list物件的標識id不變,只能採用分離式實現技術。

在Python的官方實現中,list就是一種採用分離式技術實現的動態順序表。這就是為什麼用list.append(x) (或 list.insert(len(list),x),即尾部插入)比在指定位置插入元素效率高的原因。

《資料結構與演算法 Python語言描述》 裘宗燕 著

在Python的官方實現中,list實現採用瞭如下的策略:在建立空表(或者很小的表)時,系統分配一塊能容納8個元素的儲存區;在執行插入操作(insert或append)時,如果元素儲存區滿就換一塊4倍大的儲存區。但如果此時的表已經很大(目前的閥值為50000),則改變策略,採用加一倍的方法。引入這種改變策略的方式,是為了避免出現過多空閒的儲存位置。

在Python的官方實現中,list實現採用瞭如下的策略:

  /* This over-allocates proportional to the list size,making room
   * for additional growth. The over-allocation is mild,but is
   * enough to give linear-time amortized behavior over a long
   * sequence of appends() in the presence of a poorly-performing
   * system realloc().
   * The growth pattern is: 0,4,8,16,25,35,46,58,72,88,...
   */
  new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
  /* check for integer overflow */
  if (new_allocated > PY_SIZE_MAX - newsize) {
    PyErr_NoMemory();
    return -1;
  } else {
    new_allocated += newsize;
  }

python順序表增刪查實現

class shunxubiao:
  def __init__(self,length):#length表示順序表的長度,決定此順序表最多儲存多少元素
    self.length=length
    self.data=[] #data表示順序表內容
    self.biao=-1 #元素下標
  def weikong(self):#判斷 這個順序表是否是空的
    if self.biao==-1:
      return True
    else:
      return False
  def mande(self):#判斷此順序表是否是滿的
    if self.biao+1==self.length:
      return True
    else:
      return False
  def qingkong(self):
    if not self.weikong():
      self.data=[]
      self.biao=-1
  def geshu(self):
    return self.biao+1
  def chazhao(self,x):#知道下標查詢元素
    return self.data[x]
  def chazhao1(self,x):#知道元素查詢下標
    if self.weikong():
      print('表為空')
      return -1
    for i in range(self.biao+1):
      if self.data[i]==x:
       return i
       break
       print('查詢的元素不存在')
  def biaoweijia(self,x): #給順序表表尾加一個元素
    if self.mande():
      print('biaoyiman')
    else:
     self.data.append(x)
    self.biao+=1
  def charu(self,index,x):#想順序表的index位置插入x元素
    if self.mande():
      print('biayiman')
    elif index<0 or index>self.biao-1:
      print('bunengcharu')
    else:
      for i in range(self.biao,index-1):
        self.data[i+1]=self.data[i]
        self.data[index-1]=x
      self.biao+=1
  def shanchu(self,x):#刪除指定元素x
    if self.weikong():#判斷是不是空表
      print('kongde,bunengshanchu')
    index=-1#用index來找x的位置
    for i in (self.data):
      index+=1
      if i == x:
        break
    for i in range(index,self.biao-1):#把x元素之後的元素都向前推進一格
      self.data[i]=self.data[i+1]
    self.biao-=1
c=shunxubiao(6)
c.data=[2,5,6]
c.biao=3
c.weikong()
print(c.chazhao(2))#知道尾標2查詢元素
print(c.chazhao1(4))#知道元素查詢尾標
c.biaoweijia(7)#給表尾加元素
print(c.data)
print(c.biao)
c.charu(3,9)
print(c.data)
print(c.biao)
c.shanchu(7)
print(c.data)
print(c.biao)

輸出結果:

[2,6,7] 4 [2,7] 5 [2,7] 4

思考:為什麼沒有把9新增進去,也沒有把7刪除掉

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python資料結構與演算法教程》、《Python加密解密演算法與技巧總結》、《Python編碼操作技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。