Python資料結構學習筆記(二)

2022-06-27 14:54:12 字數 951 閱讀 3116

python列表的底層分析

列表的內部結構

typedef struct pylistobject;

列表有容量的概念,可以動態新增元素。但如果滿了,就得申請乙個更長的陣列。(擴容);

列表所佔記憶體大小計算

* pyobject_var_head: 24位元組

* ob_item: 二級指標, 8位元組

* allocated: 8位元組

所以為什麼列表在通過索引定位元素的時候,時間複雜度是o(1);

因為列表中儲存的都是物件的指標,不管物件多大,它的指標大小是固定的,都是8位元組。

自動擴容

列表縮容

列表的常用操作

1、insert是乙個時間複雜度o(n)的操作,插入位置後面的元素都要向後移動

2、pop彈出元素(通過索引,預設為-1)

3、index查詢元素的索引(返回首次出現的,還可以指定start,end範圍);是乙個時間複雜度o(n)的操作

4、remove根據元素的值刪除元素

5、判斷元素是否在列表中,是乙個時間複雜度o(n)的操作

列表的深淺拷貝

lst=

#這是淺拷貝,兩個物件的位址是一樣的,改變其中乙個,另乙個也會改變

lst_cp = lst.copy()

# 通過索引或者切片都是一樣的,淺拷貝

val = lst[0]

lst_cp = lst[0:1]

因為python中變數、容器裡面的元素都是乙個泛型指標pyobject *,在傳遞的時候回傳遞指標,但是在操作的時候回操作指標指向的記憶體。

lst.copy()就是建立了乙個新列表,把元素拷貝了過去,這裡的元素是指標;只是拷貝了指標,沒有拷貝指標指向的物件(記憶體)

python資料結構學習筆記(二)

上次文章中提到幾個習題,這裡解決一下 r 6.3 實現乙個函式transfer s,t 將棧s中所有元素倒置放入t。def transfer s,t while not s.is empty t.push s.pop 還有其他解法,比較簡單。c 6.16 修改棧的實現方法,加入乙個引數maxlen,...

資料結構學習筆記(二)

分類 順序儲存結構 順序表 鏈式儲存結構 鍊錶 比較 順序表 可以隨機訪問 占用連續空間,儲存分配只能預先進行,即靜態分配。一旦分配好了,在對其操作過程中不變 插入操作需要移動多個元素 鍊錶 不可以隨機訪問 不需要占用連續空間,動態分配。即在要建立新結點的時候再進行空間劃分。插入操作不需要移動多個元...

大話資料結構學習筆記(二)

測定執行時間最可靠的方法就是計算對執行時間有消耗的基本操作的執行次數。在評定演算法的優劣時,與最高次項相乘的常數並不重要,而與最高端項的階數有關。演算法時間複雜度 大o記法。o 1 常數階,o n 線性階,o n 2 平方階。推導大o階 1.用常數1取代執行時間中的所有加法常數 2.在修改後的執行次...