利用python實現動態陣列

2022-07-11 13:00:12 字數 4504 閱讀 7322

說動態陣列之前,首先要說陣列,陣列是一種順序儲存的線性表,所有元素的記憶體位址都是連續的。陣列的最大優點是他的查詢時間複雜度能夠達到o(1),但是增和刪的時間複雜度較高o(n)

動態陣列,即根據使用者的輸入動態擴充或縮小當前陣列的容量。在python中,已經內建了動態陣列,叫做列表,list

下面是利用python**實現動態陣列的增刪改查操作。

# arrrylist.py

class arr:

# 設定兩個常亮,分別是預設容量大小與未找到元素返回的值

default_capacity = 10

element_not_found = -1

# 初始化,若使用者未指定陣列大小或者小於預設,直接使用預設容量,否則容量為使用者指定

def __init__(self, capacity=default_capacity):

capacity = self.default_capacity if capacity < self.default_capacity else capacity

self._capacity = capacity

self._size = 0

self._elements = [none] * self._capacity

def size(self):

return self._size

def is_empty(self):

# return true if self._size == 0 else false

# 改進上面這還**,因為在python中所有值都可以轉布林,所以利用隱式布林值

return self._size == 0

# 檢視元素是否存在--->bool

def contains(self, element):

# if self.index_of(element):

# return true

# return false

return true if self.index_of(element) else false

# 根據索引新增,新增結束後判斷是否需要擴容

def add(self, index, element):

self._out_of_index(index)

self._size = i = self._size + 1

while i >= index:

self._elements[i] = self._elements[i - 1]

i -= 1

self._elements[index] = element

self._expend_capacity()

# 陣列末尾追加,新增結束後判斷是否需要擴容

def add_last(self, element):

self._out_of_index(self._size)

self._elements[self._size] = element

self._size += 1

self._expend_capacity()

# 根據索引取值

def get(self, index):

self._out_of_index(index)

return self._elements[index]

# 根據索引改值

def set(self, index, element):

self._out_of_index(index)

self._elements[index] = element

# 刪除元素,若使用者未指定引數,預設刪除最後乙個元素,刪除後判斷是否要縮容

def remove(self, index=element_not_found):

self._out_of_index(index)

if index == self.element_not_found:

self._remove_last()

# 刪除元素後,該索引後的每個元素都要往前移一格,然後陣列大小減一

i = index

while i <= self._size:

self._elements[i] = self._elements[i + 1]

i += 1

self._size -= 1

self._reduce_capacity()

# 返回第乙個匹配傳入值的索引

def index_of(self, element):

for index in range(self._size + 1):

if element == self._elements[index]:

return index

return self.element_not_found

def clear(self):

self._size = 0

return self._size

# 判斷索引是否越界

def _out_of_index(self, index):

if index < 0 or index > self._size + 1:

raise indexerror('index out of range')

# 當容量不夠時動態擴容,預設為擴大為原來的1.5倍

def _expend_capacity(self):

# 當size小於容量,直接返回,當size正好等於容量,需要擴容

if self._size < self._capacity - 1:

return

self._capacity = self._capacity * 2

self._new_elements = [none] * self._capacity

for i in range(self._size):

self._new_elements[i] = self._elements[i]

self._elements = self._new_elements

# 動態縮容,預設縮小到當前的一半

def _reduce_capacity(self):

# 當size小於預設容量或者大於當前容量的一半時直接返回

if self._size <= self._capacity or self._size > (self._capacity // 2):

return

self._capacity = (self._capacity // 2).__ceil__()

for i in range(self._size):

self._new_elements[i] = self._elements[i]

self._elements = self._new_elements

def __str__(self):

arrlist = ''

num = 0

for i in self._elements:

if num == self._size:

break

arrlist = arrlist + str(i) + ','

num += 1

arrlist = arrlist.strip(",")

arrlist = '[' + arrlist + ']'

return arrlist

"""刪除最後乙個元素,因為最後乙個元素也是往前移動一格,雖然size-1,但是其實最後乙個元素引用了兩次,

即當前的陣列末尾加上原來位置的引用,無法**,所以對於最後乙個元素要手動設定為none

"""def _remove_last(self):

self._size -= 1

self._elements[self._size] = none

self._reduce_capacity()

# 測試檔案,test.py

if __name__ == '__main__':

from arraylist import arr

a = arr()

# a = a #type:arr

a.add_last(11)

a.add_last(22)

a.add_last(33)

a.add_last(44)

a.add_last('55')

a.add_last(66)

a.add_last(77)

a.add_last(88)

a.add_last(99)

# a.add(2,'st')

# a.remove(2)

# print(a.size())

# print(a.is_empty())

# print(a.contains('55'))

# print(a.index_of(99))

# print(a.get(789))

# a.set(-1,99)

# a.clear()

print(a)

實現動態陣列

學過c語言的都知道陣列的長度在定義陣列時時固定的,不能在程式執行時發生變化,那麼動態陣列是否和以上的定義相違背?動態陣列的實現步驟 1.先使用malloc函式申請乙個足夠大的位址空間,並返回乙個指標作為首位址 2.將原有陣列的元素按照順序複製到新的位址中 3.將帶加入的元素加入到新的位址中並且時放在...

利用動態陣列生成魔方矩陣

利用動態陣列生成魔方矩陣 難點 魔方效果 如果矩陣大小為10 10,則矩陣內的100個數,為從1到100的整數不重複的隨機排序。效果如下圖所示 主要的兩個函式。srand time null 時間種子 k rand n n 產生隨機數 通過malloc 函式動態分配記憶體,n是待使用者輸入的值。ge...

動態陣列的實現

靜態陣列 編譯階段確定陣列的大小,執行階段不能改變陣列大小。缺點是事先無法準確確定陣列的大小,太小不滿足處理需要,太大浪費記憶體空間。動態陣列 執行階段,根據實際需要動態確定陣列的大小。在 c 語言中,可利用記憶體的申請和釋放庫函式,c語言培訓班 以及指向陣列的指標變數可當陣列名使用的特點,來實現動...