資料結構 陣列

2021-09-28 15:52:31 字數 2078 閱讀 2840

最近開始學習王爭老師的《資料結構與演算法之美》,通過總結再加上自己的思考的形式記錄這門課程,文章主要作為學習歷程的記錄。

陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。(對這句話進行解釋,引出了以下幾個概念)

1.線性表:陣列,佇列,棧,鍊錶

​ 非線性表:樹和圖

2.連續的記憶體空間和相同型別的資料

​ 由於這兩個限制,若想在陣列中刪除或插入乙個資料,為了保證連續性,就需要做大量的資料搬移工作。

​ 將鍊錶與陣列進行對比,可以得出結論:鍊錶適合插入和刪除,時間複雜度o(1);陣列適合查詢操作,但查詢時間複雜度並不為o(1)。即便是排好序的陣列,用二分查詢,時間複雜度也是o(logn)。故正確的表述為陣列支援隨機訪問,根據下標隨機訪問的時間複雜度為o(1)。

1.陣列的插入操作

​ 若在陣列的末尾插入元素,此時不需要移動資料,則最好時間複雜度為o(1)

​ 若在陣列的開頭插入元素,那所有的資料都需要往後移一位,此時最壞時間複雜度為o(n)

​ 因此平均情況時間複雜度為(1+

2+..

.+n)

/n=o

(n

)(1+2+...+n)/n=o(n)

(1+2+.

..+n

)/n=

o(n)

2.陣列的刪除操作

​ 若在陣列的末尾刪除元素,此時不需要移動資料,則最好時間複雜度為o(1)

​ 若在陣列的開頭刪除元素,那所有的資料都需要往前移一位,此時最壞時間複雜度為o(n)

​ 因此平均情況時間複雜度為(1+

2+..

.+n)

/n=o

(n

)(1+2+...+n)/n=o(n)

(1+2+.

..+n

)/n=

o(n)

​ 此外,若執行多次刪除操作時,可以記錄下已經被刪除的資料,每次的刪除操作並不是搬移資料,只是記錄資料已經被刪除,當陣列沒有更多的儲存空間時,再觸發一次真正的刪除操作。

以leetcode上第35題搜尋插入位置為例,給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。

示例 1:

輸入: [1,3,5,6], 5

輸出: 2

示例 2:

輸入: [1,3,5,6], 2

輸出: 1

class

solution

(object):

defsearchinsert

(self, nums, target)

:"""

:type nums: list[int]

:type target: int

:rtype: int

"""flag =

0for i in

range

(len

(nums)):

if nums[i]

==target:

flag =

1return i

if flag ==0:

if target<=nums[0]

:return

0elif target>=nums[-1

]:return

len(nums)

else

:for i in

range(0

,len

(nums)-1

):if nums[i]

<=target and nums[i+1]

>=target:

return i+

1

​ 從偏移角度理解a[0],0為偏移量。

​ a[k]_address = base_address + k * type_size

​ 如果從1計數,計算陣列元素 a[k] 的記憶體位址就會變為下式,會多出k-1

​ a[k]_address = base_address + (k-1)*type_size

​ 因此,若從1開始計數,則每次訪問資料的時候都會多一次進行減法運算,增加cpu的負擔。

資料結構 陣列

建立陣列 大小為50 棧空間存myarray引用 堆空間存乙個大小為50,預設值為0的陣列。棧空間myarray引用指向堆空間該陣列。int myarray new int 50 public class testarray public class testarray if s intarray....

資料結構 陣列

陣列 就是相同型別的資料按一定順序排列的集合,把有限個型別相同的資料元素用乙個名字表示,通過編號來區分。名字即為陣列名,編號即為下標。陣列是最簡單 使用最廣泛的一種資料結構,其實就是一塊連續的記憶體,哪怕物理上不連續,邏輯上也是連續的,連續存放著一組相同型別資料元素。陣列的定義 type 變數名 n...

資料結構 陣列

陣列 陣列是一種佔據連續記憶體並按順序儲存資料的簡單的資料結構。建立陣列時,需要首先指定陣列的容量,然後依據大小分配記憶體。由於有時候我們需要使用陣列的容量不確定,可能開闢的記憶體遠超實際使用的記憶體,所以陣列的空間效率不好。由於陣列在記憶體中是連續的儲存空間,所以它的時間效率很高,可以在o 1 的...