日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python顺序表数组_数据结构 | 顺序表

發(fā)布時(shí)間:2024/10/14 python 91 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python顺序表数组_数据结构 | 顺序表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。