順序表(三)

順序表

在程序中悉患,經(jīng)常需要將一組(通常為同類型的)數(shù)據(jù)元素作為整體管理和使用忆植,需要?jiǎng)?chuàng)建這種元素組量蕊,用變量記錄它們起暮,傳進(jìn)傳出函數(shù)等卖氨。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化(可以增加或刪除元素)。
對(duì)于這種需求负懦,最簡單的解決方案就是將一組元素看成一個(gè)序列筒捺,用元素在序列里的位置和順序,表示實(shí)際應(yīng)用中的某種有意義的信息纸厉,或或者表示數(shù)據(jù)之間的某種關(guān)系系吭。
這樣的一組序列的組織形式,將其抽象為 線性表颗品。一個(gè)線性表是某類元素的一個(gè)集合肯尺,還記錄元素之間的一種順序關(guān)系。線性表是最基本的數(shù)據(jù)結(jié)構(gòu)之一躯枢,在實(shí)際程序中應(yīng)用非常廣泛则吟,它還經(jīng)常被用作更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)基礎(chǔ)。


內(nèi)部存儲(chǔ)

根據(jù)線性表的實(shí)際存儲(chǔ)方式锄蹂,分為兩種實(shí)現(xiàn)模型:

順序表:將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里氓仲,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示。
鏈表:將元素存放在通過鏈接構(gòu)造起來的一系列存儲(chǔ)塊中得糜。
基本形式

圖(a)表示的順序表的基本形式敬扛,數(shù)據(jù)元素本身連續(xù)存儲(chǔ),每個(gè)元素所占的存儲(chǔ)單元的大小固定相同朝抖,元素的下標(biāo)是其邏輯地址啥箭,而元素存儲(chǔ)的物理地址(實(shí)際內(nèi)存地址)可以通過存儲(chǔ)區(qū)的起始地址Loc(e0)加上邏輯地址(第i個(gè)元素)與存儲(chǔ)單元大小(c)的乘積計(jì)算而得槽棍,即:Loc(ei) = Loc(e0) + c * i
故捉蚤,訪問指定的元素時(shí)無需從頭遍歷,通過計(jì)算便可獲得對(duì)應(yīng)地址炼七,其時(shí)間復(fù)雜度為O(1).
如果元素的大小不統(tǒng)一缆巧,則需采用圖(b)的元素外置的形式,將實(shí)際數(shù)據(jù)元素另行存儲(chǔ)豌拙,而順序表中各單元位置保存對(duì)應(yīng)元素的地址信息(即鏈接)陕悬。由于每個(gè)鏈接所需的存儲(chǔ)量相同,通過上述公式按傅,可以計(jì)算出元素鏈接的存儲(chǔ)位置捉超,而后順著鏈接找到實(shí)際存儲(chǔ)的數(shù)據(jù)元素胧卤。

注:圖(b)中的c不再是數(shù)據(jù)元素的大小,而是存儲(chǔ)一個(gè)鏈接地址所需的存儲(chǔ)量拼岳,這個(gè)量通常很小枝誊。

圖b這樣的順序表也被稱為對(duì)實(shí)際數(shù)據(jù)的索引,這是最簡單的索引結(jié)構(gòu)惜纸。


外置的形式

一個(gè)順序表的完整信息包括兩個(gè)部分叶撒,一部分是表中元素集合,另一部分是為實(shí)現(xiàn)正確操作而需記錄的信息耐版,即有關(guān)表的整體情況的信息祠够,這部分信息主要包括元素存儲(chǔ)區(qū)的容量和當(dāng)前表中已有的元素個(gè)數(shù)兩項(xiàng)。

順序表的兩種基本實(shí)現(xiàn)方式

一體式結(jié)構(gòu)粪牲,存儲(chǔ)表信息的單元與元素存儲(chǔ)區(qū)以連續(xù)的方式安排在一塊存儲(chǔ)區(qū)里古瓤,兩部分?jǐn)?shù)據(jù)的整體形成一個(gè)完整的順序表對(duì)象。
一體式結(jié)構(gòu)整體性強(qiáng)腺阳,易于管理落君,但是由于數(shù)據(jù)元素存儲(chǔ)區(qū)域是表對(duì)象的一部分,順序表創(chuàng)建后亭引,元素存儲(chǔ)區(qū)就固定了叽奥。
分離式結(jié)構(gòu),表對(duì)象只保存與整個(gè)表有關(guān)的信息(即容量和元素個(gè)數(shù))痛侍,實(shí)際數(shù)據(jù)元素存放在另一個(gè)獨(dú)立的元素存儲(chǔ)區(qū)里朝氓,通過鏈接與基本表對(duì)象關(guān)聯(lián)。


一體式與分離式
元素存儲(chǔ)區(qū)替換

一體式結(jié)構(gòu)由于順序表信息區(qū)與數(shù)據(jù)區(qū)連續(xù)存儲(chǔ)在一起主届,所以若想更換數(shù)據(jù)區(qū)赵哲,則只能整體搬遷,即整個(gè)順序表對(duì)象(指存儲(chǔ)順序表的結(jié)構(gòu)信息的區(qū)域)改變了君丁。
分離式結(jié)構(gòu)若想更換數(shù)據(jù)區(qū)枫夺,只需要將表信息區(qū)的數(shù)據(jù)區(qū)鏈接地址更新即可,而該順序表對(duì)象不變绘闷。

元素存儲(chǔ)區(qū)擴(kuò)充

采用分離式結(jié)構(gòu)的順序表橡庞,若將數(shù)據(jù)區(qū)更換為更大的區(qū)域,則可以在不改變表對(duì)象的前提下對(duì)其數(shù)據(jù)存儲(chǔ)區(qū)進(jìn)行了擴(kuò)充印蔗,所有使用這個(gè)表的地方都不必修改扒最。只要程序的運(yùn)行環(huán)境還有空閑存儲(chǔ),這種表結(jié)構(gòu)就不會(huì)因?yàn)闈M了而導(dǎo)致操作無法進(jìn)行华嘹。人們把采用這種技術(shù)實(shí)現(xiàn)的順序稱為動(dòng)態(tài)順序表吧趣,因?yàn)槠淙萘靠梢栽谑褂弥袆?dòng)態(tài)變化。

擴(kuò)充的兩種策略
  • 每次擴(kuò)充增加固定數(shù)目的存儲(chǔ)位置,如每次擴(kuò)充增加10個(gè)元素位置强挫,這種策略可稱為線性增長岔霸。
    特點(diǎn):節(jié)省空間,但是擴(kuò)充操作頻繁俯渤,操作次數(shù)多呆细。
  • 每次擴(kuò)充容量加倍,如每次擴(kuò)充增加一倍存儲(chǔ)空間八匠。
    特點(diǎn):減少了擴(kuò)充操作的執(zhí)行次數(shù)侦鹏,但是可能會(huì)浪費(fèi)空間資源,以空間換時(shí)間臀叙,推薦的方式。
增加元素
增加元素
刪除元素
刪除元素
python中的順序表

python中的list和tuple兩種類型采用了順序表的實(shí)現(xiàn)技術(shù)价卤,具有前面討論的順序表的所有性質(zhì)劝萤。
tuple是不可變類型,即不變的順序表慎璧,因此不支持改變內(nèi)部狀態(tài)的任何操作床嫌,而其它方面,則與list的性質(zhì)類似胸私。

list的基本實(shí)現(xiàn)技術(shù)

python標(biāo)準(zhǔn)類型list就是一種元素個(gè)數(shù)可變的線性表厌处,可以加入和刪除元素,并在各種操作中維持已有元素的順序(保序)岁疼,而且還具有以下行為特征:

  • 基于下標(biāo)(位置)的高效元素訪問和更新阔涉,時(shí)間復(fù)雜度應(yīng)該為O(1)
    為滿足該特征,應(yīng)該采用順序表技術(shù)捷绒,表中保存在一起連續(xù)的存儲(chǔ)區(qū)中瑰排。
  • 允許任意加入元素,而且在不斷加入元素的過程中暖侨,表對(duì)象的標(biāo)識(shí)(函數(shù)id得到的值)不變
    為滿足該特征椭住,就必須更換元素存儲(chǔ)區(qū),并且為保證更換存儲(chǔ)區(qū)時(shí)list對(duì)象的標(biāo)識(shí)id不變字逗,只能采用分離式實(shí)現(xiàn)技術(shù)京郑。
    在python的官方實(shí)現(xiàn)中,list就是一種采用分離式技術(shù)實(shí)現(xiàn)的動(dòng)態(tài)順序表葫掉。這就是為什么用list.append(x)(或list.insert(len(list),x),即尾部插入)比在指定位置插入元素效率高的原因些举。
    在python的官方實(shí)現(xiàn)中,list實(shí)現(xiàn)采用了如下的策略:在建立空表(或者很小的表)時(shí)俭厚,系統(tǒng)分配一塊能容納8個(gè)元素的存儲(chǔ)區(qū)金拒;在執(zhí)行插入操作(insert或append)時(shí),如果元素存儲(chǔ)區(qū)滿就換一塊4倍大的存儲(chǔ)區(qū);但是如果此時(shí)的表已經(jīng)很大(目前的閾值為50000)绪抛,則改變策略资铡,采用加一倍的方法。引入這種改變策略的方式幢码,是為了避免出現(xiàn)過多空閑的存儲(chǔ)位置笤休。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市症副,隨后出現(xiàn)的幾起案子店雅,更是在濱河造成了極大的恐慌,老刑警劉巖贞铣,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闹啦,死亡現(xiàn)場離奇詭異,居然都是意外死亡辕坝,警方通過查閱死者的電腦和手機(jī)窍奋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酱畅,“玉大人琳袄,你說我怎么就攤上這事》乃幔” “怎么了窖逗?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長餐蔬。 經(jīng)常有香客問我碎紊,道長,這世上最難降的妖魔是什么樊诺? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任矮慕,我火速辦了婚禮,結(jié)果婚禮上啄骇,老公的妹妹穿的比我還像新娘痴鳄。我一直安慰自己,他們只是感情好缸夹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布痪寻。 她就那樣靜靜地躺著,像睡著了一般虽惭。 火紅的嫁衣襯著肌膚如雪橡类。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天芽唇,我揣著相機(jī)與錄音顾画,去河邊找鬼取劫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛研侣,可吹牛的內(nèi)容都是我干的谱邪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼庶诡,長吁一口氣:“原來是場噩夢啊……” “哼惦银!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起末誓,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扯俱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后喇澡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迅栅,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年晴玖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了读存。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窜醉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艺谆,到底是詐尸還是另有隱情榨惰,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布静汤,位于F島的核電站琅催,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虫给。R本人自食惡果不足惜藤抡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抹估。 院中可真熱鬧缠黍,春花似錦、人聲如沸药蜻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽语泽。三九已至贸典,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踱卵,已是汗流浹背廊驼。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妒挎。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓绳锅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饥漫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榨呆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容