數據結構,演算法宏觀印象構建

  • 2019 年 10 月 12 日
  • 筆記

前言

這篇文章主要是鳥瞰數據結構和演算法,不涉及到具體的細節。

闡述邏輯通過黃金思維圈中的是什麼,為什麼展開。

內容包括:

  • 什麼是數據結構

  • 為什麼需要需要數據結構

  • 數據結構分類

  • 什麼是演算法
  • 為什麼需要演算法
  • 演算法的衡量標準

關於數據結構

什麼是數據結構?

  • 邏輯結構:描述數據之間的關係
  • 物理結構:描述數據存儲的方式

為什麼需要數據結構?

以有效的方式處理數據,主要體現在存儲和檢索方面。

數據結構的分類

邏輯結構

1,集合結構

例如一個集合中包含橘子,蘋果和香蕉。

集合具有三大特性:

  • 唯一性
  • 互斥性
  • 無序性

2,線性結構

元素存在一對一的相互關係

3,樹形結構

元素存在一對多的相互關係

4,圖形結構

元素存在多對多的相互關係

物理結構

順序存儲

邏輯上相鄰的節點物理上也相鄰【查詢效率高,插入刪除效率低】

鏈式存儲

邏輯上相鄰的節點物理上不一定相鄰【插入刪除效率高,查詢效率低】

索引存儲

除建立存儲結點資訊外,還建立附加的索引表來標識結點的地址。

用結點的索引號來確定結點存儲地址,其優點是檢索速度快,缺點是增加了附加的索引表,會佔用較多的存儲空間。

散列存儲

又稱hash存儲。由節點的關鍵碼值決定節點的存儲地址。

散列是數組存儲方式的一種發展,相比數組,散列的數據訪問速度要高於數組,因為可以依據存儲數據的部分內容找到數據在數組中的存儲位置,進而能夠快速實現數據的訪問,理想的散列訪問速度是非常迅速的。散列存儲的時間複雜度為O(1),數組為O(n)。

線性結構 VS 非線性結構

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

  • 數組
  • 鏈表
  • 堆棧
  • 隊列

非線性結構:元素之間存在一對多,多對多的關係


關於演算法

什麼是演算法?

來自搜狗百科:

演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間複雜度時間複雜度來衡量。

簡單來說,演算法就是解決問題的方式,而時間複雜度和空間複雜度可以衡量演算法的性能。

【舉個栗子】

假設你要從上海到北京,那麼怎麼去就是一個待解決的問題。

提出兩種方案,乘火車,坐飛機。這兩種方式就是來解決去北京的問題的,可以理解為演算法。

但是火車和飛機是有區別的,乘火車價格更低,但耗時長,乘飛機耗時短,但價格貴。

價格和時間可以類比演算法的時間複雜度(演算法完成需要多久),空間複雜度(完成演算法需要多大記憶體空間)。

為什麼需要演算法?

演算法和設計模式類似,屬於經驗之談,是經前人們應用後總結的一種解決問題的方式。

而在經過大範圍的應用和普及之後,就會變成一種標準。

而經驗的作用就是用來學習,應用,改進的。

開源的時代,有種思想叫別造輪子。就好像愛迪生髮明了電燈,後人並不會去把發明的過程花幾十年重複一遍,而是去學習原理,在此基礎上進行改進,擴展應用,鎢絲燈到現在色彩斑斕的燈就是很好的例子。

對於演算法來說,同樣如此。如果不是專門研究演算法的工程師,對於演算法領域更多的是使用,而不是創造。

演算法的衡量標準

  • 時間複雜度:演算法運行到完成需要的時間

    時間複雜度是一個漸進值,

    x=1;y=2;  //執行兩次    for(int i =0 ;i<n ;i++)  {    x++;                //執行n次  }    for(int i =0 ;i<n ;i++)  {    for(int j =0;j<m;j++)    {        y++;       //    執行n的方次    }  }

程式總共執行的次數為:n2+n+2,取漸進值

時間複雜度T(n)=O(n2)

  • 空間複雜度:演算法執行過程中需要的記憶體空間大小