python中煉表和陣列 Python

2021-10-11 11:45:23 字數 1591 閱讀 3496

x

2020-9-12 12:24 上傳

2020-9-12 12:24 上傳

2020-9-12 12:24 上傳

曾經有個禿頂的面試官問了我乙個問題:

陣列相對於鍊錶,為什麼我們都說陣列查詢效率快?

python 大星:陣列占用的記憶體空間是連續的

面試官:還有其他的嗎?

python 大星:......

以 int 型別為例,data_type_size 佔 4 個位元組 ,length 為 10,計算機分配連續的記憶體空間 1000 - 1039,其中,記憶體塊的首位址為 base_address = 1000。

2020-9-12 12:24 上傳

當我們隨機訪問陣列中的乙個元素,

2020-9-12 12:24 上傳

我們從這個公式可以看出,如果陣列下角標從 1 開始,那麼公式將多做一步減法,這也是為什麼陣列下角標一般從 0 開始的原因之一。

2020-9-12 12:24 上傳

回到最開始的面試題,為什麼我們都說陣列查詢效率快?

● 陣列占用的記憶體空間是連續的

● 陣列中都為同一型別的元素

● cpu 快取會讀入一片連續的記憶體空間

因為陣列結構是連續的記憶體位址, 所以陣列全部或者部分元素被連續存在 cpu 快取裡面

2020-9-12 12:24 上傳

陣列低效的 「插入」 和 「刪除」?

● 插入

2020-9-12 12:24 上傳

插入如果在陣列末尾插入元素 x,不需要移動陣列中的其他元素,時間複雜度為 o(1)。如果在陣列首位插入元素 x,陣列中的其他元素都需要往後移動一位,最壞時間複雜度是 o (n)。因為我們在每個位置插入元素的概率是一樣的,所以平均情況時間複雜度為 (1+2+…n)/n=o (n)。

● 刪除

2020-9-12 12:24 上傳

刪除跟插入資料類似,如果刪除陣列末尾的資料,則最好情況時間複雜度為 o (1);如果刪除開頭的資料,則最壞情況時間複雜度為 o (n);平均情況時間複雜度也為 o (n)。

2020-9-12 12:24 上傳

以單向鍊錶為例

2020-9-12 12:24 上傳

單向鍊錶

● 鍊錶低效的「查詢」?

我們把鍊錶的第乙個節點叫頭節點,頭結點記錄鍊錶的基位址,最後乙個節點叫尾節點(尾節點最後指向 null)。

因為鍊錶的空間是分散的,所以不具有隨機訪問性,如要需要訪問某個位置的資料,需要從第乙個資料開始找起,依次往後遍歷,直到找到待查詢的位置,故查詢最後乙個元素時,則最壞的情況時間複雜度為 o (n)。

● 鍊錶高效的「插入」 和 「刪除」

2020-9-12 12:24 上傳

圖 1 - 插入

2020-9-12 12:24 上傳

圖2 - 刪除

由於鍊錶的儲存空間本身不是連續,在鍊錶中插入或者刪除元素,不需要為了記憶體的連續性而移動其他元素。由圖 1 和 圖 2中,我們可以看出只需要改變相鄰節點的指標即可,故煉表在插入或者刪除的時間複雜度為 o (1)。

陣列和鍊錶對比圖

2020-9-12 12:24 上傳

>>>python 演算法 02--陣列和鍊錶(上)

鍊錶和陣列的區別

構建 陣列必須事先定義固定的長度 元素個數 不能適應資料動態地增減的情況。當資料增加時,可能超出原先定義的元素個數 當資料減少時,造成記憶體浪費 陣列可以根據下標直接訪問。鍊錶動態地進行儲存分配,可以適應資料動態地增減的情況,且可以方便地插入 刪除資料項。陣列中插入 刪除資料項時,需要移動其它資料項...

鍊錶和陣列的區別

鍊錶的特性是在中間任意位置新增刪除元素的都非常的快,不需要移動其它的元素。鍊錶顧名思義,要把各個元素鏈結起來才算撒。通常鍊錶每乙個元素都要儲存乙個指向下乙個元素的指標 單鏈表 雙鏈表的化每個元素即要儲存到下乙個元素的指標,還要儲存乙個上乙個元素的指標。迴圈鍊錶則把最後乙個元素中儲存下乙個元素指標指向...

鍊錶和陣列的區別

從邏輯結構來看 1.陣列必須事先定義固定的長度 元素個數 不能適應資料動態地增減的情況。當資料增加時,可能超出原先定義的元素個數 當資料減少時,造成記憶體浪費 陣列可以根據下標直接訪問。2.鍊錶動態地進行儲存分配,可以適應資料動態地增減的情況,且可以方便地插入 刪除資料項。陣列中插入 刪除資料項時,...