數據結構與算法基礎


一.算法

算法的基本概念(籠統):

解答某一類問題的任意一種特殊的方法。

  一組又窮的規則,它規定了解決某一特定類型的問題的一系列運算。簡而言之,就是解決問題的方法的步驟,是解題方案准確為完整的描述。

根據算法編寫出相應的計算機語言的程序,讓計算機去執行完成它,就可以提高工作效率。

              算法是程序設計的核心

重要特性:

  1. 確定性
  2. 可行性
  3. 輸入
  4. 輸出
  5. 有窮性

1.確定性

  確定性指的是算法的每一個運算步驟必須有確切的定義,必須是清楚的,無二義性的(沒有歧義的)。

2.可行性

可行性指的是算法中將要執行的運算都是基本運算,每一種運算至少在原理上能由人用紙和筆在有限時間內完成。

3.輸入

一個算法有0個或者多個輸入,這些輸入是在算法開始之前給出的。

4.輸出

  一個算法產生一個或多個輸出,這些輸出是同輸入有某種特定關系的量

5.

  一個算法總是在執行了有窮步的運算之后,終止。在有限時間內完成。

 

算法的表示

設計出來的算法,我們可以用采用的自然語言、計算機程序設計語言、流程圖、NS圖、偽代碼等來描述它,是就是算法的表示。

 

程序

用計算機語言將算法描述出來,稱為程序。它可以存放在計算機儲存器上,需要的時候可以去執行它。

 

偽代碼語言

偽代碼語言指的是一種用高級程序語言和自然語言組成的面型讀者的語言,是為了方便閱讀或者交流算法而使用的一種工具,在描述數據結構中的算法時經常采用偽代碼語言或者流程圖的形式。

 

流程圖

流程圖與實現算法的語言無關,直觀、清晰地表示算法流程,易於掌握。

常用符號有:

起止框、判斷框、處理框、輸入輸出框、流程線、注釋框、連接點

可以直觀的反映算法的邏輯執行順序。

 

NS圖

NS圖又稱為盒圖,是一種不允許破壞結構化原則的圖形算法描述工具,在NS圖中去掉了流程圖中容易隱去麻煩的流程線,全部算法寫在一個框內,每一種基本結構作為一個框。

NS圖的特點:

  1. 功能域明確,可以從框圖中直接反映出來
  2. 不可能任意轉移控制,符合結構化原則
  3. 很容易確定局部和全程數據的作用域
  4. 很容易表示嵌套關系方便管理模塊的層次結構

 

評價一個算法優劣的主要標准:

                算法的執行效率和儲存需求

 

算法的時間復雜度:

  是指執行這個算法所需要的計算工作量

 

 

算法的空間復雜度:

是指一個算法在計算機儲存器上所占用的儲存空間,包括儲存算法本身所占用的存儲空間,算法中的輸入輸出數據所占用的存儲空間和算法在運行過程中臨時占用的存儲空間這三部分

    1. 算法中輸入輸出數據所占用的存儲空間,是由要解決的問題所決定的,它不隨算法的改變所改變。
    2. 存儲算法本身所占用的存儲空間,與算法書寫的長度有關,算法越長,所占用的存儲空間越多。
    3. 算法在運行過程中臨時占用的存儲空間隨算法的不同而改變,有的算法只需要占用少量的臨時工作單元,與待解決問題的規模無關(此種算法稱為原地工作),有的算法需要占用的臨時工作單元,與待解決問題的規模有關,即隨問題的規模的增大而增大

 

評價一個算法的各種指標往往是相互矛盾、相互影響的:

當追求較短的運行時間,可能帶來較多的存儲空間和編寫出較繁瑣的算法;當追求算法的簡單性時,可能需要占用較長的運行時間和較多的存儲空間等。

 

所以,

在設計個算法時,要從多個方面綜合考慮。還要考慮到算法的使用頻率以及所使用機器的軟硬件環境等諸多因素,這樣才能設計出好的算法。

 

用計算機解決問題:

    1. 有解決問題的一套算法
    2. 描述出算法后,進行算法復雜性評估
    3. 選擇合適的算法方案

兩個待解決的任務:

  1. 程序設計語言的選擇
  2. 算法設計時我們選擇的是抽象數據模型,而程序實現部分,就需要完成:
  • 抽象數據模型的具體表示
  • 定義在該數據模型上的運算的具體實現,這屬於數據結構及運算問題。

 

 

二.程序設計基礎

            一個好的算法最終要用計算程序設計語言來實現

“指令集”:操作碼+操作數

 

程序設計語言分類:

    • 機器語言
    • 匯編語言
    • 高級語言

機器指令:‘0’ 和 ‘1’ 組成的二進制編碼表示命令(直接執行,執行速度快,無需翻譯)

 

機器語言:

由機器指令組成的語言稱為及其語言。

        (難以記憶,難以書寫,更加難懂)

匯編語言:

為了使語言更容易被程序員或者計算機使用者理解,人們用助記符代替二進制的操作碼,用符號地址代替二進制的操作數,稱之為匯編語言。

(安排存儲、規定寄存器、運算器的次序,難度較高)

高級語言:

高級語言是一種接近於人們習慣用的語言的計算機程序設計語言,它允許用英文詞匯書寫解題的程序,程序中所使用的運算符號和運算式都和我們日常中所用的數學表達式差不多。

 

程序設計方法:

  • 結構化程序設計
  • 面向對象程序設計

結構化程序設計 -- 模塊化:

  1. 采用自頂向下,逐步求精的程序設計方法。
  2. 使用三種基本控制結構構造程序,形成“單入口單出口”的程序。

      (順序結構  選擇結構  循環結構)

面向對象程序設計:

  1. 認為客觀世界是由各種對象組成,任何事物都是對象,復雜的對象可以由比較簡單的對象以某種方式組合而成。
  2. 把所有對象划分為不同的對象類(簡稱為類。Class),每一個類都定義了一組數據和方法。
  3. 按照子類(或派生類)與父類(或稱基類)的關系,把若干個對象類組成一個層次結構的系統。
  4. 對象彼此之間僅能通過傳遞信息相互聯系。

  

對象:

是由描述該對象的屬性的數據以及可以對這些數據施加的所有操作封裝在一起的一個統一體。

具有以下特點:

  1. 以數據為中心
  2. 對象是主動的
  3. 實現了數據的封裝
  4. 模塊獨立性好

具有以下優點:

  1. 開發時間短
  2. 效率高
  3. 可靠性高
  4. 所開發的程序可維護性強

 

數據結構基礎

計算機應用領域:

  • 控制
  • 管理
  • 數據處理

加工處理的對象: “數值” ==> “字符” “表格” “圖像”

 

數據結構:

  1. 數據的邏輯結構
  2. 數據的物理結構(儲存結構)
  3. 對數據的操作(或算法)

 

相關術語:

  1. 數據是對客觀事物的符號表示、在計算機中是指所有能輸入到計算機中並被計算機程序處理的符號的總稱。
  2. 數據元素是數據的基本單位,在計算機程序中通常對一個整體進行考慮和處理。有時,一個數據元素可以由多個數據項組成。
  3. 數據結構(也就是數據的邏輯結構)是指相互之間存在着一種或多種特定關系的集合。

 

常見結構:

  • 集合結構
  • 線性結構
  • 樹形結構
  • 圖形結構

  或

  • 線性結構
  • 非線性結構

數據元素之間的關系表示:順序映像非順序映像

順序映像:

借助元素在存儲器中的相對位置來表示數據元素之間的邏輯關系,也就是說,邏輯關系中相鄰的兩個元素,在存儲器中也是相鄰的。

非順序映像:

結束指示元素存儲地址的指針表示數據元素之間的邏輯關系,也就是說,存儲器中相鄰存放的兩個數據元素,其邏輯關系未必是相鄰的。

 

數據的運算:

對數據結構中的數據元素進行的操作處理。

         (查找 排序 插入 刪除 修改)

 

前件結點指向后件結點,沒有前間結點稱為根節點,沒有后間結點稱為葉子結點

 

線性表的基本概念

若一個非空的數據結構滿足一下條件:

  1. 有且只有一個根結點;
  2. 每一個結點最多有一個前件,也最多有一個后件。

則稱該數據結構為線性結構,線性結構又稱為線性表。

 

線性表的存儲結構:

順序存儲結構

鏈式存儲結構

 

具有順序存儲結構的線性表稱為順序表

具有鏈式存儲結構的線性表稱為線性鏈表

 

線性表的順序存儲結構

順序存儲結構把邏輯上相鄰的數據元素存儲在物理上相鄰的存儲單元里,順序存儲結構只能存儲結點的值,不存儲結點間的關系,結點間的關系由存儲單元的鄰接關系來體現。

 

順序表的插入操作是指在順序表的第 i -1 個數據元素和第 i 個數據元素之間插入一個新的數據元素。

順序表中的刪除第 i 個元素需將第 i + 1 至第 n 個元素依次向前移動一個位置。

 

線性表的鏈式存儲結構

線性表的鏈式存儲結構稱為線性鏈表。

鏈式存儲結構不要求邏輯上相鄰的數據元素物理位置也相鄰,而且各數據元素的存儲順序也是任意的。各數據元素的先后關系是由各節點的指針域指示。

鏈式存儲結構的每一個存儲結點不僅存儲結點的值,而且存儲結點之間的關系

                   [數據域]        [指針域]

  

 

 棧是僅能在表尾進行插入或刪除操作線性表

按照“先進后出”或“后進先出"的原則組織數據的線性表

物理存儲結構可以采用順序結構也可以采用鏈表結構。

順序棧

按照其物理上相鄰的存儲單元,宇哥棧的所有元素儲存在一片連續的存儲空間,棧的數據結構有一個非常重要的標記:棧頂指針

  棧的運算:

入棧(插入運算)

出棧(刪除運算)

讀棧頂元素

 

隊列:

一種特殊的線性表。特點為所有的插入都在表的一端進行,所有的刪除運算所在表的另一端進行。

按照“先進先出的”或“后進后出”的原則組織數據的線性表。

可以采用順序存儲結構,也可以采用鏈式存儲結構

 

隊列中的兩個指針:

指向隊首

指向隊尾

用來確定隊列的兩端的位置

 順序隊列

按照邏輯順序存儲在物理上相鄰的存儲單元,一個隊列中的所有元素存儲在一片連續的存儲空間里

入隊運算:

在隊伍指針向的位置插入一個新的元素,隊尾指針后移一位。插入操作前要先判斷隊伍是否已滿,如果已滿,就不能進行入隊運算。

出隊運算:

刪除對頭元素,將隊首指針向后移一位。刪除操作之前,要先判斷隊伍是否為空,若為空,則不能進行刪除運算。

循環隊列:

把隊列分配到的存儲空間,在邏輯上看做一個環,當隊尾指針指向存儲空間的末端后,如果再發生插入操作,就把它重新至於隊列存儲空間的始端。

 

  • 結點的度:一個結點許擁有的子樹棵樹稱為結點的度
  • 樹的度:樹值種所有結點度的最大值稱為樹的度。
  • 終端結點(葉子結點):樹中度為9 的結點為葉子結點
  • 非終端結點(分支結點):度不為0的點為分支結點
  • 結點的層次:樹中根節點的層次為1,根節點子樹的根為第二層,依次列推
  • 樹的深度:樹中結點的最大層數為數的深度
  • 有序樹和無序樹:如果樹中每一棵子樹從左向右排列擁有一定的順序,不得交換,則稱為有序樹,否則稱為無序樹

二叉樹

度為2的有序數.特點為樹中每一個結點最對有兩棵子樹,並且子樹有左右之分,次序不能顛倒

對於每一個節點,首先存它的值然后增加兩個指針域,分別存放在其左子樹和右子樹根結點的地址,也就是分別指向其左子樹和右子樹

 

二叉樹的性質:

  1. 第 i 層最對多有2i -1 個結點
  2. 深度 n 的二叉樹結點最多為 2n -1 個結點(n >= 1)
  3. 包含n個結點的二叉樹的高度至少為log2 (n+1)
  4. 二叉樹上葉子結點數比度為 2 的結點多 1

 

  1. 如果對滿二叉樹的結點進行編號, 約定編號從根結點起, 自上而下, 自左而右。則深度為k的, 有n個結點的二叉樹, 當且僅當其每一個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時, 稱之為完全二叉樹。
  2. 如果一棵二叉樹是滿二叉樹, 則它必定是完全二叉樹。
  3. 具有n個結點的完全二叉樹的深度
  4. 有 n 個結點的完全二叉樹按從上到下,從左到右的編號,則編號為 i (1 <= i <= n )的結點有:
  • 若 i > 1,則當 i 為偶數時 i 的雙親結點編號為 i/2 
    •         當 i 為奇數時 i 的雙親結點編號為( i -1)/2
  • 若  2*i <= n,則結點 i 的左孩子結點編號為 2 i
    •         否則無左孩子結點,即結點 i 為葉子結點
  • 若 2*i +1 <= n,則結點 i 的右孩子結點的編號為 2i + 1
    •         否則無右孩子結點,即結點 i 為葉子結點

完全二叉樹的葉子節點數公式為:

設葉子節點數為n0, 度為1的節點數為n1,度為2的節點數為n2,總節點為n。

1、當n為奇數時(即度為1的節點為0個),n0= (n+1)/2。

2、當n為偶數(即度為1的節點為1個), n0= n/2。

滿二叉樹:

深度為 h 的二叉樹擁有 2h -1個結點,則為滿二叉樹

第 i 層上的結點數為:

 

 

 

二叉樹的遍歷:

先序遍歷:根節點 => 左結點 => 右節點

中序遍歷:左節點 => 根節點 => 右節點

后序遍歷:左節點 => 右節點 => 根節點

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM