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