Python中順序表原理與實(shí)現(xiàn)方法詳解
本文實(shí)例講述了Python中順序表原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
Python中的順序表
Python中的list和tuple兩種類型采用了順序表的實(shí)現(xiàn)技術(shù),具有順序表的所有性質(zhì)。
tuple是不可變類型,即不變的順序表,因此不支持改變其內(nèi)部狀態(tài)的任何操作,而其他方面,則與list的性質(zhì)類似。
list的基本實(shí)現(xiàn)技術(shù)
Python標(biāo)準(zhǔn)類型list就是一種元素個(gè)數(shù)可變的線性表,可以加入和刪除元素,并在各種操作中維持已有元素的順序(即保序),而且還具有以下行為特征:
- 基于下標(biāo)(位置)的高效元素訪問和更新,時(shí)間復(fù)雜度應(yīng)該是O(1);
為滿足該特征,應(yīng)該采用順序表技術(shù),表中元素保存在一塊連續(xù)的存儲(chǔ)區(qū)中。
- 允許任意加入元素,而且在不斷加入元素的過程中,表對(duì)象的標(biāo)識(shí)(函數(shù)id得到的值)不變。
為滿足該特征,就必須能更換元素存儲(chǔ)區(qū),并且為保證更換存儲(chǔ)區(qū)時(shí)list對(duì)象的標(biāo)識(shí)id不變,只能采用分離式實(shí)現(xiàn)技術(shù)。
在Python的官方實(shí)現(xiàn)中,list就是一種采用分離式技術(shù)實(shí)現(xiàn)的動(dòng)態(tài)順序表。這就是為什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。
《數(shù)據(jù)結(jié)構(gòu)與算法 Python語(yǔ)言描述》 裘宗燕 著
在Python的官方實(shí)現(xiàn)中,list實(shí)現(xiàn)采用了如下的策略:在建立空表(或者很小的表)時(shí),系統(tǒng)分配一塊能容納8個(gè)元素的存儲(chǔ)區(qū);在執(zhí)行插入操作(insert或append)時(shí),如果元素存儲(chǔ)區(qū)滿就換一塊4倍大的存儲(chǔ)區(qū)。但如果此時(shí)的表已經(jīng)很大(目前的閥值為50000),則改變策略,采用加一倍的方法。引入這種改變策略的方式,是為了避免出現(xiàn)過多空閑的存儲(chǔ)位置。
在Python的官方實(shí)現(xiàn)中,list實(shí)現(xiàn)采用了如下的策略:
/* 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順序表增刪查實(shí)現(xiàn)
class shunxubiao: def __init__(self,length):#length表示順序表的長(zhǎng)度,決定此順序表最多存儲(chǔ)多少元素 self.length=length self.data=[] #data表示順序表內(nèi)容 self.biao=-1 #元素下標(biāo) def weikong(self):#判斷 這個(gè)順序表是否是空的 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):#知道下標(biāo)查找元素 return self.data[x] def chazhao1(self,x):#知道元素查找下標(biāo) 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): #給順序表表尾加一個(gè)元素 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來(lái)找x的位置 for i in (self.data): index+=1 if i == x: break for i in range(index,self.biao-1):#把x元素之后的元素都向前推進(jìn)一格 self.data[i]=self.data[i+1] self.biao-=1 c=shunxubiao(6) c.data=[2,4,5,6] c.biao=3 c.weikong() print(c.chazhao(2))#知道尾標(biāo)2查找元素 print(c.chazhao1(4))#知道元素查找尾標(biāo) 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)
輸出結(jié)果:
[2, 4, 5, 6, 7] 4 [2, 4, 5, 6, 7] 5 [2, 4, 5, 6, 7] 4
思考:為什么沒有把9添加進(jìn)去,也沒有把7刪除掉
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python讀取dicom圖像示例(SimpleITK和dicom包實(shí)現(xiàn))
今天小編就為大家分享一篇python讀取dicom圖像示例(SimpleITK和dicom包實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-01-01Pytorch 實(shí)現(xiàn)focal_loss 多類別和二分類示例
今天小編就為大家分享一篇Pytorch 實(shí)現(xiàn)focal_loss 多類別和二分類示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-01-01五分鐘學(xué)會(huì)怎么用Pygame做一個(gè)簡(jiǎn)單的貪吃蛇
這篇文章主要介紹了五分鐘學(xué)會(huì)怎么用Pygame做一個(gè)簡(jiǎn)單的貪吃蛇,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01python 成功引入包但無(wú)法正常調(diào)用的解決
這篇文章主要介紹了python 成功引入包但無(wú)法正常調(diào)用的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-03-03tensorflow 中對(duì)數(shù)組元素的操作方法
今天小編就為大家分享一篇tensorflow 中對(duì)數(shù)組元素的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-07-07