跟我又是棧又是堆又是樹又是圖的,問你什麼是數據結構,你咋還不會說了呢?

【一】、什麼是數據結構

前言

其實說實話,大一剛來的時候就學了數據結構,當時學的數據結構是下面圖片中的這一本,不過說來慚愧,當時由於入門時C語言學的太菜,以至於開這門課的時候思維跟不上就牴觸,不用解釋,就是給自己找藉口,坦白說吧,就是沒好好學,不過人非聖賢,孰能無過,人生難免會犯點錯,及時改正還是個好孩子,因此,我決定把之前沒學好的數據結構重新補回來。

對數據結構的理解

首先從定義上來說的話,好像對數據結構沒有什麼一個統一的、標準的答案,我找了好幾本書,挑了一個我認爲還計較好理解的定義:

數據結構是計算機中存儲、組織數據的方式。通常情況下,精心選擇的數據結構可以帶來最優效率的算法。

如果你沒接觸過數據結構,你看了定義能看懂嗎?如果你能看懂,我很佩服你,我反正是不行,不過現在因爲接觸的東西比較多,聽得多了,看了也能理解。我覺得對於新手,應該先讓新手去理解,等有了自己的理解之後再看官方定義的話,效果會比較好,反正我是這麼認爲的。我用生活中的例子來解釋什麼是數據結構吧:
舉例:如何在書架上擺放圖書?
也就是說,現在有一些書架,還有一堆圖書,你要怎樣把它們放到書架上去呢?換言之說,有一堆數據,給了你一些存儲空間,你要怎麼把這些數據存起來呢?
其實這個問題問的不科學,因爲你不知道所謂的書架是長什麼樣,可能是下面圖片中的任意一種。




所以你就知道了,當有人問你一個數據怎麼組織的時候,其實是跟這個數據的規模有關係的。不一樣規模的問題,它處理起來的難度就不一樣。難在什麼地方呢?難不在說你要把它怎麼放,而在於放這個書是爲了做事情用的,所以說圖書的擺放其實跟兩個操作直接相關:

 

操作一:新書怎麼插入
操作二:怎麼找到某本指定的書

方法一:我不知道你們是怎樣考慮的,我第一個感覺就是隨便放,隨便放一個好處就是:新書怎麼插入,這個操作是非常簡單的,哪有空就放哪,最簡單的方法就是把所有的書一本一本挨着放,所以呢,所有的新書哪裏有空放哪裏,So easy!放起來簡單,但第二個操作怎麼辦,如何查找?那就會成爲一件很恐怖的事……累死你!什麼時候累死呢,其實如果只是一個很小的書架,倒也累不死,但如果是上面第三張那樣的書城,然後你想象,裏面所有的圖書都是隨便放的,然後有人問你,這個書城裏有沒有某一本書,其實那本書沒有,但是你忘了有沒有,那你怎麼能確定它到底有沒有呢?你就只好從頭到尾把每一本書都過一遍,然後才能嘆一口氣說……唉,不好意思,沒有這本書。

方法二:那我們有沒有稍微聰明一點的解決方法呢?就是怎樣讓我找書找的方便呢?第二個方法,就是按照書名的拼音字母順序排放,有了這個字母序以後,查找就方便多了。一個最聰明的方法是二分查找什麼是二分查找:比如說現在有一長排的書放在你面前,然後我們找一本叫《數據結構》的以S開頭的書,那我先從這一排的中間找一本書出來看它的書名的首字母,假如說是《離散數學》,以L開頭的書,那我們知道,S在L的後面,所以《離散數學》前面的書我就不用管它了,我的查找範圍縮小了一半,從L開始往後找,然後再找這一半的中間,比如找到的一本書是《網絡爬蟲》,以W開頭的,那S在L和W中間,《網絡爬蟲》後面的書我就不用管了,於是我的查找範圍又縮小了一半,以此類推,我可以每次都找,然後跟中間這個比,很快就會把範圍縮小到一本書上,我就會知道這本書到底是有還是沒有。這個方法比前面的方法聰明多了,它很好的解決了查找的問題。但是,問題又來了,新書來了怎麼插入呢?它就會成爲新的令人頭疼的問題。比如說,我新買了一本書叫《阿Q正傳》,是以A開頭的,呃……慘了,那我們得把幾乎所有的書往後一本一本的錯位,一直到前面留出一個空擋,把新書插進去,這個似乎也很頭疼。

方法三:那如何找一個兩全其美的方法呢?我們來想想,圖書館裏是怎樣來擺書的,我們假如說去圖書館,找《數據結構》,要怎麼找,你不可能是從第一本開始找,也不可能是隨便中間摸一本找,你進到圖書館裏,第一件事情要找的是計算機類的書在哪裏對不對?圖書館裏的書通常是按照書的類別來分的,比如說我們有社會科學類、文學類、藝術類、理科、工科等,然後工科下面可能還會分的再細一點,比如說我們計算機類可能就分在工科的下面,這種分法有什麼好處呢?把書架劃分成幾塊區域,每快區域指定擺放某種類別的圖書,在每種類別內,按照書名的拼音字母順序排放,這樣不管我在每一個類裏做什麼樣的操作,總歸來說,圖書的規模小了很多,跟整個圖書館的規模相比,我是某一類的,無論是查找還是插入,都是非常方便的。查找呢,就是在二分查找之前,我們先定一個類別,然後在一個類的一個小範圍裏面做二分查找,就可以更快的找到我們要查找的書了。如果是插入,也是先定類別,用二分查找來確定一下它應該被插在什麼位置,然後移空位這件事可能還是要做的,但是總歸比我們剛開始要移的書的數量少多了。

那現在問題又來了:

問題一:空間如何分配?
問題二:類別應該分多細?

我們分的各種類別的書,它的藏書量是不一樣的,你是統一都給它分……還是每一類都多少個書架,事先分好嗎?這也是一個很頭疼的問題,我太難了,你如果書架給多了,就會有一些空間始終空在那浪費着,你如果書架給小了,新書來的時候要不斷地加新櫃子,很討厭。還有分類別要分多細的問題,你要是分的比較粗,那麼同一類裏面的書就會有很多,那你的工作量還是會很大,要是想減少工作量,最好還是類別分的細一點,但是類別一分細,就會有副作用,類別太多了,圖書的量一多,也是麻煩。

說這些問題是想說明:

解決問題方法的效率,跟數據的組織方式是直接相關的

那我這介紹數據結構的組織方式的時候,其實有兩個概念:
、關於數據對象的邏輯結構
比如說,我們一開始把書架想象成簡單的一長條,這麼一層的架子,然後所有的書是一個一個挨着放的,除了一頭一尾的書以外,每一本書的前面和後面都只有一本書,如果每一本書都有一個編號的話,那麼這一個編號對應的就是一本書,那麼這種結構是一對一的結構,我們管它叫線性結構

另外一種組織方式是上面說的第三種方法,就是先把圖書分類,如果我給每一個類一個編號的話,那麼這一個類別的編號裏面對應着很多本書,那麼這是一個一對多的邏輯結構,這個結構有個名字叫做

再說圖書館,假設我們還統計這樣一些信息:這一本書都有那些人買過,買了這本書的人還買過其它的什麼書,於是呢,其實是一本書對應着很多人,而一個人又對應了很多本書,這是一個多對多的、很複雜的一個關係網,那麼這個關係網對應的邏輯結構叫叫做
、關於對象的物理存儲結構
除了邏輯結構之外,我們還有數據對象再計算機裏面的物理存儲結構,也就是我們說的這些邏輯結構在機器的內存裏到底要怎麼放,是連續放呢還是東一個西一個隔開放呢?也就是說用一個數組來存它呢,還是用一個鏈表來存它呢?這個就屬於物理存儲結構。

此篇完

以上這些就是我對數據結構的理解,我想應該說全面了吧,要是沒全面也不要緊,後面學了再繼續補充。
看完有收穫?那麼希望老鐵別吝嗇你的三連擊哦
1、點個推薦,讓更多的人看到這篇文章
2、關注我的原創微信公衆號【泰斗賢若如】,第一時間閱讀我的文章
3、歡迎關注我的博客

 【原創聲明】:本人原創:https://www.cnblogs.com/zyx110/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章