文章目錄
- 正在學習的算法課程:極客時間的王爭老師的《數據結構與算法之美》
- 傳送門: https://time.geekbang.org/column/126
- 目前學到第五講,很良心,共56講,推薦想學數據結構的同學
- 好的理論基礎離不開代碼,今天用python擼了一遍鏈表的操作,找回了很久沒有感受到的成就感,後期可能會上傳github
- 2019/09/25
一、數組
1. 定義:數組(Array)是一種線性表數據結構,用一組連續的內存空間,來存儲一組具有相同類型的數據
2. 四大邏輯結構:
- 線性結構
- 非線性結構:
- 集合結構
- 圖形結構
- 樹形結構
- 內存地址計算
a[i]_address = base_address + i * data_type_size
data_type_size 表示數組中每個元素的大小。我們舉的這個例子裏,數組中存儲的是 int 類型數據,所以 data_type_size 就爲 4 個字節。
3. 數組和鏈表的區別
A:數組支持隨機訪問,根據下表隨機訪問的時間複雜度爲O(1),但是插入和刪除操作的最好情況是O(1),最壞情況是O(n),平均複雜度是O(n)。數組適合查找,鏈表適合插入、刪除
作者的忠告: 在學習的時候,我部門不要死記硬背某個數據結構或者算法,而是要學習它的思想和處理技巧
4. 數組的邊界及越界
上代碼
int main(int argc, char* argv[]){
int i = 0;
int arr[3] = {0}; // 定義一個整形數組,長度爲8,全部初始化爲0
for(; i<=3; i++){
arr[i] = 0; // a[3] 超界,無限循環
printf("hello world\n");
}
return 0;
}
講道理,這段代碼我開始又沒有看懂,後來看了作者的解析以及上網查的資料,有如下理解:
因爲用的是python,所以在a[3]的時候python或者java中會報錯,但是在c中不會,a[3]=0 就相當於 i=0,因此代碼會無限循環。
5. 能力提升的靈魂問題
Q1:python的垃圾回收機制
A:1. 引用計數機制;2. 標記清除機制;3. 分代回收機制
b站傳送門: python乾貨分享—垃圾回收機制
Q2:二位數組的內存地址計算
A2:a[i][j]
的地址是p+(i*col+j)*d