數據結構基礎

數據結構基礎

是指相互之間存在一種或多種特定關係的數據元素的集合用計算機存儲、組織數據的方式。 算法

基本術語

  • 數據: 是能夠被自算計處理的符號或符號集合
  • 數據對象: 性質相同的數據元素的集合(相似於數組)
  • 數據元素: 組成數據的對象的基本單位
  • 數據項: 組成數據元素的最小單位
  • 數據元素之間不是獨立的,存在特定的關係。這些關係便是結構

數據類型: 是指⼀組性質相同值的集合以及定義在此集合的⼀些操做的總稱。

在C語⾔中,按照取值不一樣,數據類型能夠分爲2類:數組

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

邏輯結構:指在數據中數據元素之間的相互關係。分爲:線性結構和非線性結構

線性結構的的特色:

  • 存在惟⼀一的⼀一個被稱做」第⼀一個」的數據元素
  • 存在惟⼀一的⼀一個被稱做」最後⼀一個"的數據元素
  • 除了了第⼀一個以外,結構中的每一個數據元素均有⼀一個前驅
  • 除了了最後⼀一個以外,結構中的每一個數據元素都有⼀一個後繼

主要表現形容包括鏈表,數組,字典,棧,隊列,字符串,線性表,其中隊列,棧是特殊的線性結構(主要特殊在讀取方式)。markdown

非線性結構:

  • 集合結構、樹形結構、圖形結構
  • 集合結構: 元素之間沒有特殊的關係,只是屬於一個集合
  • 樹形結構: 一對多的關係,好比二叉樹,紅黑樹等
  • 圖形結構: 多對多的關係,如矩陣表等

物理結構:數據的邏輯結構在計算機中的存儲形式

  • 順序存儲結構: 數據元素存放在一組存儲地址連續的存儲單元裏,其數據元素間的邏輯關係和物理關係是一致的
  • 鏈式存儲結構: 數據元素存放在任意的存儲單元裏,這組存儲單元能夠是連續的,也能夠是不連續的

數據結構與算法關係

  • 什麼是算法?

算法就是解決特定問題求解步驟的描述,在計算機中表現爲指令的有限序列,冰球每一個指令表示一個或多個操做。數據結構

  • 算法特性

1.輸入輸出:必須有輸入和輸出結果
2.有窮性:算法能夠在有限次的執行下獲得結果而不是出現無限循環
3.肯定性:算法執行的每一步驟在必定條件下只有一條執行路徑,一個相同的輸入對應相同的一個輸出
4.可行性:算法每一步驟都必須可行,可以經過有限的執行次數完成函數

  • 算法設計要求

1.正確性:不能有語法錯誤
2.可讀性:正確合理註釋代碼
3.健壯性:異常判斷及相應提示,好比下標越界,輸入值符合標準等
4.時間效率高和儲存量低spa

  • 算法的效率度量包括:時間複雜度和空間複雜度

算法複雜度計算:大O表示法

  • 用常數1取代運行時間中全部常數 3->1 O(1)
  • 在修改運行次數函數中,只保留最高階項 n3+2n2+5 -> O(n^3)
  • 若是在最高階存在且不等於1,則去除這個項目相乘的常數 2n^3 -> n^3

常見的時間複雜度

常數階
/* 1. 常數階時間複雜度計算 O(1) */
//1+1+1 = 3 O(1)
void testSum1(int n){
    int sum = 0;                //執行1次
    sum = (1+n)*n/2;            //執行1次
    printf("testSum1:%d\n",sum);//執行1次
}
複製代碼
線性階
/*2.線性階*/
//x=x+1; 執行n次 O(n)
void add2(int x,int n){
    for (int i = 0; i < n; i++) {
        x = x+1;
    }
}
複製代碼
對數階
/*3.平方階*/
//x=x+1; 執行n*n次 ->O(n^2)
void add3(int x,int n){
    for (int i = 0; i< n; i++) {
        for (int j = 0; j < n ; j++) {
            x=x+1;
        }
    }
}
複製代碼
對數階
/*4.對數階*/
/*2的x次方等於n x = log2n ->O(logn)*/
void testA(int n){
    int count = 1;         //執行1次
    //n = 10
    while (count < n) {
        count = count * 2;
    }
}
複製代碼
立方階
/*5.立方階*/
void testB(int n){
    int sum = 1;                         //執行1次
    for (int i = 0; i < n; i++) {        //執行n次
        for (int j = 0 ; j < n; j++) {   //執行n*n次
            for (int k = 0; k < n; k++) {//執行n*n*n次
                sum = sum * 2;          //執行n*n*n次
            }
        }
    }
}
複製代碼

算法空間複雜度計算

在考量算法的空間複雜度,主要考慮算法執行時所須要的輔助空間設計

程序空間計算因素

  1. 寄存自己的指令
  2. 常數
  3. 變量
  4. 輸入
  5. 對數據進行操做的輔助空間
相關文章
相關標籤/搜索