日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法01:绪论【LEARN FROM 李春葆《数据结构教程》】

發(fā)布時間:2023/12/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法01:绪论【LEARN FROM 李春葆《数据结构教程》】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 0.寫在前面
  • 1.數(shù)據(jù)結構總覽
    • 1.1 內(nèi)容
    • 1.2 數(shù)據(jù)結構在計算機課程體系(偏軟)中的地位
    • 1.3 數(shù)據(jù)結構與程序設計類課程的關系
    • 1.4 數(shù)據(jù)結構的學習目標
    • 1.5 數(shù)據(jù)結構的學習方法
  • 2.什么是數(shù)據(jù)結構
    • 2.1 數(shù)據(jù)結構的定義
      • 2.1.1 數(shù)據(jù)結構中的幾個概念
      • 2.1.2 一個數(shù)據(jù)結構的構成
        • 2.1.2.1 數(shù)據(jù)的邏輯結構表示
        • 2.1.2.2 數(shù)據(jù)的存儲結構表示
        • 2.1.2.3 數(shù)據(jù)運算
    • 2.2 邏輯結構類型
      • 2.2.1 集合
      • 2.2.2 線性結構
      • 2.2.3 樹形結構
      • 2.2.4 圖形結構
    • 2.3 存儲結構類型
      • 2.4 數(shù)據(jù)類型和抽象數(shù)據(jù)類型
      • 2.4.1 數(shù)據(jù)類型
      • 2.4.2 抽象數(shù)據(jù)類型
  • 3.算法及其描述
    • 3.1 什么是算法
    • 3.2 算法描述
  • 4.算法分析
    • 4.1 算法分析概述
    • 4.2 算法時間復雜度分析
      • 4.2.1 算法分析方式
      • 4.2.2 分析算法的執(zhí)行時間
      • 4.2.3 算法的執(zhí)行時間用時間復雜度來表示
      • 4.2.4 簡化的算法時間復雜度分析
      • 4.2.5 最好、最壞和平均時間復雜度分析
      • 4.2.6 算法空間復雜度分析
  • 5.數(shù)據(jù)結構+算法=程序
    • 5.1 程序和數(shù)據(jù)結構
    • 5.2 算法和程序
    • 5.3 算法和數(shù)據(jù)結構
    • 5.4 數(shù)據(jù)結構的發(fā)展
  • 6.總結
    • 6.1 從數(shù)據(jù)結構角度求解問題的過程
    • 6.2 算法描述―輸出型參數(shù)

0.寫在前面

關于本文,被收集在我的專欄《數(shù)據(jù)結構與算法教程筆記》中,筆記整理來自李春葆老師的《數(shù)據(jù)結構教程第六版》。更多章節(jié)可參考該專欄。【該專欄目前處于持續(xù)更新狀態(tài) -2022/9/11 】

1.數(shù)據(jù)結構總覽

1.1 內(nèi)容

#mermaid-svg-PqNYmN33L5k5q9gE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PqNYmN33L5k5q9gE .error-icon{fill:#552222;}#mermaid-svg-PqNYmN33L5k5q9gE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PqNYmN33L5k5q9gE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PqNYmN33L5k5q9gE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PqNYmN33L5k5q9gE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PqNYmN33L5k5q9gE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PqNYmN33L5k5q9gE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PqNYmN33L5k5q9gE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PqNYmN33L5k5q9gE .marker.cross{stroke:#333333;}#mermaid-svg-PqNYmN33L5k5q9gE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PqNYmN33L5k5q9gE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PqNYmN33L5k5q9gE .cluster-label text{fill:#333;}#mermaid-svg-PqNYmN33L5k5q9gE .cluster-label span{color:#333;}#mermaid-svg-PqNYmN33L5k5q9gE .label text,#mermaid-svg-PqNYmN33L5k5q9gE span{fill:#333;color:#333;}#mermaid-svg-PqNYmN33L5k5q9gE .node rect,#mermaid-svg-PqNYmN33L5k5q9gE .node circle,#mermaid-svg-PqNYmN33L5k5q9gE .node ellipse,#mermaid-svg-PqNYmN33L5k5q9gE .node polygon,#mermaid-svg-PqNYmN33L5k5q9gE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PqNYmN33L5k5q9gE .node .label{text-align:center;}#mermaid-svg-PqNYmN33L5k5q9gE .node.clickable{cursor:pointer;}#mermaid-svg-PqNYmN33L5k5q9gE .arrowheadPath{fill:#333333;}#mermaid-svg-PqNYmN33L5k5q9gE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PqNYmN33L5k5q9gE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PqNYmN33L5k5q9gE .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-PqNYmN33L5k5q9gE .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-PqNYmN33L5k5q9gE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PqNYmN33L5k5q9gE .cluster text{fill:#333;}#mermaid-svg-PqNYmN33L5k5q9gE .cluster span{color:#333;}#mermaid-svg-PqNYmN33L5k5q9gE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PqNYmN33L5k5q9gE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}基本數(shù)據(jù)組織和數(shù)據(jù)處理方法各種數(shù)據(jù)的邏輯結構描述各種數(shù)據(jù)的存儲結構表示各種數(shù)據(jù)結構的運算定義設計實現(xiàn)運算的算法分析算法的效率

1.2 數(shù)據(jù)結構在計算機課程體系(偏軟)中的地位

#mermaid-svg-ZhaosJUjnotXKeHA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZhaosJUjnotXKeHA .error-icon{fill:#552222;}#mermaid-svg-ZhaosJUjnotXKeHA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZhaosJUjnotXKeHA .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ZhaosJUjnotXKeHA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZhaosJUjnotXKeHA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZhaosJUjnotXKeHA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZhaosJUjnotXKeHA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZhaosJUjnotXKeHA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZhaosJUjnotXKeHA .marker.cross{stroke:#333333;}#mermaid-svg-ZhaosJUjnotXKeHA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZhaosJUjnotXKeHA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZhaosJUjnotXKeHA .cluster-label text{fill:#333;}#mermaid-svg-ZhaosJUjnotXKeHA .cluster-label span{color:#333;}#mermaid-svg-ZhaosJUjnotXKeHA .label text,#mermaid-svg-ZhaosJUjnotXKeHA span{fill:#333;color:#333;}#mermaid-svg-ZhaosJUjnotXKeHA .node rect,#mermaid-svg-ZhaosJUjnotXKeHA .node circle,#mermaid-svg-ZhaosJUjnotXKeHA .node ellipse,#mermaid-svg-ZhaosJUjnotXKeHA .node polygon,#mermaid-svg-ZhaosJUjnotXKeHA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZhaosJUjnotXKeHA .node .label{text-align:center;}#mermaid-svg-ZhaosJUjnotXKeHA .node.clickable{cursor:pointer;}#mermaid-svg-ZhaosJUjnotXKeHA .arrowheadPath{fill:#333333;}#mermaid-svg-ZhaosJUjnotXKeHA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZhaosJUjnotXKeHA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZhaosJUjnotXKeHA .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ZhaosJUjnotXKeHA .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ZhaosJUjnotXKeHA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZhaosJUjnotXKeHA .cluster text{fill:#333;}#mermaid-svg-ZhaosJUjnotXKeHA .cluster span{color:#333;}#mermaid-svg-ZhaosJUjnotXKeHA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZhaosJUjnotXKeHA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}計算機基礎C語言
C語言數(shù)據(jù)結構算法設計與分析操作系統(tǒng)
編譯原理
數(shù)據(jù)庫原理
軟件工程

1.3 數(shù)據(jù)結構與程序設計類課程的關系

#mermaid-svg-kAYLBlGn5DbUOaGj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kAYLBlGn5DbUOaGj .error-icon{fill:#552222;}#mermaid-svg-kAYLBlGn5DbUOaGj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kAYLBlGn5DbUOaGj .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-kAYLBlGn5DbUOaGj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kAYLBlGn5DbUOaGj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kAYLBlGn5DbUOaGj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kAYLBlGn5DbUOaGj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kAYLBlGn5DbUOaGj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kAYLBlGn5DbUOaGj .marker.cross{stroke:#333333;}#mermaid-svg-kAYLBlGn5DbUOaGj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kAYLBlGn5DbUOaGj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kAYLBlGn5DbUOaGj .cluster-label text{fill:#333;}#mermaid-svg-kAYLBlGn5DbUOaGj .cluster-label span{color:#333;}#mermaid-svg-kAYLBlGn5DbUOaGj .label text,#mermaid-svg-kAYLBlGn5DbUOaGj span{fill:#333;color:#333;}#mermaid-svg-kAYLBlGn5DbUOaGj .node rect,#mermaid-svg-kAYLBlGn5DbUOaGj .node circle,#mermaid-svg-kAYLBlGn5DbUOaGj .node ellipse,#mermaid-svg-kAYLBlGn5DbUOaGj .node polygon,#mermaid-svg-kAYLBlGn5DbUOaGj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kAYLBlGn5DbUOaGj .node .label{text-align:center;}#mermaid-svg-kAYLBlGn5DbUOaGj .node.clickable{cursor:pointer;}#mermaid-svg-kAYLBlGn5DbUOaGj .arrowheadPath{fill:#333333;}#mermaid-svg-kAYLBlGn5DbUOaGj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kAYLBlGn5DbUOaGj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kAYLBlGn5DbUOaGj .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-kAYLBlGn5DbUOaGj .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-kAYLBlGn5DbUOaGj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kAYLBlGn5DbUOaGj .cluster text{fill:#333;}#mermaid-svg-kAYLBlGn5DbUOaGj .cluster span{color:#333;}#mermaid-svg-kAYLBlGn5DbUOaGj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kAYLBlGn5DbUOaGj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}基本編程以數(shù)據(jù)機構為中心的算法設計
基本算法設計方法通用算法設計
算法設計方法學程序設計語言數(shù)據(jù)結構算法設計與分析識字寫小作文寫大文章

1.4 數(shù)據(jù)結構的學習目標

  • 掌握數(shù)據(jù)結構的基本概念、基本原理和基本方法。

  • 掌握數(shù)據(jù)的邏輯結構、存儲結構及基本運算的實現(xiàn)過程。

    #mermaid-svg-CX7PXlTiN5WEPry8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CX7PXlTiN5WEPry8 .error-icon{fill:#552222;}#mermaid-svg-CX7PXlTiN5WEPry8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CX7PXlTiN5WEPry8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-CX7PXlTiN5WEPry8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CX7PXlTiN5WEPry8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CX7PXlTiN5WEPry8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CX7PXlTiN5WEPry8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CX7PXlTiN5WEPry8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CX7PXlTiN5WEPry8 .marker.cross{stroke:#333333;}#mermaid-svg-CX7PXlTiN5WEPry8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CX7PXlTiN5WEPry8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CX7PXlTiN5WEPry8 .cluster-label text{fill:#333;}#mermaid-svg-CX7PXlTiN5WEPry8 .cluster-label span{color:#333;}#mermaid-svg-CX7PXlTiN5WEPry8 .label text,#mermaid-svg-CX7PXlTiN5WEPry8 span{fill:#333;color:#333;}#mermaid-svg-CX7PXlTiN5WEPry8 .node rect,#mermaid-svg-CX7PXlTiN5WEPry8 .node circle,#mermaid-svg-CX7PXlTiN5WEPry8 .node ellipse,#mermaid-svg-CX7PXlTiN5WEPry8 .node polygon,#mermaid-svg-CX7PXlTiN5WEPry8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CX7PXlTiN5WEPry8 .node .label{text-align:center;}#mermaid-svg-CX7PXlTiN5WEPry8 .node.clickable{cursor:pointer;}#mermaid-svg-CX7PXlTiN5WEPry8 .arrowheadPath{fill:#333333;}#mermaid-svg-CX7PXlTiN5WEPry8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CX7PXlTiN5WEPry8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CX7PXlTiN5WEPry8 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-CX7PXlTiN5WEPry8 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-CX7PXlTiN5WEPry8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CX7PXlTiN5WEPry8 .cluster text{fill:#333;}#mermaid-svg-CX7PXlTiN5WEPry8 .cluster span{color:#333;}#mermaid-svg-CX7PXlTiN5WEPry8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CX7PXlTiN5WEPry8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}提煉設計實現(xiàn)求解問題
    數(shù)據(jù)運行-->數(shù)據(jù)數(shù)據(jù)邏輯結構數(shù)據(jù)存儲結構數(shù)據(jù)基本運行:算法
  • 掌握算法基本的時間復雜度與空間復雜度的分析方法,能夠設計出求解問題的高效算法。

    ?? 同一求解問題通常有多種實現(xiàn)算法,通過時間復雜度與空間復雜度的分析,找出最好的實現(xiàn)算法。

1.5 數(shù)據(jù)結構的學習方法

  • 理解各種數(shù)據(jù)結構的邏輯特性和存儲結構設計

    #mermaid-svg-g0itRNUEhSJwqFEg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-g0itRNUEhSJwqFEg .error-icon{fill:#552222;}#mermaid-svg-g0itRNUEhSJwqFEg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-g0itRNUEhSJwqFEg .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-g0itRNUEhSJwqFEg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-g0itRNUEhSJwqFEg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-g0itRNUEhSJwqFEg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-g0itRNUEhSJwqFEg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-g0itRNUEhSJwqFEg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-g0itRNUEhSJwqFEg .marker.cross{stroke:#333333;}#mermaid-svg-g0itRNUEhSJwqFEg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-g0itRNUEhSJwqFEg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-g0itRNUEhSJwqFEg .cluster-label text{fill:#333;}#mermaid-svg-g0itRNUEhSJwqFEg .cluster-label span{color:#333;}#mermaid-svg-g0itRNUEhSJwqFEg .label text,#mermaid-svg-g0itRNUEhSJwqFEg span{fill:#333;color:#333;}#mermaid-svg-g0itRNUEhSJwqFEg .node rect,#mermaid-svg-g0itRNUEhSJwqFEg .node circle,#mermaid-svg-g0itRNUEhSJwqFEg .node ellipse,#mermaid-svg-g0itRNUEhSJwqFEg .node polygon,#mermaid-svg-g0itRNUEhSJwqFEg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-g0itRNUEhSJwqFEg .node .label{text-align:center;}#mermaid-svg-g0itRNUEhSJwqFEg .node.clickable{cursor:pointer;}#mermaid-svg-g0itRNUEhSJwqFEg .arrowheadPath{fill:#333333;}#mermaid-svg-g0itRNUEhSJwqFEg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-g0itRNUEhSJwqFEg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-g0itRNUEhSJwqFEg .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-g0itRNUEhSJwqFEg .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-g0itRNUEhSJwqFEg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-g0itRNUEhSJwqFEg .cluster text{fill:#333;}#mermaid-svg-g0itRNUEhSJwqFEg .cluster span{color:#333;}#mermaid-svg-g0itRNUEhSJwqFEg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-g0itRNUEhSJwqFEg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}映射:計算機中的表示邏輯特性存儲結構線性表棧隊列串數(shù)組樹二叉樹圖
  • 掌握各種數(shù)據(jù)結構算法設計的基本方法

    ?? 只有掌握了數(shù)據(jù)的存儲結構表示,才能在此之上設計算法

    #mermaid-svg-jGbJcN6ZqoCsDdhg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .error-icon{fill:#552222;}#mermaid-svg-jGbJcN6ZqoCsDdhg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jGbJcN6ZqoCsDdhg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .marker.cross{stroke:#333333;}#mermaid-svg-jGbJcN6ZqoCsDdhg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jGbJcN6ZqoCsDdhg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .cluster-label text{fill:#333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .cluster-label span{color:#333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .label text,#mermaid-svg-jGbJcN6ZqoCsDdhg span{fill:#333;color:#333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .node rect,#mermaid-svg-jGbJcN6ZqoCsDdhg .node circle,#mermaid-svg-jGbJcN6ZqoCsDdhg .node ellipse,#mermaid-svg-jGbJcN6ZqoCsDdhg .node polygon,#mermaid-svg-jGbJcN6ZqoCsDdhg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jGbJcN6ZqoCsDdhg .node .label{text-align:center;}#mermaid-svg-jGbJcN6ZqoCsDdhg .node.clickable{cursor:pointer;}#mermaid-svg-jGbJcN6ZqoCsDdhg .arrowheadPath{fill:#333333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jGbJcN6ZqoCsDdhg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-jGbJcN6ZqoCsDdhg .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-jGbJcN6ZqoCsDdhg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jGbJcN6ZqoCsDdhg .cluster text{fill:#333;}#mermaid-svg-jGbJcN6ZqoCsDdhg .cluster span{color:#333;}#mermaid-svg-jGbJcN6ZqoCsDdhg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jGbJcN6ZqoCsDdhg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}映射:計算機中的表示運算實現(xiàn)邏輯特性存儲結構算法設計
  • 利用各種數(shù)據(jù)結構來求解實際問題

    #mermaid-svg-vweDXJdDCkIJlKB8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vweDXJdDCkIJlKB8 .error-icon{fill:#552222;}#mermaid-svg-vweDXJdDCkIJlKB8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vweDXJdDCkIJlKB8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-vweDXJdDCkIJlKB8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vweDXJdDCkIJlKB8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vweDXJdDCkIJlKB8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vweDXJdDCkIJlKB8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vweDXJdDCkIJlKB8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vweDXJdDCkIJlKB8 .marker.cross{stroke:#333333;}#mermaid-svg-vweDXJdDCkIJlKB8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vweDXJdDCkIJlKB8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vweDXJdDCkIJlKB8 .cluster-label text{fill:#333;}#mermaid-svg-vweDXJdDCkIJlKB8 .cluster-label span{color:#333;}#mermaid-svg-vweDXJdDCkIJlKB8 .label text,#mermaid-svg-vweDXJdDCkIJlKB8 span{fill:#333;color:#333;}#mermaid-svg-vweDXJdDCkIJlKB8 .node rect,#mermaid-svg-vweDXJdDCkIJlKB8 .node circle,#mermaid-svg-vweDXJdDCkIJlKB8 .node ellipse,#mermaid-svg-vweDXJdDCkIJlKB8 .node polygon,#mermaid-svg-vweDXJdDCkIJlKB8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vweDXJdDCkIJlKB8 .node .label{text-align:center;}#mermaid-svg-vweDXJdDCkIJlKB8 .node.clickable{cursor:pointer;}#mermaid-svg-vweDXJdDCkIJlKB8 .arrowheadPath{fill:#333333;}#mermaid-svg-vweDXJdDCkIJlKB8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vweDXJdDCkIJlKB8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vweDXJdDCkIJlKB8 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-vweDXJdDCkIJlKB8 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-vweDXJdDCkIJlKB8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vweDXJdDCkIJlKB8 .cluster text{fill:#333;}#mermaid-svg-vweDXJdDCkIJlKB8 .cluster span{color:#333;}#mermaid-svg-vweDXJdDCkIJlKB8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vweDXJdDCkIJlKB8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}求解問題數(shù)據(jù)如何表示(選擇合適的數(shù)據(jù)結構)數(shù)據(jù)運算如何實現(xiàn)數(shù)據(jù)運算如何高效實現(xiàn)
  • 演繹和歸納相結合

    #mermaid-svg-2EjO7BbaOhKeSR8n {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2EjO7BbaOhKeSR8n .error-icon{fill:#552222;}#mermaid-svg-2EjO7BbaOhKeSR8n .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2EjO7BbaOhKeSR8n .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-2EjO7BbaOhKeSR8n .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2EjO7BbaOhKeSR8n .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2EjO7BbaOhKeSR8n .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2EjO7BbaOhKeSR8n .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2EjO7BbaOhKeSR8n .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2EjO7BbaOhKeSR8n .marker.cross{stroke:#333333;}#mermaid-svg-2EjO7BbaOhKeSR8n svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2EjO7BbaOhKeSR8n .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2EjO7BbaOhKeSR8n .cluster-label text{fill:#333;}#mermaid-svg-2EjO7BbaOhKeSR8n .cluster-label span{color:#333;}#mermaid-svg-2EjO7BbaOhKeSR8n .label text,#mermaid-svg-2EjO7BbaOhKeSR8n span{fill:#333;color:#333;}#mermaid-svg-2EjO7BbaOhKeSR8n .node rect,#mermaid-svg-2EjO7BbaOhKeSR8n .node circle,#mermaid-svg-2EjO7BbaOhKeSR8n .node ellipse,#mermaid-svg-2EjO7BbaOhKeSR8n .node polygon,#mermaid-svg-2EjO7BbaOhKeSR8n .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2EjO7BbaOhKeSR8n .node .label{text-align:center;}#mermaid-svg-2EjO7BbaOhKeSR8n .node.clickable{cursor:pointer;}#mermaid-svg-2EjO7BbaOhKeSR8n .arrowheadPath{fill:#333333;}#mermaid-svg-2EjO7BbaOhKeSR8n .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2EjO7BbaOhKeSR8n .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2EjO7BbaOhKeSR8n .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-2EjO7BbaOhKeSR8n .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-2EjO7BbaOhKeSR8n .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2EjO7BbaOhKeSR8n .cluster text{fill:#333;}#mermaid-svg-2EjO7BbaOhKeSR8n .cluster span{color:#333;}#mermaid-svg-2EjO7BbaOhKeSR8n div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2EjO7BbaOhKeSR8n :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}演繹學習訓練歸納總結數(shù)據(jù)結構魚(內(nèi)容):基本概念,基本原理和基本方法練習(作業(yè)和編程)漁(方法):求解問題的能力

2.什么是數(shù)據(jù)結構

2.1 數(shù)據(jù)結構的定義

2.1.1 數(shù)據(jù)結構中的幾個概念

  • 數(shù)據(jù):所有能夠輸入到計算機中,且能被計算機處理的符號的集合。數(shù)據(jù)結構中主要討論結構化數(shù)據(jù)

  • 數(shù)據(jù)元素:是數(shù)據(jù)(集合)中的一個“個體”,它是數(shù)據(jù)的基本單位。

  • 數(shù)據(jù)項:數(shù)據(jù)項是用來描述數(shù)據(jù)元素的,它是數(shù)據(jù)的最小單位。

  • 數(shù)據(jù)對象:具有相同性質(zhì)的若干個數(shù)據(jù)元素的集合,如整數(shù)數(shù)據(jù)對象是所有整數(shù)的集合。默認情況下,數(shù)據(jù)結構中討論的數(shù)據(jù)都是數(shù)據(jù)對象。

  • 數(shù)據(jù)結構:是指帶結構的數(shù)據(jù)元素的集合。

    #mermaid-svg-kwU689xqMXDizx2o {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kwU689xqMXDizx2o .error-icon{fill:#552222;}#mermaid-svg-kwU689xqMXDizx2o .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kwU689xqMXDizx2o .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-kwU689xqMXDizx2o .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kwU689xqMXDizx2o .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kwU689xqMXDizx2o .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kwU689xqMXDizx2o .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kwU689xqMXDizx2o .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kwU689xqMXDizx2o .marker.cross{stroke:#333333;}#mermaid-svg-kwU689xqMXDizx2o svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kwU689xqMXDizx2o .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kwU689xqMXDizx2o .cluster-label text{fill:#333;}#mermaid-svg-kwU689xqMXDizx2o .cluster-label span{color:#333;}#mermaid-svg-kwU689xqMXDizx2o .label text,#mermaid-svg-kwU689xqMXDizx2o span{fill:#333;color:#333;}#mermaid-svg-kwU689xqMXDizx2o .node rect,#mermaid-svg-kwU689xqMXDizx2o .node circle,#mermaid-svg-kwU689xqMXDizx2o .node ellipse,#mermaid-svg-kwU689xqMXDizx2o .node polygon,#mermaid-svg-kwU689xqMXDizx2o .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kwU689xqMXDizx2o .node .label{text-align:center;}#mermaid-svg-kwU689xqMXDizx2o .node.clickable{cursor:pointer;}#mermaid-svg-kwU689xqMXDizx2o .arrowheadPath{fill:#333333;}#mermaid-svg-kwU689xqMXDizx2o .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kwU689xqMXDizx2o .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kwU689xqMXDizx2o .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-kwU689xqMXDizx2o .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-kwU689xqMXDizx2o .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kwU689xqMXDizx2o .cluster text{fill:#333;}#mermaid-svg-kwU689xqMXDizx2o .cluster span{color:#333;}#mermaid-svg-kwU689xqMXDizx2o div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kwU689xqMXDizx2o :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}數(shù)據(jù)結構數(shù)據(jù)對象:相同性質(zhì)的數(shù)據(jù)元素的集合結構:數(shù)據(jù)元素之間的關系構成結構
  • 2.1.2 一個數(shù)據(jù)結構的構成

    #mermaid-svg-r999YIAdXkBUK9yr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-r999YIAdXkBUK9yr .error-icon{fill:#552222;}#mermaid-svg-r999YIAdXkBUK9yr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-r999YIAdXkBUK9yr .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-r999YIAdXkBUK9yr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-r999YIAdXkBUK9yr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-r999YIAdXkBUK9yr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-r999YIAdXkBUK9yr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-r999YIAdXkBUK9yr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-r999YIAdXkBUK9yr .marker.cross{stroke:#333333;}#mermaid-svg-r999YIAdXkBUK9yr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-r999YIAdXkBUK9yr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-r999YIAdXkBUK9yr .cluster-label text{fill:#333;}#mermaid-svg-r999YIAdXkBUK9yr .cluster-label span{color:#333;}#mermaid-svg-r999YIAdXkBUK9yr .label text,#mermaid-svg-r999YIAdXkBUK9yr span{fill:#333;color:#333;}#mermaid-svg-r999YIAdXkBUK9yr .node rect,#mermaid-svg-r999YIAdXkBUK9yr .node circle,#mermaid-svg-r999YIAdXkBUK9yr .node ellipse,#mermaid-svg-r999YIAdXkBUK9yr .node polygon,#mermaid-svg-r999YIAdXkBUK9yr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-r999YIAdXkBUK9yr .node .label{text-align:center;}#mermaid-svg-r999YIAdXkBUK9yr .node.clickable{cursor:pointer;}#mermaid-svg-r999YIAdXkBUK9yr .arrowheadPath{fill:#333333;}#mermaid-svg-r999YIAdXkBUK9yr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-r999YIAdXkBUK9yr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-r999YIAdXkBUK9yr .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-r999YIAdXkBUK9yr .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-r999YIAdXkBUK9yr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-r999YIAdXkBUK9yr .cluster text{fill:#333;}#mermaid-svg-r999YIAdXkBUK9yr .cluster span{color:#333;}#mermaid-svg-r999YIAdXkBUK9yr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-r999YIAdXkBUK9yr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}邏輯結構存儲結構數(shù)據(jù)運算
  • 數(shù)據(jù)的邏輯結構:數(shù)據(jù)元素之間的邏輯關系
  • 數(shù)據(jù)的存儲結構(或物理結構):數(shù)據(jù)元素及其關系在計算機存儲器中的存儲方式
  • 數(shù)據(jù)運算:施加在該數(shù)據(jù)上的操作
  • 2.1.2.1 數(shù)據(jù)的邏輯結構表示

  • 數(shù)據(jù)的邏輯結構是面向用戶的,它有多種表示形式。

  • 二元組是一種通用的邏輯結構表示方法。

  • 每個關系的用若干個序偶來表示

  • 2.1.2.2 數(shù)據(jù)的存儲結構表示

    1?? 數(shù)據(jù)在計算機存儲器中的存儲方式就是存儲結構。它是面向程序員的。邏輯結構映射存儲結構。

    2?? 設計存儲結構的這種映射應滿足兩個要求:

  • 存儲所有元素

  • 存儲數(shù)據(jù)元素間的關系

  • 結構體數(shù)組(順序存儲結構)

    • 所有元素占用一整塊內(nèi)存空間
    • 邏輯上相鄰的元素,物理上也相鄰。
  • 鏈表(鏈式存儲結構)

    • 一個邏輯元素用一個結點存儲,每個結點單獨分配,所有結點的地址不一定是連續(xù)的。
    • 用指針來表示邏輯關系。
  • 2.1.2.3 數(shù)據(jù)運算

    數(shù)據(jù)運算是對數(shù)據(jù)的操作。分為兩個層次:運算描述運算實現(xiàn)

    • 同一邏輯結構可以對應多種存儲結構。
    • 同樣的運算,在不同的存儲結構中,其實現(xiàn)過程是不同的

    2.2 邏輯結構類型

    各種各樣的數(shù)據(jù)呈現(xiàn)出不同的邏輯結構,歸納為4種。

    2.2.1 集合

    • 元素之間關系:無。
    • 特點:數(shù)據(jù)元素之間除了“屬于同一個集合”的關系外,別無其他邏輯關系。是最松散的,不受任何制約的關系。

    2.2.2 線性結構

    • 元素之間關系:一對一。
    • 特點:開始元素和終端元素都是唯一的,除此之外,其余元素都有且僅有一個前驅元素和一個后繼元素。

    2.2.3 樹形結構

    • 元素之間關系:一對多。
    • 特點:開始元素唯一,終端元素不唯一。除終端元素以外,每個元素有一個或多個后繼元素;除開始元素外,每個元素有且僅有一個前驅元素。

    2.2.4 圖形結構

    • 元素之間關系:多對多。
    • 特點:所有元素都可能有多個前驅元素和多個后繼元素。

    2.3 存儲結構類型

    在軟件開發(fā)中,人們設計了各種存儲結構。 歸納為4種基本的存儲結構。

    • 順序存儲結構
    • 鏈式存儲結構
    • 索引存儲結構
    • 哈希(散列)存儲結構

    2.4 數(shù)據(jù)類型和抽象數(shù)據(jù)類型

    2.4.1 數(shù)據(jù)類型

    1?? 在高級程序語言中提供了多種數(shù)據(jù)類型。不同數(shù)據(jù)類型的變量,其所能取的值的范圍不同,所能進行的操作不同。

    2?? 數(shù)據(jù)類型 是一個值的集合和定義在此集合上的一組操作的總稱

    3?? 數(shù)據(jù)類型和數(shù)據(jù)結構的關系:數(shù)據(jù)類型就是已經(jīng)實現(xiàn)了的數(shù)據(jù)結構。

    2.4.2 抽象數(shù)據(jù)類型

    1?? 抽象數(shù)據(jù)類型(ADT)指的是從求解問題的數(shù)學模型中抽象出來的數(shù)據(jù)邏輯結構和運算(抽象運算),而不考慮計算機的具體實現(xiàn)。

    2?? 抽象數(shù)據(jù)類型 = 邏輯結構 + 抽象運算

    3?? 抽象數(shù)據(jù)類型實質(zhì)上就是對一個求解問題的形式化描述(與計算機無關),程序員可以在理解基礎上實現(xiàn)它。

    3.算法及其描述

    3.1 什么是算法

    數(shù)據(jù)元素之間的關系有邏輯關系和物理關系,對應的運算有基于邏輯結構的運算描述和基于存儲結構的運算實現(xiàn)。
    1?? 數(shù)據(jù)是各種信息的表現(xiàn)形式
    2?? 算法表現(xiàn)為“處理”和“數(shù)據(jù)”的結合

    通常把基于存儲結構的運算實現(xiàn)的步驟或過程稱為算法。更一般地,算法是 解決問題的處理步驟

    ?? 算法的五個重要的特性

    • 有窮性:在有窮步之后結束,算法能夠停機。
    • 確定性:無二義性。
    • 可行性:可通過基本運算有限次執(zhí)行來實現(xiàn),也就是算法中每一個動作能夠被機械地執(zhí)行。
    • 輸入:0個或多個輸入【表示存在數(shù)據(jù)處理】
    • 輸出:1個或多個輸出【表示存在數(shù)據(jù)處理】

    ?? 算法和程序的區(qū)別

    • 程序是指使用某種計算機語言對一個算法的具體實現(xiàn),即具體要怎么做。

      程序不一定滿足有窮性

    • 算法側重于對解決問題的方法描述,即要做什么。

      算法一定滿足有窮性

    • 算法用計算機語言描述 --> 程序

    3.2 算法描述

    ? 如何描述輸出型參數(shù)

    📍 C++語言中提供了一種引用運算符“&”用于描述輸出型參數(shù)。

    ?? 算法可以采用自然語言、流程圖或者表格方式等來描述。但是,一個學習計算機的學生應該使用某種計算機語言來描述算法。

    4.算法分析

    4.1 算法分析概述

    算法分析目的:分析算法的時空效率以便改進算法性能。

    4.2 算法時間復雜度分析

    • 一個算法是由控制結構(順序、分支和循環(huán)三種)和原操作構成的。
    • 順序結構:按照所述順序處理
      分支結構:根據(jù)判斷條件改變執(zhí)行流程
      循環(huán)結構:當條件成立時,反復執(zhí)行給定的處理操作
    • 指固有數(shù)據(jù)類型的操作,如+、-、*、/、++和–等
    • 算法執(zhí)行時間取決于兩者的綜合效果。

    4.2.1 算法分析方式

    • 事后分析統(tǒng)計方法:編寫算法對應程序,統(tǒng)計其執(zhí)行時間。

      編寫程序的語言不同,執(zhí)行程序的環(huán)境不同以及其它因素造成不能用絕對執(zhí)行時間進行比較。

    • 🚩 事前估算分析方法:撇開上述因素,認為算法的執(zhí)行時間是問題規(guī)模n的函數(shù)。

    4.2.2 分析算法的執(zhí)行時間

    • 求出算法所有原操作的執(zhí)行次數(shù)(也稱為頻度),它是問題規(guī)模n的函數(shù),用T(n)表示。
    • 算法執(zhí)行時間大致 = 原操作所需的時間×T(n)。所以T(n)與算法的執(zhí)行時間成正比。為此用T(n)表示算法的執(zhí)行時間。
    • 比較不同算法的T(n)大小得出算法執(zhí)行時間的好壞。

    4.2.3 算法的執(zhí)行時間用時間復雜度來表示

    算法中執(zhí)行時間T(n)是問題規(guī)模n的某個函數(shù)f(n),記作:T(n) = O(f(n))

    記號“O”讀作“大O”,它表示隨問題規(guī)模n的增大算法執(zhí)行時間的增長率和f(n)的增長率相同 --> 趨勢分析

    也就是只求出T(n)的最高階,忽略其低階項和常系數(shù),這樣既可簡化T(n)的計算,又能比較客觀地反映出當n很大時算法的時間性能。
    本質(zhì)上講,是一種T(n)最高數(shù)量級的比較。

    例如:T(n) = 2n2n^2n2+2n+1 = O(n2n^2n2)

    📝 一般地:

    • 一個沒有循環(huán)的算法的執(zhí)行時間與問題規(guī)模n無關,記作O(1),也稱作常數(shù)階。
    • 一個只有一重循環(huán)的算法的執(zhí)行時間與問題規(guī)模n的增長呈線性增大關系,記作O(n),也稱線性階。
    • 其余常用的算法時間復雜度還有平方階O(n2n^2n2)、立方階O(n3n^3n3)、對數(shù)階O(log2nlog_2nlog2?n)、指數(shù)階O(2n2^n2n)等。

    各種不同算法時間復雜度的比較關系如下:

    算法時間性能比較:假如求同一問題有兩個算法:A和B,如果算法A的平均時間復雜度為O(n),而算法B的平均時間復雜度為O(n2n^2n2)。  一般情況下,認為算法A的時間性能好比算法B。

    某算法的時間復雜度為O(n2n^2n2),表明該算法的執(zhí)行時間與n2n^2n2成正比。

    4.2.4 簡化的算法時間復雜度分析

    #mermaid-svg-VYHF0hf3lbhrYJsX {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VYHF0hf3lbhrYJsX .error-icon{fill:#552222;}#mermaid-svg-VYHF0hf3lbhrYJsX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VYHF0hf3lbhrYJsX .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VYHF0hf3lbhrYJsX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VYHF0hf3lbhrYJsX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VYHF0hf3lbhrYJsX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VYHF0hf3lbhrYJsX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VYHF0hf3lbhrYJsX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VYHF0hf3lbhrYJsX .marker.cross{stroke:#333333;}#mermaid-svg-VYHF0hf3lbhrYJsX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VYHF0hf3lbhrYJsX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VYHF0hf3lbhrYJsX .cluster-label text{fill:#333;}#mermaid-svg-VYHF0hf3lbhrYJsX .cluster-label span{color:#333;}#mermaid-svg-VYHF0hf3lbhrYJsX .label text,#mermaid-svg-VYHF0hf3lbhrYJsX span{fill:#333;color:#333;}#mermaid-svg-VYHF0hf3lbhrYJsX .node rect,#mermaid-svg-VYHF0hf3lbhrYJsX .node circle,#mermaid-svg-VYHF0hf3lbhrYJsX .node ellipse,#mermaid-svg-VYHF0hf3lbhrYJsX .node polygon,#mermaid-svg-VYHF0hf3lbhrYJsX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VYHF0hf3lbhrYJsX .node .label{text-align:center;}#mermaid-svg-VYHF0hf3lbhrYJsX .node.clickable{cursor:pointer;}#mermaid-svg-VYHF0hf3lbhrYJsX .arrowheadPath{fill:#333333;}#mermaid-svg-VYHF0hf3lbhrYJsX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VYHF0hf3lbhrYJsX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VYHF0hf3lbhrYJsX .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VYHF0hf3lbhrYJsX .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VYHF0hf3lbhrYJsX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VYHF0hf3lbhrYJsX .cluster text{fill:#333;}#mermaid-svg-VYHF0hf3lbhrYJsX .cluster span{color:#333;}#mermaid-svg-VYHF0hf3lbhrYJsX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VYHF0hf3lbhrYJsX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}算法中的基本操作一般是最深層循環(huán)內(nèi)的原操作在算法分析時,計算T(n)時僅僅考慮基本操作的運算次數(shù)算法執(zhí)行時間大致 = 基本操作所需的時間×其運算次數(shù)

    4.2.5 最好、最壞和平均時間復雜度分析

    4.2.6 算法空間復雜度分析

    空間復雜度:用于量度一個算法運行過程中臨時占用的存儲空間大小(算法中需要的輔助變量所占用存儲空間的大小)。一般也作為問題規(guī)模n的函數(shù),采用數(shù)量級形式描述,記作:S(n) = O(g(n))

    若一個算法的空間復雜度為O(1),則稱此算法為原地工作或就地工作算法。該算法執(zhí)行所需輔助空間大小與問題規(guī)模n無關。

    ? 為什么空間復雜度分析只考慮臨時占用的存儲空間

    ?? 分析如下算法的空間復雜度

    // 臨時占用的存儲空間:函數(shù)體內(nèi)分配的空間 int fun(int n){ int i,j,k,s;s=0;for (i=0;i<=n;i++)for(j=0;j<=i;j++)for (k=0;k<=j;k++)s++; return(s) }

    📝 算法中臨時分配的變量個數(shù)與問題規(guī)模n無關,所以空間復雜度均為O(1)

    5.數(shù)據(jù)結構+算法=程序

    5.1 程序和數(shù)據(jù)結構

    • 程序總是以某些數(shù)據(jù)為處理對象。將松散、無組織的數(shù)據(jù)按某種要求組成一種數(shù)據(jù)結構,對于設計一個簡明、高效、可靠的程序是大有益處的。
    • 沃思:程序就是在數(shù)據(jù)的某些特定的表示方法和結構的基礎上,對抽象算法的具體表述,所以說程序離不開數(shù)據(jù)結構。
    • 程序是通過某種程序設計語言描述的,程序設計語言具有實現(xiàn)數(shù)據(jù)結構和算法的機制,其中類型聲明與對象定義用于實現(xiàn)數(shù)據(jù)結構,而語句實現(xiàn)實現(xiàn)算法,描述程序的行為。

    5.2 算法和程序

    • 由程序設計語言描述的算法就是計算機程序。
    • 對一個求解問題而言,算法就是解題的方法,沒有算法,程序就成了無本之末,無源之水,有了算法,將它表示成程序是不困難的。
    • 算法是程序的靈魂。算法在整個計算機科學中的地位都是極其重要的。

    5.3 算法和數(shù)據(jù)結構

    ?? 數(shù)據(jù)結構角度求解問題的過程

    #mermaid-svg-VgE0RRf6W9w1VYJl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VgE0RRf6W9w1VYJl .error-icon{fill:#552222;}#mermaid-svg-VgE0RRf6W9w1VYJl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VgE0RRf6W9w1VYJl .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VgE0RRf6W9w1VYJl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VgE0RRf6W9w1VYJl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VgE0RRf6W9w1VYJl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VgE0RRf6W9w1VYJl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VgE0RRf6W9w1VYJl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VgE0RRf6W9w1VYJl .marker.cross{stroke:#333333;}#mermaid-svg-VgE0RRf6W9w1VYJl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VgE0RRf6W9w1VYJl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VgE0RRf6W9w1VYJl .cluster-label text{fill:#333;}#mermaid-svg-VgE0RRf6W9w1VYJl .cluster-label span{color:#333;}#mermaid-svg-VgE0RRf6W9w1VYJl .label text,#mermaid-svg-VgE0RRf6W9w1VYJl span{fill:#333;color:#333;}#mermaid-svg-VgE0RRf6W9w1VYJl .node rect,#mermaid-svg-VgE0RRf6W9w1VYJl .node circle,#mermaid-svg-VgE0RRf6W9w1VYJl .node ellipse,#mermaid-svg-VgE0RRf6W9w1VYJl .node polygon,#mermaid-svg-VgE0RRf6W9w1VYJl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VgE0RRf6W9w1VYJl .node .label{text-align:center;}#mermaid-svg-VgE0RRf6W9w1VYJl .node.clickable{cursor:pointer;}#mermaid-svg-VgE0RRf6W9w1VYJl .arrowheadPath{fill:#333333;}#mermaid-svg-VgE0RRf6W9w1VYJl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VgE0RRf6W9w1VYJl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VgE0RRf6W9w1VYJl .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VgE0RRf6W9w1VYJl .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VgE0RRf6W9w1VYJl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VgE0RRf6W9w1VYJl .cluster text{fill:#333;}#mermaid-svg-VgE0RRf6W9w1VYJl .cluster span{color:#333;}#mermaid-svg-VgE0RRf6W9w1VYJl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VgE0RRf6W9w1VYJl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}數(shù)據(jù)結構觀編程一般過程軟件工程思想
    • 問題求解 --> 算法設計
    • 算法實現(xiàn) --> 選擇合適的存儲結構
    • 存儲結構設計取決于數(shù)據(jù)的邏輯結構,并且為運算高效實現(xiàn)服務。

    • 程序員可以直接使用它來存放數(shù)據(jù) —— 作為存放數(shù)據(jù)的容器。
    • 程序員可以直接使用它的基本運算 —— 完成更復雜的功能。

    5.4 數(shù)據(jù)結構的發(fā)展

    6.總結

    6.1 從數(shù)據(jù)結構角度求解問題的過程

    ?? 設計集合的順序存儲結構類型如下:

    typedef struct //集合結構體類型 { int data[MaxSize]; //存放集合中的元素,其中MaxSize為常量【靜態(tài)分配方式】int length; //存放集合中實際元素個數(shù) } Set; //將集合結構體類型用一個新類型名Set表示

    ?? 采用Set類型的變量存儲一個集合

    • createset(Set &s,int a[],int n):創(chuàng)建一個集合
    • dispset(Set s):輸出一個集合
    • inset(Set s,int e):判斷e是否在集合s中
    • add(Set s1,Set s2,Set &s3):求集合的并集
    • sub(Set s1,Set s2,Set &s3):求集合的差集
    • intersection(Set s1,Set s2,Set &s3):求集合的交集
    //創(chuàng)建一個集合 void createset(Set &s,int a[]int n) { int i;for (i=0;i<n;i++)s.data[i]=a[i];s.length=n; }//輸出一個集合 void dispset(Set s) { int i;for (i=0;i<s.length;i++)printf("%d ",s.data[i]);printf("\n"); }//判斷e是否在集合s中 bool inset(Set s,int e) { int i;for (i=0;i<s.length;i++)if (s.data[i]==e)return true;return false; }//求集合的并集 void add(Set s1,Set s2,Set &s3) { int i;for (i=0;i<s1.length;i++) //將集合s1的所有元素復制到s3中s3.data[i]=s1.data[i];s3.length=s1.length;for (i=0;i<s2.length;i++) //將s2中不在s1中出現(xiàn)的元素復制到s3中if (!inset(s1,s2.data[i])){ s3.data[s3.length]=s2.data[i];s3.length++;} }//求集合的差集 void sub(Set s1,Set s2,Set &s3) { int i;s3.length=0;for (i=0;i<s1.length;i++) //將s1中不出現(xiàn)在s2中的元素復制到s3中if (!inset(s2,s1.data[i])){ s3.data[s3.length]=s1.data[i];s3.length++;} }//求集合的交集 void intersection(Set s1,Set s2,Set &s3) { int i;s3.length=0;for (i=0;i<s1.length;i++) //將s1中出現(xiàn)在s2中的元素復制到s3中if (inset(s2,s1.data[i])){ s3.data[s3.length]=s1.data[i];s3.length++;} }

    6.2 算法描述―輸出型參數(shù)

    返回值 函數(shù)名(輸入?yún)?shù), 輸出參數(shù)) //輸出參數(shù) --> 采用引用類型參數(shù) {//實現(xiàn)代碼; } #mermaid-svg-hilVTTRxl2YwWIPu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hilVTTRxl2YwWIPu .error-icon{fill:#552222;}#mermaid-svg-hilVTTRxl2YwWIPu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hilVTTRxl2YwWIPu .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hilVTTRxl2YwWIPu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hilVTTRxl2YwWIPu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hilVTTRxl2YwWIPu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hilVTTRxl2YwWIPu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hilVTTRxl2YwWIPu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hilVTTRxl2YwWIPu .marker.cross{stroke:#333333;}#mermaid-svg-hilVTTRxl2YwWIPu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hilVTTRxl2YwWIPu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hilVTTRxl2YwWIPu .cluster-label text{fill:#333;}#mermaid-svg-hilVTTRxl2YwWIPu .cluster-label span{color:#333;}#mermaid-svg-hilVTTRxl2YwWIPu .label text,#mermaid-svg-hilVTTRxl2YwWIPu span{fill:#333;color:#333;}#mermaid-svg-hilVTTRxl2YwWIPu .node rect,#mermaid-svg-hilVTTRxl2YwWIPu .node circle,#mermaid-svg-hilVTTRxl2YwWIPu .node ellipse,#mermaid-svg-hilVTTRxl2YwWIPu .node polygon,#mermaid-svg-hilVTTRxl2YwWIPu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hilVTTRxl2YwWIPu .node .label{text-align:center;}#mermaid-svg-hilVTTRxl2YwWIPu .node.clickable{cursor:pointer;}#mermaid-svg-hilVTTRxl2YwWIPu .arrowheadPath{fill:#333333;}#mermaid-svg-hilVTTRxl2YwWIPu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hilVTTRxl2YwWIPu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hilVTTRxl2YwWIPu .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-hilVTTRxl2YwWIPu .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-hilVTTRxl2YwWIPu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hilVTTRxl2YwWIPu .cluster text{fill:#333;}#mermaid-svg-hilVTTRxl2YwWIPu .cluster span{color:#333;}#mermaid-svg-hilVTTRxl2YwWIPu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hilVTTRxl2YwWIPu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}確定問題規(guī)模n找基本操作語句求基本操作的執(zhí)行次數(shù)T(n)用復雜度表示T(n)

    總結

    以上是生活随笔為你收集整理的数据结构与算法01:绪论【LEARN FROM 李春葆《数据结构教程》】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。