資料結構與演算法 陣列與鍊錶(一)

2021-10-09 22:25:49 字數 2797 閱讀 1908

定義

陣列是一種用一片連續的記憶體空間來儲存一組相同型別的資料的線性表結構。

「連續的記憶體空間」這個特點,決定了陣列支援隨機訪問的特性。計算機通過位址來訪問記憶體中的資料,陣列在記憶體中存放的是它的首位址,一維陣列的定址公式為a[i

]add

ress

=bas

eadd

ress

+i∗s

izeo

f(da

taty

pe

)a[i]_ = base_ + i * sizeof(datatype)

a[i]ad

dres

s​=b

asea

ddre

ss​+

i∗si

zeof

(dat

atyp

e)。陣列的基本操作

# 建立乙個int型別的array類

class

array()

:def

__init__

(self)

:'''陣列類初始化方法.'''

self.__data =

# 資料儲存list

查詢資料:上面提到了陣列支援隨機訪問,陣列根據下標訪問的時間複雜度為o(1);但是如果是要查詢滿足特定條件的元素,那麼我們需要遍歷陣列,時間複雜度為o(n)。所以說陣列的查詢操作時間複雜度為o(1)的說法是不準確的,準確來說應該是根據下標隨機訪問的時間複雜度為o(1)。

def

find

(self, index)

:'''陣列的查詢方法.

引數:index:將要查詢的資料的下標

返回:如果查詢成功,則返回找到的資料

如果查詢失敗,則返回false

'''if index <

len(self.__data)

:return self.__data[index]

return

false

插入資料:陣列的插入資料在前面我們分析過,如果插入的元素在陣列末尾,時間複雜度為o(1);如果資料插入中間的位置,時間複雜度為o(n),因為需要移動資料。平均情況時間複雜度為o(n)。當然,如果陣列本身不是有序的,那麼在中間插入資料時,我們可以選擇讓要插入的位置對應的元素放到陣列的末尾,然後用要插入的資料替換該位置的元素的值,這樣在陣列中間插入資料的時間複雜度就為o(1)了。

def

insert

(self, index, value)

:'''陣列插入資料操作.

引數:index:將要插入的下標

value:將要插入的資料

返回:如果插入成功,則返回true

如果插入失敗,則返回false

'''if index <

0or index >

len(self.__data)

:return

false

else

: self.__data.insert(index, value)

return

true

definserttotail

(self, value)

:'''直接在陣列尾部插入資料.

引數:value:將要插入的資料

'''

刪除資料:如果要刪除的資料是陣列的最後乙個元素,那麼直接刪除,時間複雜度為o(1);如果刪除中間的元素,那麼要將中間位置後面的元素依次往前移動乙個位置,時間複雜度為o(n)。平均情況時間複雜度為o(n)。同上,如果陣列不是有序的,我們可以用陣列最末尾元素的值代替要刪除位置的值,再刪除最後乙個元素,這樣的時間複雜度也是o(1)。

def

delete

(self, index)

:'''陣列的刪除方法.

引數:index:將要刪除的資料的下標

返回:如果刪除成功,則返回true

如果刪除失敗,則返回false

'''length =

len(self.__data)

if index >= length or index <0:

return

false

elif index == length -1:

self.__data.pop(-1

)return

true

else

:for i in

range

(index +

1, length)

: self.__data[i -1]

= self.__data[i]

self.__data.pop(-1

)return

true

陣列與容器

在很多程式語言中,針對陣列型別會提供乙個容器類將陣列的多種操作封裝起來,比如python的list,c++中的vector等。容器跟陣列相比起來,它有乙個優勢就是容器支援動態擴容。我們都知道陣列我們在定義陣列時就規定了陣列的大小,一旦資料量超過陣列本身的大小,那麼我們就要為陣列申請一塊更大的空間並且將原來陣列中的資料全部搬移到新陣列中去,對於日常操作來說很繁瑣。而容器類,在我們的資料量超過現有的空間時,我們不用關心底層相關的擴容邏輯,因為容器已經幫我們實現了。

但是由於資料的搬移比較耗時,所以我們如果能夠事先確定資料量的話盡量事先指定資料大小,這樣減少了對資料搬移的時間消耗。

資料結構與演算法 陣列(一)

資料結構與演算法是計算機發展的基石,現代計算機的起源是數學,數學的核心是演算法,計算機歷史上每一次大的變革都離不開演算法的推動。縱然 條條大路通羅馬 但好的演算法永遠比提高硬體裝置管用。在排序陣列中,找出給定數字出現的次數。如,1,2,2,2,3 中2出現的次數是3次。簡單粗暴的方法是從頭到尾遍歷一...

資料結構與演算法 陣列

陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。其中有幾個重要的概念 非線性表 連續的記憶體空間 儲存相同型別的資料 如圖所示,這是乙個長度為5的int陣列arr,我們假設起始的記憶體位址為1000,那麼第乙個元素的記憶體位址範圍就是 1000 1003,這是因為乙...

資料結構與演算法 陣列

題型1 如何用遞迴實現陣列求和 方法1 題型2 如何用乙個for迴圈列印乙個二維陣列 方法1 array在二維陣列中的行號和列號分別為 i maxy i maxy 題型3 用遞迴和非遞迴的方法實現二分查詢 題型4 如何在排序陣列中,找出給定數字出現的次數 方法1 二分查詢,分別找出左邊界和右邊界,左...