python顺序表数组_数据结构 | 顺序表
什么是數(shù)據(jù)結(jié)構(gòu)?
數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成。 簡(jiǎn)單來(lái)說(shuō),數(shù)據(jù)結(jié)構(gòu)就是設(shè)計(jì)數(shù)據(jù)以何種方式組織并存儲(chǔ)在計(jì)算機(jī)中。 比如:列表、集合與字典等都是一種數(shù)據(jù)結(jié)構(gòu)。
N.Wirth: “程序=數(shù)據(jù)結(jié)構(gòu)+算法”
數(shù)據(jù)結(jié)構(gòu)的分類
數(shù)據(jù)結(jié)構(gòu)按照其邏輯結(jié)構(gòu)可分為線性結(jié)構(gòu)、樹結(jié)構(gòu)、圖結(jié)構(gòu)
線性結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)中的元素存在一對(duì)一的相互關(guān)系
樹結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)中的元素存在一對(duì)多的相互關(guān)系
圖結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)中的元素存在多對(duì)多的相互關(guān)系
線性結(jié)構(gòu)/線性表
順序表
鏈表
順序表
1. 列表 / 數(shù)組
動(dòng)態(tài)數(shù)組也稱數(shù)組列表,在python中一般為L(zhǎng)ist。
列表:在其他編程語(yǔ)言中稱為“數(shù)組”,是一種基本的數(shù)據(jù)結(jié)構(gòu)類型。列表又叫做順序表(連續(xù)存儲(chǔ)的方式)。
數(shù)組的缺點(diǎn)是大小固定, 一旦聲明長(zhǎng)度就要占用連續(xù)的內(nèi)存空間, 當(dāng)空間不夠用時(shí)更換更大的空間, 此時(shí)就需要將原數(shù)組的所有數(shù)據(jù)遷移過去, 比較費(fèi)時(shí)。
順序存儲(chǔ)數(shù)據(jù)
連續(xù)存儲(chǔ)
任意順序訪問,可變大小的列表數(shù)據(jù)結(jié)構(gòu)允許增加、刪除元素
2. 數(shù)組操作函數(shù):
3. 數(shù)組內(nèi)置操作函數(shù)的時(shí)間復(fù)雜度
4.用python實(shí)現(xiàn)內(nèi)置函數(shù)的方法
classDynamicArray:def __init__(self):'Create an empty array.'self._n= 0 #size
self._capacity = 10 #先給個(gè)10
self._A =self._make_array(self._capacity)def __len__(self):returnself._ndefis_empty(self):return self._n ==0#O(1)
def __getitem__(self, k):if not 0 <= k
defappend(self, obj):if self._n == self._capacity: #首先要判斷該容器是否放得下
self._resize(2 *self._capacity)
self._A[self._n]=obj
self._n+= 1
def_make_array(self, c):return (c *ctypes.py_object)()def_resize(self, c):
B=self._make_array(c)for k inrange(self._n):
B[k]=self._A[k]
self._A=B
self._capacity=c#O(n)
definsert(self, k, value):if self._n ==self._capacity:
self._resize(2 *self._capacity)for j in range(self._n, k, -1): #從后往前一個(gè)一個(gè)往后移
self._A[j] = self._A[j - 1]
self._A[k]=value
self._n+= 1
#O(n)
defremove(self, value):for k inrange(self._n):if self._A[k] == value: #一個(gè)個(gè)查value
for j in range(k, self._n - 1):
self._A[j]= self._A[j + 1] #再一個(gè)個(gè)移上來(lái)
self._A[self._n - 1] =None
self._n-= 1
return
raise ValueError('value not found')def_print(self):for i inrange(self._n):print(self._A[i], end=' ')print()
在append和insert函數(shù)里面,要先判斷是否超出給定的capacity,如果超出,要擴(kuò)容resize擴(kuò)容;
insert時(shí),從后往前找,remove的時(shí)候從前往后找,然后找到之后,將后面的元素一一往前移動(dòng)?self._A[j] = self._A[j + 1],最后一個(gè)元素賦值為None,然后總n-1;
__getitem__?當(dāng)訪問元素時(shí)會(huì)調(diào)用該方法li[i]
5. list進(jìn)行reverse
復(fù)雜度 O(n)
defreverse(list):
i, j = 0, len(list)-1
while i
list[i],list[j] =list[j],list[i]
i += 1j -= 1
returnlist
li = [1,2,3,4,5,6]
print(reverse(li))
'''
[6, 5, 4, 3, 2, 1]
'''
注意:因?yàn)橄聵?biāo)從0開始,所以len后要減1
defreverse(self):
elems =self.elements
i, j = 0, len(elems)-1
while i
elems[i],elems[j] =elems[j],elems[i]
i, j= i+1,j-1
注意:寫法
6. 關(guān)于列表的問題
列表中元素使如何存儲(chǔ)的?
列表提供了哪些基本的操作?
這些操作的時(shí)間復(fù)雜度是多少?append是O(1);插入和刪除是O(n)
擴(kuò)展:Python的列表是如何實(shí)現(xiàn)的?
其他語(yǔ)言中的數(shù)組:一個(gè)整數(shù)占4個(gè)字節(jié)(bytes), 假設(shè)有一個(gè)數(shù)組a,在內(nèi)存中會(huì)記錄它的起始點(diǎn)300處,找a[2]就是300+2*4=308
python中的列表,如何解決append的問題呢?
會(huì)在后面的內(nèi)存中開辟一個(gè)比append前長(zhǎng)一倍的內(nèi)存,然后,將前面的元素全部復(fù)制過去。
如何解決數(shù)據(jù)類型不一樣的問題,因?yàn)閿?shù)據(jù)類型不一樣,占用的內(nèi)存就不一樣,就不好去計(jì)算。
另外開辟一段內(nèi)存來(lái)存放真實(shí)數(shù)據(jù)。仍然通過之前的方式找到數(shù)據(jù)所在地址,比如找a[1],就通過300+4*1找到304,304處存放的是真實(shí)數(shù)據(jù)所在的內(nèi)存地址2000,通過二次尋址的方式,找到真實(shí)數(shù)據(jù)2000處存放的是3.2。
總結(jié)
以上是生活随笔為你收集整理的python顺序表数组_数据结构 | 顺序表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么获取上一个html网页传过来的值_爬
- 下一篇: python调用r语言_【Python调