日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构简介

發(fā)布時(shí)間:2024/1/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构简介 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)據(jù)結(jié)構(gòu)(Data Structure)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來(lái)更高的運(yùn)行或者存儲(chǔ)效率。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法和索引技術(shù)有關(guān)。

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

數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成。記為:

Data_Structure=(D,R)

其中?D?是數(shù)據(jù)元素的集合,R?是該集合中所有元素之間的關(guān)系的有限集合。

數(shù)據(jù)結(jié)構(gòu)具體指同一類數(shù)據(jù)元素中各元素之間的相互關(guān)系,包括三個(gè)組成成分,數(shù)據(jù)的邏輯結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)運(yùn)算結(jié)構(gòu)。

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

數(shù)據(jù)的邏輯結(jié)構(gòu)是指反映數(shù)據(jù)元素之間的邏輯關(guān)系的數(shù)據(jù)結(jié)構(gòu),其中的邏輯關(guān)系是指數(shù)據(jù)元素之間的前后件關(guān)系,而與他們?cè)谟?jì)算機(jī)中的存儲(chǔ)位置無(wú)關(guān)。邏輯結(jié)構(gòu)分為以下幾種:

  • 集合結(jié)構(gòu):數(shù)據(jù)元素同屬一個(gè)集合,單個(gè)數(shù)據(jù)元素之間沒(méi)有任何關(guān)系。

  • 線性結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)中的元素存在一對(duì)一的相互關(guān)系。

  • 樹形結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)中的元素存在一對(duì)多的相互關(guān)系。

  • 圖形結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)中的元素存在多對(duì)多的相互關(guān)系。

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

數(shù)據(jù)的物理結(jié)構(gòu)是指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)空間的存放形式,它包括數(shù)據(jù)元素的機(jī)內(nèi)表示和關(guān)系的機(jī)內(nèi)表示。物理結(jié)構(gòu)又叫存儲(chǔ)結(jié)構(gòu),分為以下幾種:

  • 順序存儲(chǔ)結(jié)構(gòu):一段連續(xù)的內(nèi)存空間。優(yōu)點(diǎn):隨機(jī)訪問(wèn);缺點(diǎn):插入刪除效率低,大小固定。

  • 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):不連續(xù)的內(nèi)存空間。優(yōu)點(diǎn):大小動(dòng)態(tài)擴(kuò)展,插入刪除效率高;缺點(diǎn):不能隨機(jī)訪問(wèn)。

  • 索引存儲(chǔ)結(jié)構(gòu):為了方便查找,整體無(wú)序,但索引塊之間有序,需要額外空間,存儲(chǔ)索引表。優(yōu)點(diǎn):對(duì)順序查找的一種改進(jìn),查找效率高;缺點(diǎn):需額外空間存儲(chǔ)索引。

  • 散列存儲(chǔ)結(jié)構(gòu):選取某個(gè)函數(shù),數(shù)據(jù)元素根據(jù)函數(shù)計(jì)算存儲(chǔ)位置可能存在多個(gè)數(shù)據(jù)元素存儲(chǔ)在同一位置,引起地址沖。優(yōu)點(diǎn):查找基于數(shù)據(jù)本身即可找到,查找效率高,存取效率高;缺點(diǎn):存取隨機(jī),不便于順序查找。

由于具體實(shí)現(xiàn)的方法有順序、鏈接、索引、散列等多種,所以,一種數(shù)據(jù)結(jié)構(gòu)可表示成一種或多種存儲(chǔ)結(jié)構(gòu)。

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

數(shù)據(jù)結(jié)構(gòu)算法的設(shè)計(jì)取決于數(shù)據(jù)的邏輯結(jié)構(gòu),而算法的實(shí)現(xiàn)依賴于采用的存儲(chǔ)結(jié)構(gòu)。數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)實(shí)質(zhì)上是它的邏輯結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)器中的實(shí)現(xiàn),為了全面的反映一個(gè)數(shù)據(jù)的邏輯結(jié)構(gòu),它在存儲(chǔ)器中的映象包括兩方面內(nèi)容,即數(shù)據(jù)元素之間的信息和數(shù)據(jù)元素之間的關(guān)系。不同數(shù)據(jù)結(jié)構(gòu)有其相應(yīng)的若干運(yùn)算。數(shù)據(jù)的運(yùn)算是在數(shù)據(jù)的邏輯結(jié)構(gòu)上定義的操作算法,如檢索、插入、刪除、更新和排序等。

數(shù)據(jù)的運(yùn)算是數(shù)據(jù)結(jié)構(gòu)的一個(gè)重要方面,討論任一種數(shù)據(jù)結(jié)構(gòu)時(shí)都離不開對(duì)該結(jié)構(gòu)上的數(shù)據(jù)運(yùn)算及其實(shí)現(xiàn)算法的討論。

數(shù)據(jù)結(jié)構(gòu)不同于數(shù)據(jù)類型,也不同于數(shù)據(jù)對(duì)象,它不僅要描述數(shù)據(jù)類型的數(shù)據(jù)對(duì)象,而且要描述數(shù)據(jù)對(duì)象各元素之間的相互關(guān)系。

數(shù)據(jù)類型是一個(gè)值的集合和定義在這個(gè)值集上的一組操作的總稱。數(shù)據(jù)類型可分為兩類:原子類型、結(jié)構(gòu)類型。一方面,在程序設(shè)計(jì)語(yǔ)言中,每一個(gè)數(shù)據(jù)都屬于某種數(shù)據(jù)類型。類型明顯或隱含地規(guī)定了數(shù)據(jù)的取值范圍、存儲(chǔ)方式以及允許進(jìn)行的運(yùn)算。可以認(rèn)為,數(shù)據(jù)類型是在程序設(shè)計(jì)中已經(jīng)實(shí)現(xiàn)了的數(shù)據(jù)結(jié)構(gòu)。另一方面,在程序設(shè)計(jì)過(guò)程中,當(dāng)需要引入某種新的數(shù)據(jù)結(jié)構(gòu)時(shí),總是借助編程語(yǔ)言所提供的數(shù)據(jù)類型來(lái)描述數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)。

對(duì)每一個(gè)數(shù)據(jù)結(jié)構(gòu)而言,必定存在與它密切相關(guān)的一組操作。若操作的種類和數(shù)目不同,即使邏輯結(jié)構(gòu)相同,數(shù)據(jù)結(jié)構(gòu)能起的作用也不同。不同的數(shù)據(jù)結(jié)構(gòu)其操作集不同,但下列操作必不可缺:

  • 結(jié)構(gòu)的生成;

  • 結(jié)構(gòu)的銷毀;

  • 在結(jié)構(gòu)中查找滿足規(guī)定條件的數(shù)據(jù)元素;

  • 在結(jié)構(gòu)中插入新的數(shù)據(jù)元素;

  • 刪除結(jié)構(gòu)中已經(jīng)存在的數(shù)據(jù)元素;

  • 遍歷。

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

    每一種數(shù)據(jù)結(jié)構(gòu)都有著獨(dú)特的數(shù)據(jù)存儲(chǔ)方式,常用的數(shù)據(jù)結(jié)構(gòu)有:數(shù)組、棧、鏈表、隊(duì)列、樹、圖、堆、散列表等,如圖所示:

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

    數(shù)組

    數(shù)組是可以再內(nèi)存中連續(xù)存儲(chǔ)多個(gè)元素的結(jié)構(gòu),在內(nèi)存中的分配也是連續(xù)的,數(shù)組中的元素通過(guò)數(shù)組下標(biāo)進(jìn)行訪問(wèn),數(shù)組下標(biāo)從0開始。

    • 優(yōu)點(diǎn):

      • 按照索引查詢?cè)厮俣瓤?/p>

      • 按照索引遍歷數(shù)組方便

    • 缺點(diǎn):

      • 數(shù)組的大小固定后就無(wú)法擴(kuò)容了

      • 數(shù)組只能存儲(chǔ)一種類型的數(shù)據(jù)

      • 添加,刪除的操作慢,因?yàn)橐苿?dòng)其他的元素。

    適用場(chǎng)景:查詢頻繁,對(duì)存儲(chǔ)空間要求不大,很少增加和刪除的情況。

    是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。棧的特點(diǎn)是先進(jìn)后出,或者說(shuō)是后進(jìn)先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。

    棧的結(jié)構(gòu)就像一個(gè)集裝箱,越先放進(jìn)去的東西越晚才能拿出來(lái),所以,棧常應(yīng)用于實(shí)現(xiàn)遞歸功能方面的場(chǎng)景,例如斐波那契數(shù)列。

    隊(duì)列

    隊(duì)列與棧一樣也是一種特殊的線性表,它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作。隊(duì)列的特點(diǎn)是先進(jìn)先出,或者說(shuō)是后進(jìn)后出,進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭,從一端放入元素的操作稱為入隊(duì),取出元素為出隊(duì)。隊(duì)列中沒(méi)有元素時(shí),稱為空隊(duì)列。

    使用場(chǎng)景:因?yàn)殛?duì)列先進(jìn)先出的特點(diǎn),在多線程阻塞隊(duì)列管理中非常適用。

    鏈表

    鏈表是物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),它既可以表示線性結(jié)構(gòu),也可以用于表示非線性結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表的指針地址實(shí)現(xiàn)。數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。根據(jù)指針的指向,鏈表能形成不同的結(jié)構(gòu),例如單鏈表,雙向鏈表,循環(huán)鏈表等。

    • 鏈表的優(yōu)點(diǎn):

      • 鏈表是很常用的一種數(shù)據(jù)結(jié)構(gòu),不需要初始化容量,可以任意加減元素;

      • 添加或者刪除元素時(shí)只需要改變前后兩個(gè)元素結(jié)點(diǎn)的指針域指向地址即可,所以添加,刪除很快;

    • 缺點(diǎn):

      • 因?yàn)楹写罅康闹羔樣?#xff0c;占用空間較大;

      • 查找元素需要遍歷鏈表來(lái)查找,非常耗時(shí)。

    適用場(chǎng)景:數(shù)據(jù)量較小,需要頻繁增加,刪除操作的場(chǎng)景。

    是由n(n>0)個(gè)有限節(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做樹是因?yàn)樗雌饋?lái)像一棵倒掛的樹,也就是說(shuō)它是根朝上,而葉朝下的。它具有以下的特點(diǎn):

    • 有且僅有一個(gè)根結(jié)點(diǎn)(沒(méi)有父節(jié)點(diǎn)的節(jié)點(diǎn)稱為根節(jié)點(diǎn));

    • 每個(gè)節(jié)點(diǎn)有零個(gè)或多個(gè)子節(jié)點(diǎn);

    • 每一個(gè)非根節(jié)點(diǎn)有且只有一個(gè)父節(jié)點(diǎn);

    • 除了根節(jié)點(diǎn)外,每個(gè)子節(jié)點(diǎn)可以分為多個(gè)不相交的子樹;

    在日常的應(yīng)用中,我們討論和用的更多的是樹的其中一種結(jié)構(gòu),就是二叉樹。二叉樹是樹的特殊一種,具有如下特點(diǎn):

    • 每個(gè)結(jié)點(diǎn)最多有兩顆子樹,結(jié)點(diǎn)的度最大為2。

    • 左子樹和右子樹是有順序的,次序不能顛倒。

    • 即使某結(jié)點(diǎn)只有一個(gè)子樹,也要區(qū)分左右子樹。

    二叉樹是一種比較有用的折中方案,它添加,刪除元素都很快,并且在查找方面也有很多的算法優(yōu)化,所以,二叉樹既有鏈表的好處,也有數(shù)組的好處,是兩者的優(yōu)化方案,在處理大批量的動(dòng)態(tài)數(shù)據(jù)方面非常有用。

    是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都有一個(gè)值。堆的特點(diǎn)是根結(jié)點(diǎn)的值最小或最大,且根結(jié)點(diǎn)的兩個(gè)子樹也是一個(gè)堆。它具有以下的特點(diǎn):

    • 堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值;

    • 堆總是一棵完全二叉樹。

    將根節(jié)點(diǎn)最大的堆叫做最大堆或大根堆,根節(jié)點(diǎn)最小的堆叫做最小堆或小根堆。常見(jiàn)的堆有二叉堆、斐波那契堆等。因?yàn)槎延行虻奶攸c(diǎn),一般用來(lái)做數(shù)組中的排序,稱為堆排序。

    是由結(jié)點(diǎn)的有窮集合 V 和邊的集合 E 組成。其中,為了與樹形結(jié)構(gòu)加以區(qū)別,在圖結(jié)構(gòu)中常常將結(jié)點(diǎn)稱為頂點(diǎn),邊是頂點(diǎn)的有序偶對(duì),若兩個(gè)頂點(diǎn)之間存在一條邊,就表示這兩個(gè)頂點(diǎn)具有相鄰關(guān)系。

    按照頂點(diǎn)指向的方向可分為無(wú)向圖和有向圖。圖是一種比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在存儲(chǔ)數(shù)據(jù)上有著比較復(fù)雜和高效的算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數(shù)組等存儲(chǔ)結(jié)構(gòu)。

    散列表

    散列表也叫哈希表,是根據(jù)鍵和值(key 和 value)直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu),通過(guò)?key?和?value?來(lái)映射到集合中的一個(gè)位置,這樣就可以很快找到集合中的對(duì)應(yīng)元素。

    f(key)?稱為散列函數(shù)或哈希函數(shù),用來(lái)記錄數(shù)據(jù)的存儲(chǔ)位置,若結(jié)構(gòu)中存在鍵和?key?相等的記錄,則必定在?f(K)?的存儲(chǔ)位置上。而散列表就是把?key?通過(guò)一個(gè)固定的算法函數(shù)(哈希函數(shù))轉(zhuǎn)換成一個(gè)整型數(shù)字,然后就將該數(shù)字對(duì)數(shù)組長(zhǎng)度進(jìn)行取余,取余結(jié)果就當(dāng)作數(shù)組的下標(biāo),將?value?存儲(chǔ)在以該數(shù)字為下標(biāo)的數(shù)組空間里,這種存儲(chǔ)空間可以充分利用數(shù)組的查找優(yōu)勢(shì)來(lái)查找元素,所以查找的速度很快。

    哈希表在應(yīng)用中也是比較常見(jiàn)的,就如 Java 中有些集合類就是借鑒了哈希原理構(gòu)造的,例如?HashMap、Hashtable?等,利用哈希表的優(yōu)勢(shì),對(duì)于集合的查找元素時(shí)非常方便的,然而,因?yàn)楣1硎腔跀?shù)組衍生的數(shù)據(jù)結(jié)構(gòu),在添加刪除元素方面是比較慢的,所以很多時(shí)候需要用到一種數(shù)組鏈表來(lái)做,也就是拉鏈法。拉鏈法是數(shù)組結(jié)合鏈表的一種結(jié)構(gòu),較早前的?HashMap?底層的存儲(chǔ)就是采用這種結(jié)構(gòu),直到 JDK 1.8 之后才換成了數(shù)組加紅黑樹的結(jié)構(gòu)。

    ?

    總結(jié)

    以上是生活随笔為你收集整理的数据结构简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。