天天看點

資料結構和算法的基本概念

正所謂"巧婦難為無米之炊",在強大的計算機,也是需要有"米"下鍋才可以幹活的,否則就是一具沒有靈魂的軀殼。對于計算機而言,這個"米"就是資料。在計算機剛誕生時,那時還沒有滑鼠、鍵盤、錄音帶等工具,人們通過紙帶(回想下國中的磁懸浮滑塊實驗)來進行資料的輸入與輸出。沒有資料的輸入,計算機的計算能力就無法展現,這也驗證了資料的重要性。

資料結構和算法的基本概念

1.資料結構的基本概念

1.1 資料

​ 資料是對客觀事物的符号表示,在計算機科學中是指所有能輸入到計算機中并被計算機程式處理的符号的總稱。例如,證書、實數、字元串都是資料,除了這些還包含聲音、圖像、視訊等非數值類型的資料。

​ 資料輸入的計算機中的核心目的,是對其進行處理、計算。對于數值類型的資料,我們可以進行數值計算,如加減乘除;另一方面對于圖像、視訊等資料,也是可以對其進行處理計算的,如計算機視覺,是以圖檔作為資料輸入的。

1.2 資料元素

​ 資料元素是資料的基本機關,是資料結構這門課讨論的最小機關,在計算機程式中通常作為一個整體進行考慮和處理。

1.3 資料項

​ 資料項是資料不可分割的最小機關。

​ 有時,一個資料元素可由若幹個資料項組成。例如,一本書的數目資訊為一個資料元素,而書目資訊中的每一項(如書名、作者、ISBN等)為一個資料項。

​ 一般在資料結構中,我們讨論問題時,資料元素才是建立模型時的着眼點。就像我們讨論電影時,我們會去讨論某一個角色(資料元素),而不會過多的去糾結每個角色的姓名、年齡、性别、身高…等具體屬性(資料項)。

1.4 資料對象

​ 資料對象是性質相同的資料元素的集合,是資料的一個子集。比如,大寫字母就是一個資料對象,這個集合是{‘A’, ‘B’, ‘C’, ‘D’ … ‘Z’}。

​ 我們以一個例子來講解下,下面這張圖是一個學生資訊表,整個學生的資訊表可以稱之為學生資料的集合(資料對象);每一行即為一個學生的具體資訊,為資料元素;每一行的學号、姓名、性别等資訊,就是每個資料元素中的資料項。

​ 我們可以用資料庫的概念來了解。多個字段(column、資料項)構成一個資料元素(Row);多條資料元素(row,記錄)組成資料的集合(Table);所有的表共同組成一個資料庫(Database,資料)。

資料結構和算法的基本概念

1.5 資料結構

​ 資料結構是指互相之間存在一種或多種特定關系的資料元素的集合。資料結構包含三方面内容:邏輯結構、存儲結構和對資料的運算。

​ 在計算機中,資料元素并不是孤立、雜亂無序的,而是具有内在聯系的資料集合。資料元素之間存在一種或多種特定的關系,也就是資料的組織形式。

1.5.1 資料的邏輯結構

​ 資料的邏輯結構是對資料之間關系的描述,它與資料的存儲結構無關,同一種邏輯結構可以有多種存儲結構。資料的邏輯結構主要有以下四種。

  1. 集合結構

集合結構中的資料元素除了同屬于一個集合外,它們之間沒有其他關系。各個資料元素是"平等"的,它們的共同屬性是"同屬于一個集合"。

  1. 線性結構

線性結構中的資料元素之間存在一對一的關系。線性結構是一個資料元素的有序集合,其有一下四個基本特征:①集合中必存在唯一的一個"第一個元素";②集合中必存在唯一的一個"最後一個元素";③除卻最後一個元素外,其他資料元素均有唯一的一個"後繼";④除卻第一個元素外,其他資料元素均有唯一的一個"前驅";

  1. 樹形結構

樹形結構中的資料元素之間存在一對多的層次關系。

  1. 圖形結構

圖形結構中的資料元素之間存在多對多的關系。

資料結構和算法的基本概念

​ 歸納起來,資料的邏輯結構主要分為兩單類:線性結構、非線性結構(集合、樹形、圖形結構)。

1.5.2 資料的實體結構

​ 說完資料的邏輯結構,我們來一起看下實體結構,也可以稱之為存儲結構。

​ 實體結構,是資料的邏輯結構在計算機中的表示(又稱映像)。它包含資料元素的表示和關系的表示。

​ 資料元素之間的關系在計算機中有兩種不同的表示方法:順序映像和非順序映像。對應兩種不同的存儲結構,分别是順序存儲結構、鍊式存儲結構。順序映像是借助資料元素在在存儲器中的相對位置來表示資料元素之間的邏輯關系;非順序映像是借助指針表示資料元素之間的邏輯關系。更細分開來,資料結構中有以下四種常用的存儲方法:

  1. 順序存儲方法:把邏輯上相鄰的節點存儲在實體位置上相鄰的存儲單元中,結點之間的邏輯關系由存儲單元的鄰接關系來展現。
  2. 鍊式存儲方法:不要求邏輯上相鄰的節點在實體位置上也相鄰,結點之間的邏輯關系是由福建的指針字段表示的。
  3. 索引存儲方法:索引存儲方法是在存儲結點資訊時,除了建立存儲結點資訊外,還建立附加的索引表來辨別結點的位址。索引項的一般形式是<關鍵字,位址>。關鍵字辨別唯一一個結點,位址作為指向結點的指針。
  4. 散列存儲方法:散列存儲的基本思想是根據結點的關鍵字通過散列函數直接計算出該節點的存儲位址。

​ 鍊式存儲、索引存儲、散列存儲,本質上都是鍊式存儲方式。對于鍊式存儲,因為會涉及到指針,索引同學們可能都會有恐懼心裡,其實指針并沒有想象中這麼可怕。我們通過一個例子來稍微了解下指針,諜戰電影相信大家都看過,如永遠那麼經典的《潛伏》、《無間道》,組織上為了保護自己打入地方内部的間諜,都是通過上一級單線聯系,這種聯系,我們就可以稱之為指針,隻有你的上一級(前驅)才知道你的存在。當然這種方式也存在缺點,如果前驅節點損壞、或丢失,那麼後續的所有節點就不可尋回了。正如無間道中,黃秋生扮演的阿sir遇害後(指針資訊丢失),無人在知曉梁朝偉其實是個間諜,梁也無法證明自己的警察身份。

資料結構和算法的基本概念

1.5.3 兩種方式優缺點對比

​ 順序存儲、鍊式存儲都有各自的優缺點,沒有最好的存儲方式,隻有更适用的。了解其優缺點,根據實際情況選擇适用的結構,就非常重要了,這也是一個考點。

​ 1.順序存儲

​ 優點:存儲密度高(=1),除存儲資料外無須額外空間;随機通路,資料讀取友善,隻需要知道第一個元素的位址,然後根據index就能找到相應位置的資料;

​ 缺點:要求占用連續的存儲空間,存儲隻能預先進行;不利于結點的删除和插入;

​ 2.鍊式存儲

​ 優點:連結清單的結點可以散落在記憶體的任意位置(不需要位址連續),且不需要提前配置設定好所有的存儲空間;結點的插入、删除操作友善

​ 缺點:存儲密度(<1)低于順序存儲,除存儲資料外需要空間用于存儲後繼結點的位址;不支援資料的随機通路,查找指定位置的結點時,需要從頭指針開始周遊;

2.算法的基本概念

​ 目前,主流思想仍認為:程式=資料結構+算法。上面我們講完了資料結構的基本概念,下面我們簡單的介紹下算法的一些基本概念。

2.1 算法

​ 算法可以了解為由基本運算及規定的運算順序所構成的完整的解題步驟,或者看成按照要求設計好的有限的确切的計算序列。一般而言,算法可以使用自然語言、或者僞代碼進行描述,隻要能講清、并且能讓别人看懂。

2.2 算法的特性

​ 一個算法應具有以下5個重要的特征

  1. 有窮性:一個算法必須保證執行有限步之後結束。如果我們寫的代碼陷入了死循環,那麼我們的代碼就不具備有窮性,執行我們的代碼會一直運作無法運作結束,計算機的資源也就會被一直占用,無法釋放。
  2. 确定性:算法的每一步驟必須有明确的定義,不會出現二義性。算法需要保證相同的輸入結果,隻能有唯一的輸入,類似于f(x)隻能映射唯一的y值。(類似于抛硬币的機率問題不算)
  3. 輸入:一個算法有0個或多個輸入,以刻畫運算對象的初始情況。
  4. 輸出:一個算法有一個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的算法是毫無意義的。
  5. 可行性:算法中的所有操作都必須通過已經實作的基本操作進行運算,并在有限次内實作,而且人們用筆和紙做有限次運算後也可完成。換言之,算法中的每一步都是可執行的,每一步都能通過有限的次數完成。

2.3 算法的設計目标

  1. 正确性:要求算法能夠正确地執行預先規定的功能和性能要求。這是最重要也是最基本的要求。
  2. 可讀性:要求算法易于他人閱讀、了解。可以通過增加注釋,增加可讀性。
  3. 健壯性:要求算法有很好的容錯性,能夠對不合理的資料進行檢查。要求算法能處理不合理資料,及對一些異常可以做到正确的處理。這也是測試同學們重點關注的方向了。
  4. 高效率與低存儲量:算法的效率主要指算法的執行時間。算法的存儲容量是指算法執行過程中所需要的最大存儲空間。高效率與低存儲量這兩者都與問題的規模有關。

繼續閱讀