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程式設計有所幫助。