3、顺序表、内存、类型、python中的list
1、內存、類型本質、連續存儲
1、內存本質
2、C 語言實例-計算 int, float, double 和 char 字節大小
使用 sizeof 操作符計算int, float, double 和 char四種變量字節大小。
sizeof 是 C 語言的一種單目操作符,如C語言的其他操作符++、--等,它并不是函數。
sizeof 操作符以字節形式給出了其操作數的存儲大小。
#include <stdio.h>int main() {int integerType;float floatType;double doubleType;char charType;// sizeof 操作符用于計算變量的字節大小printf("Size of int: %ld bytes\n",sizeof(integerType));printf("Size of float: %ld bytes\n",sizeof(floatType));printf("Size of double: %ld bytes\n",sizeof(doubleType));printf("Size of char: %ld byte\n",sizeof(charType));return 0; }?
?
32 位的系統
存儲單元Size of int: 4 bytes Size of float: 4 bytes Size of double: 8 bytes Size of char: 1 byte3、連續存儲:一組相同類型的數據
?
?2、順序表
這樣的一組序列元素的組織形式,我們可以將其抽象為線性表。一個線性表是某類元素的一個集合,還記錄著元素之間的一種順序關系。線性表是最基本的數據結構之一,在實際程序中應用非常廣泛,它還經常被用作更復雜的數據結構的實現基礎。?
根據線性表的實際存儲方式,分為兩種實現模型:
- 順序表,將元素順序地存放在一塊連續的存儲區里,元素間的順序關系由它們的存儲順序自然表示。
- 鏈表,將元素存放在通過鏈接構造起來的一系列存儲塊中。
?
3、順序表的基本形式
?
?(1)基本順序表
?? ?
圖a表示的是順序表的基本形式,數據元素本身連續存儲,每個元素所占的存儲單元大小固定相同,元素的下標是其邏輯地址, 而元素存儲的物理地址(實際內存地址)可以通過存儲區的起始地址Loc (e0)加上邏輯地址(第i個元素)與存儲單元大小(c)的乘積計算而得,即:Loc(ei) = Loc(e0) + c*i故,訪問指定元素時無需從頭遍歷,通過計算便可獲得對應地址,其時間復雜度為O(1)。?
?
?
(2)元素外圍順序表
如果元素的大小不統一,則須采用圖b的元素外置的形式,將實際數據元素另行存儲,而順序表中各單元位置保存對應元素的地址信息(即鏈接)。由于每個鏈接所需的存儲量相同,通過上述公式,可以計算出元素鏈接的存儲位置,而后順著鏈接找到實際存儲的數據元素。
注意,圖b中的c不再是數據元素的大小,而是存儲一個鏈接地址所需的存儲量,這個量通常很小。圖b這樣的順序表也被稱為對實際數據的索引,這是最簡單的索引結構。
?
4、順序表的結構與實現
1、順序表的結構
一個順序表的完整信息包括兩部分,一部分是表中的元素集合,另一部分是為實現正確操作而需記錄的信息,即有關表的整體情況的信息,
這部分信息主要包括元素存儲區的容量和當前表中已有的元素個數兩項
?
2、順序表的兩種基本實現方式
?? ? ? ? ?
?
圖a為一體式結構,存儲表信息的單元與元素存儲區以連續的方式安排在一塊存儲區里,兩部分數據的整體形成一個完整的順序表對象。
一體式結構整體性強,易于管理。但是由于數據元素存儲區域是表對象的一部分,順序表創建后,元素存儲區就固定了。
圖b為分離式結構,表對象里只保存與整個表有關的信息(即容量和元素個數),實際數據元素存放在另一個獨立的元素存儲區里,通過鏈接與基本表對象關聯。
?
3、元素存儲區替換
一體式結構由于順序表信息區與數據區連續存儲在一起,所以若想更換數據區,則只能整體搬遷,即整個順序表對象(指存儲順序表的結構信息的區域)改變了。
分離式結構若想更換數據區,只需將表信息區中的數據區鏈接地址更新即可,而該順序表對象不變。
# 多添加幾個數據 1、重新申請一塊空間,空白內存 2、數據搬遷,釋放掉以前的3、Li指向新的內存起始地址0X523
?? ? ? ??? ??
?
如果采用分離式‘’
4、元素存儲區擴充:以空間換時間
采用分離式結構的順序表,若將數據區更換為存儲空間更大的區域,則可以在不改變表對象的前提下對其數據存儲區進行了擴充,所有使用這個表的地方都不必修改。
只要程序的運行環境(計算機系統)還有空閑存儲,這種表結構就不會因為滿了而導致操作無法進行。
人們把采用這種技術實現的順序表稱為動態順序表,因為其容量可以在使用中動態變化。
?
?
?5、python列表實現
? (1)順序表添加與刪除元素
a. 尾端加入元素,時間復雜度為O(1)b. 非保序的加入元素(不常見),時間復雜度為O(1)c. 保序的元素加入,時間復雜度為O(n)
?
?
a. 刪除表尾元素,時間復雜度為O(1)b. 非保序的元素刪除(不常見),時間復雜度為O(1)c. 保序的元素刪除,時間復雜度為O(n)
?
(2)python中的順序表
?
(3)list就是一種采用分離式技術實現的動態順序表
?
刪除list表的復雜度是O(n)
?
轉載于:https://www.cnblogs.com/venicid/p/9384058.html
總結
以上是生活随笔為你收集整理的3、顺序表、内存、类型、python中的list的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 切图工具优化的几点总结
- 下一篇: 如何把一个二维数组的地址赋给一个二维指针