日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

應該有不少伙伴都學過數(shù)據(jù)結(jié)構(gòu)吧?

這數(shù)據(jù)結(jié)構(gòu)真的搞得我頭大,這都是啥啊

不怕你笑話,我在大學四年都搞不懂數(shù)據(jù)結(jié)構(gòu),這是個什么東西?我真的那么蠢嗎?非常尷尬)

當我在大學的時候,我總覺得這件事太抽象了,無法理解。我越學就越跟不上,學到一半就掉隊了。基本上就是屬于放棄治療了。后來我知道這本書中寫的是偽代碼。我說怎么能把我看得一楞一楞的?就這樣,在大學四年的時間里,我愣是沒有搞懂數(shù)據(jù)結(jié)構(gòu).

然后嘞,那些搞懂的,順利參加校招,拿到滿意offer,進入大廠,迎娶白富美……而我呢?

面試官:“數(shù)據(jù)結(jié)構(gòu)有了解嗎?”

我:“啥?你說啥?數(shù)據(jù)結(jié)構(gòu)是個啥?”

然后我就順利畢業(yè)了……

扎心不,老鐵?你是不是也是這樣啊,正在讀大學,數(shù)據(jù)結(jié)構(gòu)也是一臉懵逼,或者畢業(yè)了,還是不知道數(shù)據(jù)結(jié)構(gòu)到底是個啥,說出去怪尷尬,沒事,看了今天這篇文章,保準你可以出去大聲喊“我……終于……知道……數(shù)據(jù)結(jié)構(gòu)是個啥啦”(拉長音……)

數(shù)據(jù)結(jié)構(gòu)是個啥玩意啊?

當我第一次接觸“數(shù)據(jù)結(jié)構(gòu)”時,我覺得它有點抽象,但我不認為它很難理解。嗯,應該是這樣的。誰知道,我學得越多,就越糊涂。讓我們看看這個數(shù)據(jù)結(jié)構(gòu)是如何定義的:

數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合,換句話說,數(shù)據(jù)結(jié)構(gòu)是帶“結(jié)構(gòu)”的數(shù)據(jù)元素的集合,“結(jié)構(gòu)”就是指數(shù)據(jù)元素之間存在的關(guān)系。

我不知道你看到這個定義時的感受。但我當時是有點困惑,現(xiàn)在的我看著這個定義,

蠻好的

 

聊聊數(shù)據(jù)在計算機中的存儲

為了更好地理解數(shù)據(jù)結(jié)構(gòu),你需要首先了解計算機中數(shù)據(jù)的存儲。舉個簡單的例子。例如,我們需要存儲一個數(shù)字,比如1024。如何儲存?我們知道代碼(JAVA)通常是這樣寫的:

int a = 1024;

那就是定義一個整型。寫完后,它就保存在我們的電腦上。事實上市保存在我們電腦的硬盤上。只有當程序加載到內(nèi)存中時,它才能被CPU讀取和運行。所以,這個1024實際上需要加載到內(nèi)存中。這里我們需要注意的是,這個1024是我們編寫的程序中的一個整型變量。你需要明白的是,我們說它保存在內(nèi)存中,是因為我們想運行這個程序。

一旦運行此程序,此程序中包含的數(shù)據(jù)將加載到內(nèi)存中,就像這里的1024一樣被保存到內(nèi)存中。怎么怎么保存呢?這里你還要記住這么一句話:

計算機中的數(shù)據(jù)都是以二進制的形式保存的

因此嘞,這個1024是十進制,要轉(zhuǎn)換成二進制保存在內(nèi)存中,內(nèi)存有一定的大小,你要保存一個整數(shù),你是不是得占用內(nèi)存的一些空間啊,假如是這樣:

 

數(shù)據(jù)結(jié)構(gòu)到底是個啥?輕松學習八類數(shù)據(jù)結(jié)構(gòu)

 

你看,這樣這個1024就被存在了內(nèi)存中,當然,你得明白,這個1024其實被轉(zhuǎn)換成了二進制形式,我這樣只是為了便于表示說明。

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

在我們了解了數(shù)據(jù)是如何存儲在計算機中之后,我們可以再來看看數(shù)據(jù)結(jié)構(gòu)。定義我們之前看過了,怎么去理解嘞。顧名思義,數(shù)據(jù)結(jié)構(gòu)就是數(shù)據(jù)和結(jié)構(gòu)。結(jié)構(gòu)可以理解為關(guān)系,即數(shù)據(jù)之間的關(guān)系

這樣說還是有點困惑?你可以這樣理解。首先,你應該知道數(shù)據(jù)結(jié)構(gòu)。它是一門學科。這是干什么的?說白了,就是研究數(shù)據(jù)該怎么存儲?

你可能說了,還研究怎么存儲,難道存儲不都是一樣的嗎,雖然這個問題有點chun,但是嘞,確實是個讓小白疑惑的問題,數(shù)據(jù)的存儲當然是不同的。例如,如果我們要存儲五個整數(shù){1、2、3、4、5},那么如何將它們存儲在內(nèi)存中

可能是這樣

在內(nèi)存中是排成一排的,一個挨著一個,

數(shù)據(jù)結(jié)構(gòu)到底是個啥?輕松學習八類數(shù)據(jù)結(jié)構(gòu)

 

也有可能是這樣!!!

 

數(shù)據(jù)結(jié)構(gòu)到底是個啥?輕松學習八類數(shù)據(jù)結(jié)構(gòu)

 

就是在內(nèi)存中沒啥順序,零散的存放,所以啊你看,對于數(shù)據(jù),可以按照不同的方式去存儲,是給你連續(xù)挨著存放,還是存放在哪就存放在哪啊,你可能要問啦,哪這咋整,這個嘛,就得看數(shù)據(jù)本身以及其他相關(guān)要求,看看你這個數(shù)據(jù)以后準備怎么用,然后考慮怎么存放比較合適。

所以啊,數(shù)據(jù)結(jié)構(gòu)啊,就是來管理數(shù)據(jù)在內(nèi)存中的存儲的,比如,有一些數(shù)據(jù)要在內(nèi)存總存儲,那就得看數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)讓你怎么存放你就得怎么存放,讓你連續(xù)存放,你就不能撒花似的哪都是的。

另外啊,你還需要知道,這里的數(shù)據(jù)結(jié)構(gòu)是個統(tǒng)稱,就好比水果,它有香蕉蘋果和橘子,數(shù)據(jù)結(jié)構(gòu)也是一樣啊,它是個總稱,有數(shù)組,鏈表,棧和隊列等等,這些都屬于數(shù)據(jù)結(jié)構(gòu),就好比,香蕉蘋果和橘子都是水果,這個好理解吧!

然后嘞,這些數(shù)據(jù)結(jié)構(gòu)啊,每個都有它們自己的一些特點,這些特點就是規(guī)定如果數(shù)據(jù)選擇了它這種數(shù)據(jù)結(jié)構(gòu)來存儲,就要按照它的要求在內(nèi)存中存放,比如你選擇了數(shù)組,那么你這些數(shù)據(jù)就要在內(nèi)存中連續(xù)存儲,一個挨著一個,不能亂,而如果你選擇了鏈表這種存儲結(jié)構(gòu),那在內(nèi)存中就不要求你非得連續(xù)存儲,隨意,有空地你就可以存儲。

所以你看,不同的數(shù)據(jù)結(jié)構(gòu)有它特定的用途……

到了這里,你差不多就理解了數(shù)據(jù)結(jié)構(gòu)是個啥了吧,也就是說啊,數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)怎么存儲嘞,然后數(shù)據(jù)結(jié)構(gòu)是個總稱,好比水果,其下有數(shù)組,鏈表,棧和隊列這些數(shù)據(jù)結(jié)構(gòu),好比水果有香蕉蘋果和橘子,其實嘞,你就可以把數(shù)據(jù)結(jié)構(gòu)想象成一個容器,容器是干啥的嘞,盛東西的啊,這里就是存儲數(shù)據(jù)的,而這些容器形狀各異,你選擇了不同的容器(數(shù)據(jù)結(jié)構(gòu)),那么就意味著數(shù)據(jù)的存儲形式是不同的。

說了這么多,就這些嗎?當然不是。我們可以想象,我們上面提到的五個數(shù)據(jù)之間是沒有聯(lián)系的。最多,當數(shù)據(jù)連續(xù)存儲時,它們彼此相鄰。這樣,就形成了一對一的關(guān)系,就像排隊一樣。我在你前面,你在我后面。

但還有另一種數(shù)據(jù)。比如我們要存儲一個家譜中的數(shù)據(jù)信息,比如這樣:

 

數(shù)據(jù)結(jié)構(gòu)到底是個啥?輕松學習八類數(shù)據(jù)結(jié)構(gòu)

 

你怎么把這些數(shù)據(jù)存儲到內(nèi)存中呢?這些不同于那些冷冰冰的數(shù)字。把它們保存在內(nèi)存中就萬事大吉了。當我們保存這種家譜數(shù)據(jù)時,我們實際上不僅保存了數(shù)據(jù),而且保存了數(shù)據(jù)之間的關(guān)系。

經(jīng)過以上的介紹,你一定了解個大概了。然后只需要選擇一個合適得數(shù)據(jù)結(jié)構(gòu)來存儲它,說的不錯。我們可以分析家譜數(shù)據(jù),發(fā)現(xiàn)這些數(shù)據(jù)有一對多的關(guān)系。例如,爺爺有三個兒子,叔叔有兩個孩子。數(shù)據(jù)結(jié)構(gòu)中有一個名為tree(數(shù)) 的結(jié)構(gòu),可以存儲此類數(shù)據(jù)。

上面提到的一對一和一對多都是表示數(shù)據(jù)之間的關(guān)系,其實就是數(shù)據(jù)結(jié)構(gòu)中的結(jié)構(gòu)。有人可能會問,有多對多的關(guān)系嗎?答案一定是有的,那么這種關(guān)系如何儲存呢?沒關(guān)系。數(shù)據(jù)結(jié)構(gòu)中還有一個叫做圖德數(shù)據(jù)結(jié)構(gòu),就是專門針對多對多的數(shù)據(jù)的。

所以你看,數(shù)據(jù)結(jié)構(gòu)是個啥,不就是管著數(shù)據(jù)該怎么存儲嘛?

數(shù)據(jù)結(jié)構(gòu)都有哪些嘞?

那么,你肯定好奇,那么,數(shù)據(jù)結(jié)構(gòu)都有哪些啊?數(shù)據(jù)結(jié)構(gòu)總的來說有如下三大類:

  • 線性表,也就是數(shù)組、鏈表、棧和隊列;
  • 樹結(jié)構(gòu),包括普通樹,二叉樹,紅黑樹等等;
  • 圖存儲結(jié)構(gòu),這玩意有點難;

接下來我對這些數(shù)據(jù)結(jié)構(gòu)做一下簡單的介紹。

  • 線性表
  • 樹結(jié)構(gòu)
  • 圖結(jié)構(gòu)
  • 等等

在我的專欄有詳細介紹,我就不多說了

實際上,對于數(shù)據(jù)的存儲該選擇什么樣的數(shù)據(jù)結(jié)構(gòu),那就要取決于數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu),再次聲明下,這點的理解很重要,以下我說的每個字都不要漏掉哦

啥是邏輯結(jié)構(gòu)?

不知道你們之前有沒有想過這個問題,數(shù)據(jù)的邏輯結(jié)構(gòu)是個啥?可能你有點迷糊,但是說起來真的很簡單:

數(shù)據(jù)的邏輯結(jié)構(gòu)就是指的數(shù)據(jù)之間存在的關(guān)系

我想經(jīng)過上面的講解,你這里立馬就知道,這里指的關(guān)系就是上面說的什么一對一,一對多和多對多了,不錯,就是這些,這里的數(shù)據(jù)的邏輯結(jié)構(gòu)指的就是這么些個關(guān)系,就好比我上面給的那個圖,我們再來看一下:

我想經(jīng)過以上的解釋,你會馬上知道這里的關(guān)系是指一對一,一對多,多對多。不錯,就是這些。這里的數(shù)據(jù)的邏輯結(jié)構(gòu)指的就是這些關(guān)系,就像我上面給出的圖一樣。我們再來看看:

 

數(shù)據(jù)結(jié)構(gòu)到底是個啥?輕松學習八類數(shù)據(jù)結(jié)構(gòu)

 

例如,上圖中的大伯,二伯和爸爸,他們都屬于兄弟關(guān)系。爺爺有三個兒子,大伯有兩個孩子,這種都是一對多的關(guān)系。如果要這樣存儲數(shù)據(jù),不僅要存儲基本的數(shù)據(jù)信息,還要存儲它們之間現(xiàn)有的關(guān)系。

而這種關(guān)系即是數(shù)據(jù)之間的邏輯結(jié)構(gòu)。

總之,數(shù)據(jù)之間的邏輯結(jié)構(gòu)大致可以分為三種類型,即:

  • 一對一:就是那種你挨著我,我挨著你的數(shù)據(jù),比如數(shù)組
  • 一對多:就是我們上面畫的家譜圖那樣
  • 多對多:這個比如說地圖,或者一些四通八達的路,能明白我的意思吧

其實吧,給到你一些數(shù)據(jù),你基本上都能判斷出這些數(shù)據(jù)是什么關(guān)系,也就是說,數(shù)據(jù)的邏輯結(jié)構(gòu)不難辨認。

到了這里,你有沒有發(fā)現(xiàn),這三種邏輯結(jié)構(gòu)的數(shù)據(jù),正好可以用我們上面介紹的三大類的數(shù)據(jù)結(jié)構(gòu)去存儲,想一下,也就是下面三種:

  1. 線性表:一對一
  2. 樹結(jié)構(gòu):一對多
  3. 圖結(jié)構(gòu):多對多

有沒有發(fā)現(xiàn),萬變不離其中啊,只是我們了解了邏輯結(jié)構(gòu)這個知識點后,你會覺得這塊的只是更加的完整。

物理結(jié)構(gòu)是什么?

我們在上面知道了邏輯結(jié)構(gòu)是什么,所以我們可以分析數(shù)據(jù)之間的邏輯結(jié)構(gòu),看看應該使用哪個數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù)。這看似已經(jīng)萬事大吉,沒啥事了,但是,實則不然,其實吧,說到這里,牽涉到的知識點又不少,我這里只給你說重點,詳細的以后單獨拿出來嘮叨嘮叨。

請先記住非常重要的一句話:

數(shù)據(jù)結(jié)構(gòu)的存儲方式只有兩種:數(shù)組(順序存儲)和鏈表(鏈式存儲)

啥意思嘞?其實吧,數(shù)組和鏈表是數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)結(jié)構(gòu),其他的數(shù)據(jù)結(jié)構(gòu)都可以用數(shù)組和鏈表來實現(xiàn),你比如拿棧來說吧,可以用數(shù)組來實現(xiàn)棧,這就叫做順序棧,也可以用鏈表來實現(xiàn)棧這個就叫做鏈式棧。

所以啊,每種數(shù)據(jù)結(jié)構(gòu)的存儲其實都可以分為順序存儲(用數(shù)組實現(xiàn))和鏈式存儲(用鏈表實現(xiàn))

你比如說要使用隊列這個數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù),那實際上,就可以分為順序隊列實現(xiàn)和鏈式隊列實現(xiàn),也就是看你實際內(nèi)存中怎樣去存儲這些數(shù)據(jù),因此,你可以看出,數(shù)組和鏈表是數(shù)據(jù)結(jié)構(gòu)中的基石啊!

那么,新的問題就來了,既然對于每個數(shù)據(jù)結(jié)構(gòu)都可以有順序存儲和鏈式存儲,那么即時我依據(jù)數(shù)據(jù)的邏輯結(jié)構(gòu)選擇了一個數(shù)據(jù)結(jié)構(gòu),那么我怎么來確定是要順序存儲還是要鏈式存儲呢?

這個問題的關(guān)鍵所在就是要分析數(shù)據(jù)的物理結(jié)構(gòu)了?

數(shù)據(jù)的物理結(jié)構(gòu)是什么?如果你以前沒有想過這個問題,你會感到困惑,但也很簡單:

數(shù)據(jù)的物理結(jié)構(gòu)就是指的數(shù)據(jù)在內(nèi)存中的存儲是連續(xù)存儲,也就是集中在一塊的意思,還是零散的分散存儲。

也就是說,對于一些數(shù)據(jù),我們可以分析它們之間的邏輯結(jié)構(gòu),知道數(shù)據(jù)之間有什么樣的關(guān)系。我們可以確定使用什么樣的數(shù)據(jù)結(jié)構(gòu),但也需要分析數(shù)據(jù)的物理結(jié)構(gòu)。

可是,你有沒有發(fā)現(xiàn)問題,我們怎么知道數(shù)據(jù)的物理結(jié)構(gòu)是啥呢?

這里要看兩點,來讓我們決定數(shù)據(jù)的物理結(jié)構(gòu),分別是:

  1. 內(nèi)存的空間狀態(tài)
  2. 數(shù)據(jù)的用途

什么意思?以內(nèi)存空間的狀態(tài)為例。首先,我們需要知道,連續(xù)存儲需要連續(xù)的內(nèi)存空間。例如,如果我們想存儲10m大小的數(shù)據(jù),也就需要10m的連續(xù)的內(nèi)存空間,但是如果沒有的話那肯定是用不了連續(xù)存儲了,那只能分散存儲,否則存儲不成功啊。

然后看看數(shù)據(jù)的用途。連續(xù)存儲和分散存儲的主要區(qū)別之一是,它會影響后續(xù)的數(shù)據(jù)操作。對于連續(xù)存儲,它具有很高的數(shù)據(jù)遍歷效率。因此,如果你存儲的這些數(shù)據(jù)后續(xù)的操作中遍歷比較頻繁,那肯定優(yōu)先選擇連續(xù)存儲,當然,如果你后續(xù)的數(shù)據(jù)操作中會進行比較多的更新操作的話,那就優(yōu)先選擇分散存儲了,因為它效率更高。

所以我們根據(jù)內(nèi)存的空間狀態(tài)數(shù)據(jù)的用途來確定數(shù)據(jù)的物理結(jié)構(gòu)是連續(xù)存儲還是分散存儲,然后再選擇對應的存儲方式,也就是:

  1. 物理結(jié)構(gòu)為連續(xù)存儲就選擇順序存儲
  2. 物理結(jié)構(gòu)為分散存儲就選擇鏈式存儲

更詳細的其他數(shù)據(jù)結(jié)構(gòu),查看其他章節(jié)

分享到:
標簽:數(shù)據(jù)結(jié)構(gòu)
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定