1. 程式人生 > >數據結構簡介和算法效率度量

數據結構簡介和算法效率度量

大小 代碼 無限 sha 策略 運行時 ecc 出現次數最多的數 判斷

一、數據結構簡介

1.數據的特點、概念和關系

1.1.數據的概念和特點

在計算機中,數據是指被程序操作的對象,用於描述客觀事物。
特點:可以輸入到計算機、可以被程序處理。

1.2.數據中的新概念

—數據元素:組成數據的基本單元
—數據項:一個數據元素有若幹數據項構成
—數據對象:性質相同的數據元素集合
實例分析:
[objc] view plain copy
struct student // 數據類型
{
int age;
charchar *name;
};
student s // 數據元素
student sArrsy[10]; // 數據對象
s.name = "Eric"; // 數據項

s.age = 23;

1.3.數據間的關系

數據結構指的是數據對象中數據元素之間的關系,數據之間不是獨立的,存在特定的關系(組合、線性、樹狀、圖...),即結構。
數據結構是相互間存在特定關系的數據的集合,分為邏輯結構和物理結構。

(1)、邏輯結構

技術分享圖片
集合結構:數據元素之間沒有特別的關系,僅同屬相同集合。
線性結構:數據元素間是一對一的關系
樹形結構:數據元素間存在一對多的層次關系
圖形結構:數據元素之間是多對多的關系

(2)、物理結構

物理結構是邏輯結構在計算機中存儲形式,分為順序存儲結構和鏈式存儲結構。
順序存儲結構將數據存儲在地址連續的存儲單元裏。
鏈式存儲結構將數據存儲在任意的存儲單元裏,通過保存地址的方式找到相關聯的數據元素。

技術分享圖片

二、算法簡介

算法是特定問題求解步驟的描述,是獨立存在的一種解決問題的方法和思想。

1、算法的特性

輸入:有0個或多個輸入
輸出:至少有1個或多個輸出
有窮性:算法在有限的步驟後應該自動結束而不會無限循環。
確定性:算法中的每個步驟都有確定的含義,不會出現二義性
可行性:算法的每一步都是可行的
正確性:算法對於合法數據能夠得到滿足要求的結果,能夠處理非法輸入,並得到合理的結果。
可讀性:算法要便於閱讀、理解和交流
健壯性:算法不應該得到莫名其妙的結果
性價比:利用最少的資源得到滿足要求的結果

2、算法效率的度量

效率評估是工程中算法最重要的附加特性。

(1)、事後統計法

比較不同算法對同一組輸入數據的運行處理時間。

缺點:
A、為了獲得不同算法的運行處理時間必須編寫相應程序
B、運行處理時間嚴重依賴硬件以及運行時環境
C、算法的測試數據選取困難

(2)、事前分析統計

依據統計的方法對算法效率進行評估
影響算法效率的主要因素:
A、算法采用的策略和方法
B、問題的輸入規模
C、編譯器產生的代碼
D、計算機的執行速度
算法效率的簡單估算:
技術分享圖片
技術分享圖片
技術分享圖片
三種求和算法的關鍵部分的操作數量分別為2n,n,1。隨著問題規模的增大,操作數量的差異會越來越大,效率差異也會越來越大。
技術分享圖片
不同算法操作數量的對比
算法操作數量對比的實例一:
技術分享圖片
n<=3時,算法B優於算法A。隨著n的規模增大,算法A優勢比較明顯。
算法操作數量對比的實例二:
技術分享圖片
n=1時,算法C與算法D效率相同。隨著n規模的增大,算法C優勢明顯優於算法D。
判斷算法的效率時,操作數量中的常數項和其他次階項常常可以忽略,只需要關註最高階項。

3、算法的復雜度

(1)算法的時間復雜度

算法時間復雜度是算法運行後對時間需求量的定性描述。
由於主要關註算法的效率問題,因此主要討論算法的時間復雜度。
O表示法
算法的效率嚴重依賴於操作(Operations)數量,操作數量的估算可以作為時間復雜度的估算,在判斷時首先關註操作數量的最高階項。
O(2)==>O(1)
O(3n+3)==> O(3n)==>O(n)
O(3n^2+n+4)==>O(n^2)
常見的時間復雜度:
技術分享圖片
練習題目:

(2)算法的空間復雜度

算法空間復雜度是算法運行後對空間需求量的定性描述。
通常使用S(n)表示算法的空間復雜度。使用時間復雜度的推導方法推導空間復雜度。
當算法所需的內存空間大小為常數時,算法的空間復雜度為S(1)。
通常情況下,算法的時間復雜度更受關註。可以通過增加額外空間降低時間復雜度。
算法是解決具體問題的步驟,數據結構是算法解決問題的載體。

4、算法實例

一個數組中存儲著1——1000的數字,每個數字可能出現多次或者不出現,找出出現次數最多的數字。
void search(int array[], int len)
{
  //總計可能出現1000種可能值
  int sp[1000] = {0};
  int max = 0;
  for(int i = 0; i < len; i++)
  {
      //遍歷數組,數組中某個數組出現一次增加統計1次
      sp[array[i] - 1]++;
  }
  for(int i = 0; i < 1000; i++)
  {
      if(max < sp[i])
      {
          max = sp[i];
      }
  }
  for(int i = 0; i< 1000; i++)
  {
      if(max == sp[i])
      {
          cout << "Number:" << i + 1 << endl;
          cout << "Count:" << max << endl;
      }
  }
}

使用空間換時間,算法的時間效率為O(n)。
參考自DT課程。

數據結構簡介和算法效率度量