人们通常先在线性表尾部临时添加一个_数据结构学习笔记-线性表
當我們處理一個具有有窮或者無窮的元素數(shù)據(jù)集的時候, 我們需要將其作為一個整體來管理和使用, 用變量去表示它們, 傳入和傳出函數(shù)等等. 因此需要用一種抽象的數(shù)據(jù)類型去管理它們.
- 從實現(xiàn)者的角度, 需要提供一種有用而且效率高的操作, 來訪問和修改這些數(shù)據(jù). 為了實現(xiàn)這一目的, 必須把線性表這種數(shù)據(jù)結(jié)構(gòu)組織好, 賦予一種合適的表示.
- 從使用者的角度, 能簡單地去使用這種結(jié)構(gòu), 有效地實現(xiàn)常用的操作.
結(jié)合計算機內(nèi)存的特點, 重要操作的效率, 人們提出了兩種基本的實現(xiàn)模型
順序表的實現(xiàn)
設(shè)有一個順序表, 起始的內(nèi)存位置為
, 每個元素需要的儲存單元數(shù)為 , 那么第 個元素的地址就是 . python 中l(wèi)ist的每個元素大小和類型都可以不一樣, 因此選擇了元素外置的順序表:外置的順序表中儲存的是數(shù)據(jù)的地址或者索引通常為了描述順序表這個對象的屬性, 還會賦予一塊記錄表屬性的信息記錄域, 儲存最大元素容量和當前元素數(shù).
順序表的優(yōu)缺點
- 優(yōu)點: 按索引訪問元素 , 儲存緊湊節(jié)省空間
- 缺點: 固定大小的元素儲存空間會造成內(nèi)存的浪費. 插入元素的時候會移動許多元素, 效率低
順序表得基本操作及復(fù)雜度
創(chuàng)建空表:
. 分配一塊內(nèi)存空間, 記錄表的容量并將當前元素數(shù)歸零簡單判斷:
. 當當前元素數(shù)小于最大元素數(shù), 表未滿, 反之, 滿訪問元素:
. 檢查索引是否越界, 越界報錯, 不越界返回值遍歷操作:
. 從起始位置一次訪問查找元素:
. 沒有別的辦法, 只能遍歷插入元素: 分情況討論.:從表尾端插入, 非保序的插入, 保序的插入
- 尾端插入: 顯然效率最高, 不需要對其他數(shù)據(jù)進行調(diào)整, 只需要保證不越界即可
- 非保序插入: 將插入位置處的數(shù)據(jù)挪到隊尾, 新數(shù)據(jù)插入
- 保序插入: 調(diào)整其后所有元素的位置, 平均來看和數(shù)量成正比
刪除元素: 同樣三種情況: 刪除表尾, 非保序刪除, 保序刪除
- 特例是查詢刪除, 這種情況同樣也是線性復(fù)雜度
動態(tài)表的實現(xiàn)
python中的list是動態(tài)順序表, 面對現(xiàn)有的儲存空間不夠用的情況時采取一下策略:
我們可以發(fā)現(xiàn)一個問題, 即新申請的空間有多大. 采取翻倍增加空間, 則會將復(fù)雜度降到
. 但是付出的代價時空閑的單元將明顯增多, 付出空間的代價. 因此在面對大數(shù)據(jù)的時候, 提前指定合適大小的儲存空間會明顯降低擴充儲存空間時的開銷.python 順序表基本操作
- 共有操作
- 可變列表list
鏈表--單鏈表
所謂線性表, 就是元素的序列, 維持這元素間的線性關(guān)系, 滿足能找到首元素, 從任意元素出發(fā)能找到其后的元素. 當需要將數(shù)據(jù)離散儲存的時候, 我們就需要引入鏈表的概念. 鏈表中沒有顯式的前后關(guān)聯(lián), 但通過鏈接技術(shù), 能實現(xiàn)元素之間的順序關(guān)系. 基本想法是:
- 把元素儲存在獨立的儲存塊中--稱為結(jié)點
- 從任意結(jié)點可以找到下一個結(jié)點
- 用鏈接的方式顯示地記錄與下一結(jié)點之間的關(guān)聯(lián)
單鏈表
單鏈表的結(jié)點是一個二元組, 其表元素域elem中保存著數(shù)據(jù)項, 鏈接域next中保存著下一個節(jié)點的標識. 這樣, 從表中任意節(jié)點開始都可以找到保存著下一個元素的結(jié)點, 即從首結(jié)點P出發(fā)能找到任何一個結(jié)點.
為了表示一個鏈表的開始, 只需要一個變量保存表得首結(jié)點的引用, 把這樣的變量成為表頭變量或者表頭指針. 為了表示一個鏈表的結(jié)束, 只需要給鏈接域一個空鏈接, python中可以用None來表示.
基本操作
創(chuàng)建空列表: 只需要把相應(yīng)的表頭變量設(shè)置為空鏈接
刪除列表: python中只需要將表指針賦為None, 就拋棄了所有節(jié)點, GC會自動回收儲存
判斷是否為空: 檢查表頭鏈接是否為None
判斷是否滿: 除非儲存用完了所有儲存空間, 否則不會滿
加入元素: 創(chuàng)建一個新結(jié)點并存入數(shù)據(jù); 將上一個鏈接指向新結(jié)點; 將新結(jié)點的鏈接指向下一個結(jié)點.
刪除元素: 將上一結(jié)點的鏈接越過待刪除的, 直接指向下下個結(jié)點.
由于鏈表的順序隱式地有鏈接指明, 因此所有的查詢讀取操作都是需要對鏈表進行遍歷, 時間復(fù)雜度為
循環(huán)列表則是將單鏈表的尾端空鏈接指向表頭鏈接, 由此可以達成循環(huán)的目的.
雙列表則是一個儲存單元前后各有一個鏈接, 可以找到上一個和下一個結(jié)點
總結(jié)
以上是生活随笔為你收集整理的人们通常先在线性表尾部临时添加一个_数据结构学习笔记-线性表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python调用接口上传文件_pytho
- 下一篇: try catch异常后会执行后面的代码