面試篇之數據結構與算法概述

01.數據結構與算法概述

本節內容概要算法

  1. 數據結構及算法概念以及用途
  2. 數據結構分類
  3. 算法的5大特徵
  4. 算法的時間複雜度與空間複雜度

1.一、概念

1). 數據結構是一門研究數據組織方式的學科,能夠幫助咱們寫出高效優雅的代碼。選擇適當的數據結構能夠提升程序的執行效率(時間複雜度)和存儲效率(空間複雜度)

2). 算法是用來操做數據的一種方法,解決某個問題的計算方法、步驟。數據結構是爲算法服務的,算法要做用在特定的數據結構之上程序=數據結構+算法數組

weixin sousuo guanzhu "SpringForAll社區" ,學習更多!!!數據結構

1.二、數據結構分類

img

1).線性結構: 簡單的先後關係: 數組、鏈表、隊列和棧

2).樹結構:普通樹、二叉樹函數

3).圖結構:學習

和非線性結構spa

  • 線性結構:一對一的關係3d

    1) 線性結構做爲最經常使用的數據結構,其特色是數據元素之間存在一對一的線性關係
    2) 線性結構有兩種不一樣的存儲結構,即順序存儲結構(數組)和鏈式存儲結構(鏈表)。順序存儲的線性表稱爲順序表,順序表中的存儲元素是連續的
    3)  鏈式存儲的線性表稱爲鏈表,鏈表中的存儲元素不必定是連續的,元素節點中存放數據元素以及相鄰元素的地址信息
    4) 線性結構常見的有:數組、鏈表、隊列和棧
  • 樹結構:一對多的關係
    • 普通樹、二叉樹img
  • 圖:適合存儲多對多的關係img

1.三、 算法的五大特徵

    1. 有窮性:一個算法必須保證能夠結束,也即經歷一些有限步會結束
    1. 肯定性:算法的每一個步驟都應該被精肯定義,即一樣的輸入,輸出的結果也同樣
    1. 輸入 :即參數,算法能夠有0或者多個輸入,便可以有0或者多個參數
    1. 輸出 :算法必須有輸出,即有0或者多個輸出
    1. 可行性: 算法的每一步都是可行的,便可以實現的

1.三、時間複雜度與空間複雜度

時間複雜度:是一個 函數 ,它用來描述該算法的運行時間。一般用O()函數來表示算法的變化趨勢

1.3.一、如何計算時間複雜度

咱們在分析一個算法、一段代碼的時間複雜度的時候,也只關注循環執行次數最多的那一段代碼就能夠了code

    1. 總複雜度=複雜度最高的那段代碼的複雜度,以下
    int cal(int n) {
       int sum_1 = 0;
       int p = 1;
    //時間複雜度 O(n)
       for (; p < 100; ++p) {
         sum_1 = sum_1 + p;
       }
    
       int sum_2 = 0;
       int q = 1;
    //O(n)
       for (; q < n; ++q) {
         sum_2 = sum_2 + q;
       }
     
       int sum_3 = 0;
       int i = 1;
       int j = 1;
    //O(n^2)
    for (; i <= n; ++i) {
         j = 1;
         for (; j <= n; ++j) {
           sum_3 = sum_3 +  i * j;
         }
       }
     
       return sum_1 + sum_2 + sum_3;
     }

    以上代碼的時間複雜度按照最多的blog

    O(n^2)隊列

    1. 只關注執行次數最多的一段代碼,以下
    public int cal(int n) {
        int sum = 0;
        int I = 1;
        for (; I <= n; ++i) {
            sum = sum + I;
        }
        return sum;
    }

    咱們只關注執行次數最多的for循環,執行了n次,所以這段代碼的時間複雜度爲

    O(n)

    • 4.平均時間複雜度:由於最好和最壞狀況不同,因此會出現一個平均時間複雜度,如
    1. 乘法法則: 嵌套代碼時間複雜度 = 內外嵌套代碼時間複雜度的乘積
    // O(n)
    int cal(int n) {
       int ret = 0;
       int i = 1;
       for (; i < n; ++i) {
         ret = ret + f(i);
       }
     }
     //O(n)
     int f(int n) {
      int sum = 0;
      int i = 1;
      for (; i < n; ++i) {
        sum = sum + i;
      }
      return sum;
     }

    上面代碼的時間複雜度 = O(n) * O(n) = O(n^2)

    要查找的變量 x 在數組中的位置,有 n+1 種狀況:在數組的 0~n-1 位置中和不在數組中,

    img

1.3.二、時間複雜度分類

img

時間複雜度耗時:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)
本文由博客一文多發平臺 OpenWrite 發佈!
相關文章
相關標籤/搜索