順序表的理解

2022-03-17 04:46:50 字數 3228 閱讀 5591

傳統順序表:

起始實體地址+邏輯位址(元素下標)*儲存單元大小(每乙個元素所占用幾個位元組)=所查詢元素的實體地址

資料元素本身連續儲存,每個元素所佔的儲存單元大小固定相同

元素的下標是其邏輯位址,而元素儲存的實體地址是元素實際記憶體位址

可以通過儲存區起始位址加上邏輯位址與儲存單元的大小(c)的乘乘積計算而得

即:l0+(n-1)*c得到你想要的元素的實體地址

背景:儲存資料型別不一樣,導致儲存單元大小不一樣, 導致不能使用傳統的順序表來讀寫資料

元素外接

各個元素對應自己的實體地址將各個元素的實體地址以傳統順序表的形式儲存起來

每次讀寫,只需要查詢存放的順序表內的(元素的實體地址)即可

順序表的結構與實現

順序表的結構:

1.表頭資訊

2.資料區

表頭資訊:

容量(能存多少元素)元素個數(當前存了多少個元素)

資料區:

元素集合

1.一體式結構:
描述:儲存表資訊的單元與元素儲存區以連續的方式安排在一塊儲存區內,兩部分資料的整體形成乙個完整的順序表物件

特點:

一體式結構整體性強,易於管理,但是由於資料元素儲存區是表物件的一部分,資料表建立後,元素儲存區就固定了,

注意:

若儲存區滿了,再新增元素,則需要更改整個表物件

2.分離式結構:

1.表物件

表物件裡只儲存與整個表有關的資訊

(容量和元素的個數)

2.元素集合

實際元素元素存放在另乙個獨立的元素儲存區內

通過鏈結與基本表物件關聯

1.一體式
一體式結構由於順序表資訊區與資料區連續儲存在一起,

所以若想更改資料區,則只能整體搬遷

即整個順序表物件(指儲存在順序表的結構資訊的區域改變了)

2.分離式
只需要將表資訊區中鏈結位址更新即可,而該書序物件不變

**主要採用分離式結構動態順序表

採用分離式結構的順序表,若將資料區更換為更大的儲存空間,則可以不在改變表物件的前提下

對其資料區進行擴充,所有使用這個表的地方都不必修改

只要在程式的執行環境(計算機系統)還有空間儲存,這種表結構就不會因為滿了而導致操作無法進行

這種技術實現的順序表稱為動態順序表

因為其容量可以在使用中動態變化

動態順序表特徵:

不更改表物件不更改表結構

只對其資料儲存區進行修改

擴充的兩種策略

1.線性增長:

每次擴充增加固定的儲存位置

如:每次擴充增加10個元素位置

特點:節省空間,但擴充操作頻繁(操作次數多)

2.加倍擴充
每次擴充容量加倍, 如每次擴充增加一倍的儲存空間

特點:

減少了擴充的操縱次數,浪費空間資源

主要採用加倍擴充,[以空間換時間]1.從頭部插入
原列表內所有的元素全部後移一位

然後將新元素插入

時間複雜度為o(n)

2.從尾部插入
直接在尾部插入即可

時間複雜度為o(1)

[====以上為保序的情況====]

3.不保序

直接將要插入的位置的元素新增到隊尾,將新元素插入到騰出來的位置

時間複雜度為o(1)

刪除元素

1.尾部刪除:

直接從尾部刪除

時間複雜復為o(1)

2.其他位置刪除:
直接刪除元素,該元素後面的元素統一前移一位

時間複雜度為o(1)

[====以上為保序刪除====]

3.非保序

將尾部的元素直接替換掉要刪除的元素

時間複雜度為o(1)

採用分離式技術實現的動態順序表

python標準型別list就是一種元素個數可變的線性表

並在各種操作中維持已有元素的順序(保序)

基於下標的高效元素訪問和更新,時間複雜度為o(1)

允許任意加入元素,而且在不斷假如元素的過程中,表物件的標識(函式id得到的值)不變

為滿足該特徵,就必須更換元素儲存區,並且為保證更換儲存區是list物件的標識id不變,只能採用分離式實現技術

在pytho的官方實現中,list就是一種採用分離式技術實現的動態順序表

尾部新增比其他座標插入效率高

list實現採用如下策略

在建立表時(或很小的表),系統分配一塊能夠容納8個元素的儲存區,在執行插入操作時,如果元素儲存區滿了, 就換一塊4倍大的儲存區

但如果此時的表已經很大(目前的閥值為50000)

則改變策略,採用加一倍的方法

避免出現過多的空閒的儲存位置

順序表 自我理解

順序表的實現比較簡單些,順序表可以用陣列模擬 如果使用陣列進行模擬,會比採用指標更簡單,但是老師建議用指標來寫,適合初學者回憶程式基本語法。typedef struct listsqlist 這一段的 typedef 我想了好久的,因為在之前老師說這是乙個定義性函式,但是連著乙個結構函式我就有些暈了...

線性表的理解以及順序表和煉表的比較

線性表分為順序儲存和鏈式儲存 順序儲存的就是順序表,鏈式儲存分為靜態鍊錶 借助陣列實現 單鏈表,雙鏈表,迴圈多鍊錶 這三個都是通過指標實現 線性表的基本操作 initlist l 初始化表。構建空的線性表。length l 獲取表長,返回線性表l的長度。locateelem l,i 按值查詢。get...

順序表 有序順序表的插入

本題要求實現遞增順序表的有序插入函式。l是乙個遞增的有序順序表,函式status listinsert sortedsq sqlist l,elemtype e 用於向順序表中按遞增的順序插入乙個資料。比如 原資料有 2 5,要插入乙個元素3,那麼插入後順序表為2 3 5。要考慮擴容的問題。stat...