學習數據結構--第一章:緒論

第一章:緒論

1.基本概念以及術語:

  • 數據:信息的載體,是 描述客觀事物 屬性的數、字符及所有能輸入到計算機中並被計算機程序識別和處理的 符號的集合
  • 數據對象:具有相同性質的數據元素的集合,是數據的個子集
  • 數據元素: 數據的基本單位 ,通常作爲個整體進行考慮和處理
  • 數據項:構成數據元素的不可分割的 最小單位

數據包含數據對象,數據元素構成數據對象。

所有人的身份信息就可以作爲數據對象,每一個人的身份信息就可以作爲數據元素,身份信息的姓名、編號就可以作爲數據項。

1.1數據

數據類型(集合+操作)

  • 原子類型:值集合+操作(int、char、float等)
  • 結構類型:結構的集合+操作(list、map、set等)
  • 抽象數據類型ADT:抽象數據類型抽象數據類型(ADT)是指一個數學模型以及定義在該模型上的一組操作。抽象數據類型的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關。通常用(數據對象、數據關係、基本操作集)這樣的三元組來表示抽象數據類型。

1.2結構

在這裏插入圖片描述
在任何問題中,數據元素都不是孤立存在的,而是在它們之間存在着某種關係,這種數據元素相互之間的關係稱爲結構(Structure)。數據結構是相互之間存在一種或多種特定關係的數據元素的集合。數據結構包括三方面的內容:邏輯結構、存儲結構和數據的運算。數據的邏輯結構和存儲結構是密不可分的兩個方面,一個算法的設計取決於所選定的邏輯結構,而算法的實現依賴於所採用的存儲結構。

1.3數據結構

數據結構 是相互之間存在一種或多種特定 關係數據元素 的集合。

1.4數據結構三要素

  • 邏輯結構
  • 物理結構(存儲結構)
  • 數據的運算

1.5邏輯結構

邏輯結構是指數據元素之間的邏輯關係即從邏輯關係上描述數據。它與數據的存儲無關,是獨立於計算機的。
數據的邏輯結構分爲線性結構非線性結構

在這裏插入圖片描述

  • 集合 結構中的數據元素之間除了“同屬於一個集合”的關係外,別無其他關係。類似於數學上的集合
  • 線性結構 結構中的數據元素之間只存在一對一的關係。比如排隊
  • 樹形結構 結構中的數據元素之間存在一對多的關係。比如家族族譜
  • 圖狀結構或網狀結構 結構中的數據元素之間存在多對多的關係。比如地圖

1.6物理結構(存儲結構)

存儲結構是指數據結構在計算機中的表示(又稱映像),也稱物理結構。它包括數據元素的表示和關係的表示。數據的存儲結構是邏輯結構用計算機語言的實現,它依賴於計算機語言。數據的存儲結構主要有:順序存儲、鏈式存儲、索引存儲和散列存儲
在這裏插入圖片描述

  • 順序存儲:存儲的物理位置相鄰。(ps.理位置即信息在計算機中的位置。)
  • 鏈接存儲:存儲的物理位置未必相鄰,通過記錄相鄰元素的物理位置來找到相鄰元素。
  • 索引存儲:類似於目錄,通過索引查詢。
  • 散列存儲:通過關鍵字直接計算出元素的物理地址(以後詳解)

順序存儲:存儲的物理位置相鄰。
加粗樣式
鏈接存儲:存儲的物理位置未必相鄰
在這裏插入圖片描述

1.7數據的運算

運算包括運算的 定義實現 ,運算的定義針對 邏輯結構,運算的實現針對 物理結構

示例:以人爲例,假設有一個運算是計算人的顏值。
顏值=五官的漂亮程度之和(運算的定義針對邏輯結構)
通過計算機讀取每個人五官的信息,然後相加得到顏值。(運算的實現針對物理結構)

在這裏插入圖片描述

2.算法&算法評價

2.1算法

算法: 對特定問題求解的一種描述,它是指令的有限序列,其中的每條指令表示一個或多個操作。

2.2算法特性

  • 有窮性:一個算法必須在執行有窮步後結束,並且每步操作都在有窮時間內完成。
  • 可行性:一個算法必須是可行的,算法中描述的操作是可以實現的。
  • 確定性:算法中每一條指令、每一條語句都必須有確定的含義,同樣的輸入,必須要得到同樣的輸出。
  • 輸入:一個算法必須要有零個或者多個輸入。
  • 輸出:一個算法必須要有零個或者多個輸出。

在這裏插入圖片描述

2.2算法 VS 程序

算法(指導者):解決問題的一箇中方法或者過程,考慮如何將輸入轉換成輸出,一個問題可以有很多個算法。

程序(實施者):程序是某中設計語言對算法的具體實現。

有窮性:算法必須是有窮的,程序可以是無窮的。

正確性:算法必須是正確的,程序可以是錯誤的。

描述方法:算法可以用僞代碼、程序語言等描述,程序只能用程序語言編寫並可以運行。

2.3算法效率的度量

在這裏插入圖片描述
時間複雜度:

  • 它用來衡量算法隨着問題規模增大,算法執行時間增長的快慢。·
  • 時間複雜度是問題規模的函數:記作T(n),時間複雜度主要分析T(n)的數量級
  • T(n)=O(f(n)),大O記法,f(n)是算法中基本運算的頻度,一般我們考慮最壞情況下的時間複雜度。

計算方法:取算法時間增長最快的那個函數項,把它的係數改爲1

基本運算頻度:最深層循環所執行的時間複雜度。

常見時間複雜度
在這裏插入圖片描述

O(1)<O(log~2~^n^)<O(n)<O(nlog~2~^n^)<O(n^2^)<O(n^3^)<O(2^n^)<O(n!)<O(n^n^)

空間複雜度:

  • 它用來衡量算法隨着問題規模增大,算法所需空間的增長的快慢:
  • 是問題規模的函數:S(n)=0(g(n))

在這裏插入圖片描述

2.4時間複雜度

複雜度如何計算

int sum=0;  //執行1次
for(inti=0;i<=n;i++){  //int i=0執行一次,i<n執行n+1次,i++執行n+1次
    sum=sum+i;
}

時間分析:該算法執行了3n+6個語句。
假設每個語句執行時間一致,均爲常數t。則總時間t=(3n+6)*t
隨着問題規模n的增大,總時間的增長率與n的增長率一致,所以複雜度爲O(n)
結論:

  • 複雜度是關於增長率的,所以可以直接忽視常數項,係數化爲1
  • 一般可以直接關注循環段基本操作語句(示例中的sum=sum+i)的執行次數

時間複雜度計算(單個循環體)
直接關注循環體的執行次數,設爲k

在這裏插入圖片描述
時間複雜度計算(多個循環體)
兩個運算規則:乘法規則,加法規則

在這裏插入圖片描述

2.5空間複雜度

空間複雜度S(n)指算法運行過程中所使用的輔助空間的大小,記爲:S(n)=(f(n))

  • 輔助空間:除了存儲算法本身的指令、常數、變量和輸入數據外,還需要存儲對數據操作的存儲單元。
  • 算法原地工作是指算法所需的輔助空間是常量,即O(1)。
  • 常見的是O(1),O(n)較多

歡迎關注公衆號 理木客 更多精彩等你發現

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