0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么說數(shù)據(jù)結(jié)構(gòu)很重要2

jf_78858299 ? 來源:圖靈教育 ? 作者:圖靈教育 ? 2023-04-06 18:07 ? 次閱讀

3.插入

往數(shù)組里插入一個(gè)新元素的速度,取決于你想把它插入到哪個(gè)位置上。

假設(shè)我們想要在購物清單的末尾插入"figs"。那么只需一步。因?yàn)橹罢f過了,計(jì)算機(jī)知道數(shù)組開頭的內(nèi)存地址,也知道數(shù)組包含多少個(gè)元素,所以可以算出要插入的內(nèi)存地址,然后一步跳到那里插入就行了。圖示如下。

圖片

但在數(shù)組開頭或中間插入,就另當(dāng)別論了。這種情況下,我們需要移動(dòng)其他元素以騰出空間,于是得花費(fèi)額外的步數(shù)。

例如往索引2 處插入"figs",如下所示。

圖片

為了達(dá)到目的,我們必須先把"cucumbers"、"dates"和"elderberries"往右移,以便空出索引2。而這也不是一步就能移好,因?yàn)槲覀兪紫纫獙?elderberries"右移一格,以空出位置給"dates",然后再將"dates"右移,以空出位置給"cucumbers",下面來演示這個(gè)過程。

第1 步:"elderberries"右移。

圖片

第2 步:"date"右移。

圖片

第3 步:"cucembers"右移。

圖片

第4 步:至此,可以在索引2 處插入"figs"了。

圖片

如上所示,整個(gè)過程有4 步,開始3 步都是在移動(dòng)數(shù)據(jù),剩下1 步才是真正的插入數(shù)據(jù)。

最低效(花費(fèi)最多步數(shù))的插入是插入在數(shù)組開頭。因?yàn)檫@時(shí)候需要把數(shù)組所有的元素都往右移。于是,一個(gè)含有N 個(gè)元素的數(shù)組,其插入數(shù)據(jù)的最壞情況會(huì)花費(fèi)N + 1 步。即插入在數(shù)組開頭,導(dǎo)致N 次移動(dòng),加上一次插入。

最后要說的“刪除”,則相當(dāng)于插入的反向操作。

4.刪除

數(shù)組的刪除就是消掉其某個(gè)索引上的數(shù)據(jù)。

我們找回最開始的那個(gè)數(shù)組,刪除索引2 上的值,即"cucumbers"。

第1 步:刪除"cucumbers"。

圖片

雖然刪除"cucumbers"好像一步就搞定了,但這帶來了新的問題:數(shù)組中間空出了一個(gè)格子。因?yàn)閿?shù)組中間是不應(yīng)該有空格的,所以,我們得把"dates"和"elderberries"往左移。

第2 步:將"dates"左移。

圖片

第3 步:將"elderberries"左移。

圖片

結(jié)果,整個(gè)刪除操作花了3 步。其中第1 步是真正的刪除,剩下的2 步是移數(shù)據(jù)去填空格。

所以,刪除本身只需要1 步,但接下來需要額外的步驟將數(shù)據(jù)左移以填補(bǔ)刪除所帶來的空隙。

跟插入一樣,刪除的最壞情況就是刪掉數(shù)組的第一個(gè)元素。因?yàn)閿?shù)組不允許空元素,當(dāng)索引0 空出,那么剩下的所有元素都要往左移去填空。

對(duì)于含有5 個(gè)元素的數(shù)組,刪除第一個(gè)元素需要1 步,左移剩余的元素需要4 步。而對(duì)于500個(gè)元素的數(shù)組,刪除第一個(gè)元素需要1 步,左移剩余的元素需要499 步??梢酝瞥觯瑢?duì)于含有N個(gè)元素的數(shù)組,刪除操作最多需要N 步。

既然學(xué)會(huì)了如何分析數(shù)據(jù)結(jié)構(gòu)的時(shí)間復(fù)雜度,那就可以開始探索各種數(shù)據(jù)結(jié)構(gòu)的性能差異了。了解這些非常重要,因?yàn)閿?shù)據(jù)結(jié)構(gòu)的性能差異會(huì)直接造成程序的性能差異。

下一個(gè)要介紹的數(shù)據(jù)結(jié)構(gòu)是集合,它跟數(shù)組似乎很像,甚至讓人以為就是同一種東西。然而,我們將會(huì)看到它跟數(shù)組在性能上是有區(qū)別的。

集合:一條規(guī)則決定性能

來看看另一種數(shù)據(jù)結(jié)構(gòu):集合。它是一種不允許元素重復(fù)的數(shù)據(jù)結(jié)構(gòu)。

其實(shí)集合是有不同形式的,但現(xiàn)在我們只討論基于數(shù)組的那種。這種集合跟數(shù)組差不多,都是一個(gè)普通的元素列表,唯一的區(qū)別在于,集合不允許插入重復(fù)的值。

要是你想往集合["a", "b", "c"]再插入一個(gè)"b",計(jì)算機(jī)是不會(huì)允許的,因?yàn)榧现幸呀?jīng)有"b"了。

集合就是用于確保數(shù)據(jù)不重復(fù)。

如果你要?jiǎng)?chuàng)建一個(gè)線上電話本,你應(yīng)該不會(huì)希望相同的號(hào)碼出現(xiàn)兩次吧。事實(shí)上,現(xiàn)在我的本地電話本就有這種狀況:我家的電話號(hào)碼不單指向我這里,還錯(cuò)誤地指向了一個(gè)叫Zirkind 的家庭(這是真的)。接聽那些要找Zirkind 的電話或留言真的挺煩的。

不過,估計(jì)Zirkind 一家也在納悶為什么總是接不到電話。而當(dāng)我想要打電話告訴Zirkind 號(hào)碼錯(cuò)了的時(shí)候,我妻子就會(huì)去接電話了,因?yàn)槲覔艿木褪俏壹姨?hào)碼(好吧,這是開玩笑)。如果這個(gè)電話本程序用集合來處理,那就不會(huì)搞出這種麻煩了。

總之,集合就是一個(gè)帶有“不允許重復(fù)”這種簡單限制的數(shù)組。而該限制也導(dǎo)致它在4 種基本操作中有1 種與數(shù)組性能不同。

下面就來分析讀取、查找、插入和刪除在基于數(shù)組的集合上表現(xiàn)如何。

集合的讀取跟數(shù)組的讀取完全一樣,計(jì)算機(jī)只要一步就能獲取指定索引上的值。如之前解釋的那樣,這是因?yàn)橛?jì)算機(jī)知道集合開頭的內(nèi)存地址,所以能夠一步跳到集合的任意索引。

集合的查找也跟數(shù)組的查找無異,需要N 步去檢查某個(gè)值在不在集合當(dāng)中。刪除也是,總共需要N 步去刪除和左移填空。

但插入就不同了。先看看在集合末尾的插入。對(duì)于數(shù)組來說,末尾插入是最高效的,它只需要1 步。

而對(duì)于集合,計(jì)算機(jī)得先確定要插入的值不存在于其中——因?yàn)檫@就是集合:不允許重復(fù)值。

于是每次插入都要先來一次查找。

假設(shè)我們的購物清單是一個(gè)集合——用集合還是不錯(cuò)的,畢竟你不會(huì)想買重復(fù)的東西。如果當(dāng)前集合是["apples", "bananas", "cucumbers", "dates", "elderberries"],然后想插入"figs",那么就需要做一次如下的查找。

第1 步:檢查索引0 有沒有"figs"。

圖片

沒有,不過說不定其他索引會(huì)有。為了在真正插入前確保它不存在于任何索引上,我們繼續(xù)。

第2 步:檢查索引1。

圖片

第3 步:檢查索引2。

圖片

第4 步:檢查索引3。

圖片

第5 步:檢查索引4。

圖片

直到檢查完整個(gè)集合,才能確定插入"figs"是安全的。于是,到最后一步。

第6 步:在集合末尾插入"figs"。

圖片

在集合的末尾插入也屬于最好的情況,不過對(duì)于一個(gè)含有5 個(gè)元素的集合,你仍然要花6 步。因?yàn)?,在最終插入的那一步之前,要把5 個(gè)元素都檢查一遍。

換句話說,在N 個(gè)元素的集合中進(jìn)行插入的最好情況需要N + 1 步——N 步去確認(rèn)被插入的值不在集合中,加上最后插入的1 步。

最壞的情況則是在集合的開頭插入,這時(shí)計(jì)算機(jī)得檢查N 個(gè)格子以保證集合不包含那個(gè)值,然后用N 步來把所有值右移,最后再用1 步來插入新值??偣?N + 1 步。

這是否意味著因?yàn)樗牟迦氡纫话愕臄?shù)組慢,所以就不要用了呢?當(dāng)然不是。在需要保證數(shù)據(jù)不重復(fù)的場(chǎng)景中,集合是非常重要的(真希望有一天我的電話本能恢復(fù)正常)。但如果沒有這種需求,那么選擇插入比集合快的數(shù)組會(huì)更好一些。具體哪種數(shù)據(jù)結(jié)構(gòu)更合適,當(dāng)然要根據(jù)你的實(shí)際應(yīng)用場(chǎng)景而定。

總結(jié)

理解數(shù)據(jù)結(jié)構(gòu)的性能,關(guān)鍵在于分析操作所需的步數(shù)。采取哪種數(shù)據(jù)結(jié)構(gòu)將決定你的程序是能夠承受住壓力,還是崩潰。本文特別講解了如何通過步數(shù)分析來判斷某種應(yīng)用該選擇數(shù)組還是集合。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88319
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7175

    瀏覽量

    87169
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4672

    瀏覽量

    67779
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    568

    瀏覽量

    40030
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)結(jié)構(gòu)

    1.數(shù)據(jù)結(jié)構(gòu)的概念 所謂數(shù)據(jù)結(jié)構(gòu)是指由某一數(shù)據(jù)對(duì)象及該對(duì)象中所有數(shù)據(jù)成員之間的關(guān)系組成的集合。成員之間的關(guān)系有很多種,最常見的是前后件關(guān)系。 2
    發(fā)表于 03-04 14:13

    請(qǐng)問數(shù)據(jù)結(jié)構(gòu)對(duì)弄單片機(jī)重要嗎?

    數(shù)據(jù)結(jié)構(gòu)的知識(shí)對(duì)弄單片機(jī)的人重不重要啊大家都學(xué)得怎么樣???
    發(fā)表于 04-12 02:43

    數(shù)據(jù)結(jié)構(gòu)的幾個(gè)重要知識(shí)點(diǎn)

    希望所招入的技術(shù)人員能夠面向數(shù)據(jù)和邏輯,這對(duì)于整個(gè)軟件架構(gòu)來說很重要,而不僅僅是把一段代碼寫好。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中
    發(fā)表于 02-27 15:01

    常見的數(shù)據(jù)結(jié)構(gòu)

    胡亂的,這就要求我們選擇一種好的方式來存儲(chǔ)數(shù)據(jù),而這也是數(shù)據(jù)結(jié)構(gòu)的核心內(nèi)容。數(shù)據(jù)存儲(chǔ)一直以來大家面對(duì)的數(shù)據(jù)存儲(chǔ),都是類似存儲(chǔ) 1、 2、{a
    發(fā)表于 05-10 07:58

    數(shù)據(jù)結(jié)構(gòu)教程,下載

    1. 數(shù)據(jù)結(jié)構(gòu)的基本概念 2. 算法與數(shù)據(jù)結(jié)構(gòu)3. C語言的數(shù)據(jù)類型及其算法描述要點(diǎn)4. 學(xué)習(xí)算法與數(shù)據(jù)結(jié)構(gòu)的意義與方法
    發(fā)表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>教程,下載

    什么是數(shù)據(jù)結(jié)構(gòu)

    什么是數(shù)據(jù)結(jié)構(gòu) 1、數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)·數(shù)據(jù)值:atomic data value: 不可再分解。如3、2、5等。nonatomicdat
    發(fā)表于 08-13 13:56 ?1634次閱讀

    數(shù)據(jù)結(jié)構(gòu)在游戲編寫中的應(yīng)用

    在游戲的編寫中,不可避免的出現(xiàn)很多應(yīng)用數(shù)據(jù)結(jié)構(gòu)的地方,有些簡單的游戲,只是由幾個(gè) 數(shù)據(jù)結(jié)構(gòu) 的組合,所以數(shù)據(jù)結(jié)構(gòu)在游戲編程中扮演著很重要
    發(fā)表于 07-25 16:26 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)與算法分析—C語言描述

    數(shù)據(jù)結(jié)構(gòu)在技術(shù)中很重要,這個(gè)資料上傳在這,供大家學(xué)習(xí)參考,很快掌握數(shù)據(jù)結(jié)構(gòu)知識(shí),更好的去學(xué)習(xí)。
    發(fā)表于 11-18 17:08 ?31次下載

    數(shù)據(jù)結(jié)構(gòu)與算法

    全國C語言考試公共基礎(chǔ)知識(shí)點(diǎn)——數(shù)據(jù)結(jié)構(gòu)與算法,該資料包含了有關(guān)數(shù)據(jù)結(jié)構(gòu)與算法的全部知識(shí)點(diǎn)。
    發(fā)表于 03-30 14:27 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)是什么_數(shù)據(jù)結(jié)構(gòu)有什么用

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高
    發(fā)表于 11-17 14:45 ?1.6w次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>是什么_<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>有什么用

    為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用詳細(xì)資料概述免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用詳細(xì)資料概述免費(fèi)下載包括了:數(shù)據(jù)結(jié)構(gòu)在串口通信當(dāng)中的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)在按鍵監(jiān)測(cè)當(dāng)中的應(yīng)用
    發(fā)表于 09-11 17:15 ?13次下載
    為什么要學(xué)習(xí)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>的應(yīng)用詳細(xì)資料概述免費(fèi)下載

    什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析包括了:數(shù)據(jù)結(jié)構(gòu)在串口通信當(dāng)中的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)在按鍵
    發(fā)表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?為什么要學(xué)習(xí)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>的應(yīng)用實(shí)例分析

    大牛分享平時(shí)如何學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法

    數(shù)據(jù)結(jié)構(gòu)與算法的地位對(duì)于一個(gè)程序員來說不言而喻。今天這篇文章不是來勸你們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的,也不是來和你們數(shù)據(jù)結(jié)構(gòu)與算法有多重要。
    的頭像 發(fā)表于 11-02 11:25 ?2890次閱讀

    JavaScrit數(shù)據(jù)結(jié)構(gòu)與算法(第2版)

    JavaScrit數(shù)據(jù)結(jié)構(gòu)與算法(第2版)教材下載。
    發(fā)表于 06-01 15:35 ?0次下載

    為什么數(shù)據(jù)結(jié)構(gòu)很重要1

    哪怕只寫過幾行代碼的人都會(huì)發(fā)現(xiàn),編程基本上就是在跟數(shù)據(jù)打交道。計(jì)算機(jī)程序總是在接收數(shù)據(jù)、操作數(shù)據(jù)或返回數(shù)據(jù)。不管是求兩數(shù)之和的小程序,還是管理公司的企業(yè)級(jí)軟件,都運(yùn)行在
    的頭像 發(fā)表于 04-06 17:46 ?523次閱讀
    為什么<b class='flag-5'>說</b><b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b><b class='flag-5'>很重要</b>1