數據結構與算法基礎

前言

數據結構:是指相互之間存在一種或多種特定關係的數據元素的集合用計算機存儲、組織數據的方式。數據結構分別爲邏輯結構、(存儲)物理結構和數據的運算三個部分。算法

1.1. 概念術語

  • 數據(Data)是能被計算機處理的符號或符號集合
  • 數據元素(data element)是數據的基本單位
  • 數據項(data item)組成數據元素的最小單位
  • 數據對象(data object)是性質相同的數據元素的集合,是數據的一個子集
  • 數據結構(data structure)是數據的組織形式,數據元素之間存在的一種或多種特定關係的數據元素集合
  • 數據類型(data type)是按照數據值的不一樣進行劃分的可操做性。在C語言中還能夠分爲原子類型和結構類型。原字類型是不能夠再分解的基本類型,包括整型、實型、字符型等。結構類型是由若干個類型組合而成,是能夠再分解的

1.2. 邏輯結構

  • 集合結構:集合的數據元素沒有其餘關係,僅僅是由於他們擠在一個被稱做「集合」的盒子裏。
  • 線性結構:線性的數據元素結構關係是一對一的,而且是一種前後的次序
  • 樹形結構:樹形的數據元素結構關係是一對多的
  • 圖形結構:圖的數據元素結構關係是多對多的 ##1.3. 數據存儲結構

存儲結構(storage structure)也稱爲物理結構(physical structure),指的是數據的邏輯結構在計算機中的存儲形式。數據的存儲結構通常能夠反映數據元素之間的邏輯關係編程

  • 順序存儲結構:是把數據元素存放在一組存儲地址連續的存儲單元裏,其數據元素間的邏輯關係和物理關係是一致的
  • 鏈式存儲結構:是把數據元素存放在任意的存儲單元裏,這組存儲單元能夠是連續的,也能夠是不連續的,數據元素的存儲關係並不能反映其邏輯關係,所以須要藉助指針來表示數據元素之間的邏輯關係

總結 邏輯結構是面向問題的,而物理結構就是面向計算機的. 其基本的目標就是將數據以及邏輯關係存儲到計算機的內存中.數組

1.4. 抽象數據類型

1.4.1 數據類型

數據類型: 是指一組性質相同值的集合以及定義在此集合的一些操做的總稱。在C語言中,按照取值不一樣,數據類型能夠分爲2類:markdown

  • 原子類型: 是不能夠在分解的基本數據類型,包含整型,浮點型,字符型等;
  • 結構類型: 由若干類型組合而成,是能夠再分解的.例如,整型數組就是由若干整型數據組成的.

1.4.2 抽象數據類型

抽象數據類型(abstract data type,ADT)是描述具備某種邏輯關係的數據模型,並對在數學模型上進行的一組操做。抽象數據類型描述的是一組邏輯上的特性,與在計算機內部表示無關,計算機中的整數數據類型是一個抽象數據類型,不一樣處理器可能實現方法不一樣,但其邏輯特性相同,即加、減、乘、除等運算是一致的。「抽象」的意思是數據類型的數學抽象特性而不是指它們的實現方法。抽象數據類型體現了程序設計中的問題分解、抽象、信息隱藏等特性,能夠把現實中的大問題分解爲多個規模小且容易處理的小問題,而後創建起一個能被計算機處理的數據,並把每一個功能模塊的實現細節做爲一個獨立的單元,從而使具體實現過程隱藏起來。就相似建一棟房子,分紅若干個小任務,如地皮規劃、圖紙設計、施工、裝修等,整個過程與抽象數據類型中的問題分解相似。而搬磚人不須要了解圖紙設計如何,設計圖紙人員不須要了解施工的地基、砌牆的具體細節,裝修工人不用關係圖紙和搬磚過程,這就是抽象類型中的信息隱藏。 抽象數據類型的概念可能讓初學者不太容易理解。例如線性表的抽象數據類型的描述數據對象集合:線性表的數據對象集合爲{a1,a2,a3,····,an},每一個元素的類型均爲DataType。其中,除了第一個元素a1外,每個元素有且只有一個直接前驅元素;除了最後一個元素an外,每個元素有且只有一個直接後繼元素。數據元素之間的關係是一對一的。數據結構

1.5算法

算法(algorithm)是解決特定問題求解步驟的描述,在計算機中表現爲有限的操做序列。在數據類型創建起來以後,就要對這些數據類型進行操做,創建起運算的集合即程序。運算的創建、方法好壞直接決定着計算機程序原型效率的高低。數據結構和算法

1.5.1. 數據結構和算法的關係

二者基友聯繫又有區別。聯繫是程序=算法+數據結構。數據結構是算法實現的基礎,算法老是要依賴某種數據結構來實現的。算法的操做對象是數據結構。區別是數據結構關注的是數據的邏輯結構、存儲結構有一集基本操做,而算法更多的是關注如何在數據結構的基本上解決實際問題。算法是編程思想,數據結構則是這些思想的基礎。函數

1.5.2. 特性

  • 輸入
  • 輸出
  • 有窮性: 指的是算法在執行有限的步驟以後,自動結束而不會出現無限循環,且每個步驟在可接受的時間內完成.
  • 肯定性: 算法的每個步驟都具備肯定的含義,不能出現二義性; 算法在必定條件下,只有一條執行路徑,相同的輸入只能有惟一的輸出結果.
  • 可行性 ###1.5.3. 算法設計要求
  • 正確性
  • 可讀性
  • 健壯性
  • 時間效率高和存儲量低

1.6. 時間複雜度

時間複雜度,又稱時間複雜性,算法的時間複雜度是一個函數,它定性描述該算法的運行時間。時間複雜度經常使用大O符號表述。性能

爲了更好地描述時間複雜度有如下規定:spa

  • 全部的常數時間複雜度用1表示。
  • 只保留最高階的時間複雜度。
  • 去除最高階時間複雜度的係數。

算法的時間複雜度是衡量一個算法好壞的重要指標。通常狀況下,隨着規模n的增大,次數T(n)的增加較慢的算法爲最優算法。常見時間複雜度從小到大依次排列:設計

O(1) < O(logn) < O(n)< O(nlogn) < O(n²)<O(n³) < O(2^n) <O(n!) < O(n^n) ###常見的時間複雜度

  • 常數階
  • 線性階
  • 對數階
  • 平方階
  • 立方階
  • nlogn階
  • 指數階

1712e87e09c320a9.jpeg

時間複雜度描述的是算法的最壞狀況。

1.7 空間複雜度

空間複雜度(space complexity)做爲算法所需存儲空間的量度,記作S(n) = O (f(n))。其中,n爲問題的規模;f(n)爲語句關於n的所佔存儲空間的函數。 對於一個算法,全部的變量、指令、結果都須要存儲空間,另外在算法的執行過程當中,臨時變量和臨時結果也須要保留下來以便下一步計算,這些稱爲算法執行時的輔助空間。

空間複雜度主要定性描述算法所需的輔助空間。

對一個算法,其時間複雜度和空間複雜度每每會互相影響. 當追求一個較好的時間空間複雜度時,可能會致使佔用較多的存儲空間. 便可能會使用空間複雜度的性能變差.反之亦然. 不過,一般狀況下,鑑於運算空間較爲充足,人們都以算法時間空間複雜度做爲算法優先的衡量指標。

相關文章
相關標籤/搜索