【一】、什麼是數據結構

【一】、什麼是數據結構

前言

使人頭疼的書啊,一切盡在不言中。web

對數據結構的理解

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

數據結構是計算機中存儲、組織數據的方式。一般狀況下,精心選擇的數據結構能夠帶來最優效率的算法。數組

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

 

 

 

 

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

操做一:新書怎麼插入
操做二:怎麼找到某本指定的書數據結構

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

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

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

那如今問題又來了:orm

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

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

說這些問題是想說明:

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

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

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

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

此篇完

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

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

本文同步分享在 博客"泰斗賢若如"(CNBlog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索