一 數據結構與算法入門

基本概念

  • 有哪些數據結構?

線性表,棧,隊列,串,數組,廣義表,樹,二叉樹,圖算法

重點是線性表,二叉樹數組

每種數據結構須要掌握,添加、更新、刪除、查詢、排序等操做的實現網絡

學習數據結構的四種境界:數據結構

境界1:聽懂理論,聽懂算法思路函數

境界2:完成主要數據結構基本算法的實現(理論+實踐,數據結構入門)性能

境界3:完成更多數據結構更多算法的實現學習

境界4:融會貫通,觸類旁通,在後續開發中綜合應用數據結構知識。優化

 

數據(data):  是描述客觀事物的數值、字符、以及能輸入及其且能被處理的各類符號集合。例如:數值、字符、聲音、圖像等等。

數據項(data item): 具備原子性,是不可分割的最小數據單位。如學生信息相關的性別。

數據元素(data Element): 數據的基本單位,一般由若干個數據項組成,在計算機程序中一般做爲一個總體來處理。如描述一名學生完整信息的數據記錄,包含學號、姓名等數據項。

數據對象(data Object): 性質相同的數據元素的集合,數據的子集。如一個學校全部學生的集合。

數據結構(data structure) :互相之間存在一種或多種關係的數據元素的結合,包括邏輯結構,存儲結構,數據的運算。

 

  • 數據結構(data structure):相互之間存在一種或多種特定關係的數據元素的集合。

一種是數據結構的邏輯層面,即數據的邏輯結構指針

一種是存在於計算機的物理層面,即數據的存儲結構對象

  • 數據結構=邏輯結構+存儲結構+在存儲結構上的運算/操做

 

  

 

  •  數據的邏輯結構:數據元素之間的邏輯關係(和實現無關)

線性結構:有且只有一個開始節點和終端結點,而且全部節點最多隻有一個直接前驅和直接後繼。

線性表是一個典型的線性結構。

 

  • 分類2:集合結構、線性結構、樹狀結構、網絡結構

邏輯結構有四種基本類型:集合結構、線性結構、樹狀結構、網絡結構。

表和樹是最經常使用的兩種高效數據結構。

集合結構:相似數學裏的集合。

  • 肯定性:集合中的元素必須是肯定的
  • 惟一性:集合中的元素互不相同,{1,a},那麼a不等於1
  • 無序性:集合中的元素不分前後,{1,2}和{2,1}算同一個集合

線性結構:數據元素之間存在一對一的線性關係的數據關係

樹狀結構:除了第一個元素之外每一個元素有且僅有一個直接前驅元素,可是能夠有多個後繼元素。一對多的關係。

網狀結構:每一個數據能夠有多個前驅、多個後繼。多對多的關係。   

 數據的存儲結構:順序存儲、鏈式存儲、索引存儲、散列存儲。數據元素自己之間的存儲和以及數據元素之間的關係表示,數據的邏輯在計算機中的表示。

順序存儲結構:一般藉助數組來實現。採用連續的存儲空間。把邏輯上相鄰的節點存儲在物理位置上相鄰的存儲單元中,結點之間的邏輯關係由存儲單元的鄰接關係來體現。

優勢:節省存儲空間。分配的存儲空間用來存儲結點的數據,結點之間的邏輯關係不佔用存儲空間。能夠實現對結點的隨機存取,一個結點對應一個序號,經過序號獲得存儲地址,查詢方便。

缺點:插入和刪除操做須要移動元素,效率低。

鏈式存儲結構:數據元素對應的是不連續的存儲空間,每一個存儲結點對應一個須要存儲的數據元素。

每一個結點有數據域和指針域組成,元素之間的邏輯關係經過存儲結點之間的連接關係反映出來。

特色:1 比順序存儲結構密度小。

          2 邏輯上相鄰的物理結點沒必要相鄰。

          3 插入、刪除靈活(沒必要移動結點,只須要改變其中的指針)。

          4 查詢慢

索引存儲結構:除創建存儲結點信息外,還創建附加索引表來標識結點的地址。主要面向查找操做,好比圖書的目錄。

散列存儲結構:根據結點的關鍵字經過散列函數計算出該結點的存儲地址。

 

數據的運算:

引用型運算:不改變數據結構中原有的數據元素的狀態,只根據須要讀取某些信息

加工型運算:改變數據結構中數據元素的狀態,如內容,個數

 

算法:

 

對特定問題求解步驟的一種描述,是指令的有限序列。其中每一條指令表示一個或多個操做。

 

算法的特色:

有窮性:一個算法必須在有限個步驟以後結束

肯定性:一個算法的每個步驟都有其確切的含義,相同的輸入必然有相同的輸出

可行性:算法中的每一步必須能夠經過基本運算的有限次執行實現

輸入:零個或多個,取決於特定的數據對象集合。

輸出:一個或多個,輸出與輸入之間存在某種特定的關係。

 

算法的要求:

正確:算法的執行結果知足預先規定的功能和性能要求

可讀:一個算法應當思路清晰,井井有條、簡單明瞭、易讀易懂,一個算法不只是讓機器來執行,也是讓人來讀的

健壯:當輸入不合法數據時,算法可以進行適當處理,而不會產生莫名其妙的輸出或者引發其餘的後果

高效:算法應當具有良好的時空性能

 

算法的性能分析:

時間複雜度:一個算法在計算機上轉換成程序並運行所須要的時間,由問題規模決定。

主要取決於如下因素:

  1. 硬件的速度:機器的指令性能和速度,通常來說64位機比32位機要快,主頻爲2GHZ高於主頻爲1GHZ
  2. 書寫程序的語言:語言級別越低,運行速度越快: 彙編  > C語言,C++  > Java 
  3. 編譯語言所生成的目標代碼的質量:對於代碼優化比較好的程序,其所生成的目標代碼的質量較高
  4. 問題的規模 : 通常來說,算法的時間複雜度是問題規模n的函數, T(n) = ∑(ti + ci ) , ti是一條語句須要的時間,ci是語句的頻度,即次數
  5. 若是沒有特別說明,通常是指最壞的時間複雜度

 

空間複雜度:算法運行從開始到結束須要的存儲量。

主要由如下構成:

  1. 固定部分:此部分與所處理數據的大小、個數等無關,主要包括程序代碼、常量、簡單變量、結構變量等決定。
  2. 可變部分:此部分與算法在某次執行中處理的特定數據的大小和規模有關。問題規模較大時,可變部分可能大於固定部分。因此通常討論算法的漸進空間複雜度。
相關文章
相關標籤/搜索