演算法時間複雜度(如何快速記住算法複雜度)

演算法時間複雜度(如何快速記住算法複雜度)

演算法時間複雜度(如何快速記住算法複雜度)


資料來源: https://posts.careerengine.us/p/5d6a88dc9ce3d42369a18200




PS 一般標準 n^2


常見的六種時間複雜度與演算法 ( https://medium.com/appworks-school/%E5%88%9D%E5%AD%B8%E8%80%85%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-%E5%BE%9E%E6%99%82%E9%96%93%E8%A4%87%E9%9B%9C%E5%BA%A6%E8%AA%8D%E8%AD%98%E5%B8%B8%E8%A6%8B%E6%BC%94%E7%AE%97%E6%B3%95-%E4%B8%80-b46fece65ba5 )


O(1) = 陣列讀取


O(log n) = 二分搜尋


O(nlog n) = 合併排序


O(n) = 簡易搜尋(依序搜尋)


O(n^2) = 選擇排序 (氣泡排序)


O(2^n) = 費波那契數列


O(n^n) = fuck


O(n!) = ORZ

11 thoughts on “演算法時間複雜度(如何快速記住算法複雜度)

    1. JS code

      var swap = function(data, i, j){
      var tmp = data[i];
      data[i] = data[j];
      data[j] = tmp;
      };

      var bubbleSort = function(data){
      var flag = true;
      for(var i = 0; i < data.length – 1 && flag; i++){
      flag = false;
      for(var j = 0; j < data.length – i – 1; j++){
      if(data[j+1] < data[j]){
      swap(data, j+1, j);
      flag = true;
      }
      }
      }
      };

  1. 簡易搜尋
    依序比對搜尋
    雙層迴圈搜尋
    時間複雜度 O(n) 比 氣排 (氣泡排序) 好

  2. 簡易搜尋(依序搜尋) VS 二分搜尋 時間複雜度

    資料來源:https://mp.weixin.qq.com/s/rLXlvEAowJCAGu3TMvSvqw

    比二分查找更簡單的算法,我能想到的只有遍歷枚舉,說的直白些,就是寫for循環。

    我們通常需要在一個數組當中找一個數,這個時候我們可以寫一個for循環去挨個查找,這麼下來,時間複雜度就會是O(n)。

    如果我告訴你,這個數組是排序好的,這時我們就可以使用二分查找去找這個數。

    O(n) 和O(logn) 可能直接看表達式不夠形象,我舉個例子你就懂了,假設數組長度是4294967296,如果是O(n) 時間的話,最差情況下你需要去找4294967296次,如果是O(logn),最差情況下你只需要去找32 次。

  3. 實力不夠 設備來湊(自己寫演算法時間複雜度太高 ,那就把SQL 包裝成函數一部分 替代高複雜度部分) ~5W2H1R

    EX:[檢核購物車商品的配料選擇未符合的清單]

    //增加 AND (a.item_type='P' OR a.item_type='TP') AND a.del_flag='N'
    //刪除 AND a.parent_item_no=0//
    //增加 IFNULL(f.item_name,'') AS parent_name
    //增加 LEFT JOIN order_content_data f
    //--------------------------------------------//
    SELECT x.*
    FROM (
    SELECT a.order_no,IFNULL(f.item_name,'') AS parent_name,a.parent_item_no,a.item_no,a.item_sid AS product_sid,
    a.item_name AS product_name,
    d.SID AS condiment_group_sid,
    d.group_name,d.required_flag,d.max_count,d.min_count,
    IFNULL(SUM(e.item_count),0) AS select_count
    FROM order_content_data a
    JOIN product_condiment_relation b
    ON b.product_sid=a.item_sid
    JOIN condiment_data c
    ON c.SID=b.condiment_sid
    AND c.del_flag='N'
    JOIN condiment_group d
    ON d.SID=c.group_sid
    AND d.del_flag='N' AND d.required_flag='Y'
    LEFT JOIN order_content_data e
    ON e.order_no=a.order_no
    AND e.parent_item_no=a.item_no
    AND e.item_type='C'
    AND e.del_flag='N'
    AND e.item_sid=c.SID
    LEFT JOIN order_content_data f
    On f.order_no=a.order_no
    AND f.item_no=a.parent_item_no
    WHERE a.order_no='20251013-0001'
    AND (a.item_type='P' OR a.item_type='TP') AND a.del_flag='N'
    Group by a.order_no,a.item_no,d.SID
    ) x
    WHERE (x.select_count=0)
    OR (x.select_count > 0
    AND (
    (x.select_count < x.min_count) OR (x.select_count > x.max_count)
    )
    ) ORDER BY item_no,condiment_group_sid DESC

    1. C# 實際函數

      public bool CondimentCheckMin_Count(ref string strShowMsg,string strOrderNo="",string strItemNo="")//配料最少量檢查
      {
      //檢核購物車商品的配料選擇未符合的清單
      strShowMsg = "";
      bool blnResult = false;
      string OrderNo = (strOrderNo.Length > 0) ? strOrderNo : m_StrPosOrderNumber;

      string strSQLConditional = $"a.order_no='{OrderNo}' " + ((strItemNo.Length > 0) ?$"AND a.item_no='{strItemNo}'" :"");
      string SQL = @"SELECT x.*
      FROM (
      SELECT a.order_no,IFNULL(f.item_name,'') AS parent_name,a.parent_item_no,a.item_no,a.item_sid AS product_sid,
      a.item_name AS product_name,
      d.SID AS condiment_group_sid,
      d.group_name,d.required_flag,d.max_count,d.min_count,
      IFNULL(SUM(e.item_count),0) AS select_count
      FROM order_content_data a
      JOIN product_condiment_relation b
      ON b.product_sid=a.item_sid
      JOIN condiment_data c
      ON c.SID=b.condiment_sid
      AND c.del_flag='N'
      JOIN condiment_group d
      ON d.SID=c.group_sid
      AND d.del_flag='N' AND d.required_flag='Y'
      LEFT JOIN order_content_data e
      ON e.order_no=a.order_no
      AND e.parent_item_no=a.item_no
      AND e.item_type='C'
      AND e.del_flag='N'
      AND e.item_sid=c.SID
      LEFT JOIN order_content_data f
      On f.order_no=a.order_no
      AND f.item_no=a.parent_item_no
      WHERE " + strSQLConditional +
      @" AND (a.item_type='P' OR a.item_type='TP') AND a.del_flag='N'
      Group by a.order_no,a.item_no,d.SID
      ) x
      WHERE (x.select_count=0)
      OR (x.select_count > 0
      AND (
      (x.select_count x.max_count)
      )
      ) ORDER BY item_no,condiment_group_sid DESC";
      DataTable DTBuf= SQLDataTableModel.GetDataTable(SQL);

      if(DTBuf!=null && DTBuf.Rows.Count > 0 )
      {
      blnResult = true;
      strShowMsg = "";
      for (int i = 0; i 0)?$"套餐「{strParentName}」下":"";
      strContent+= DTBuf.Rows[i]["product_name"].ToString();
      if ((count < min) && (count max)
      {
      strContent += $"的「{DTBuf.Rows[i]["group_name"].ToString()}」超過選取範圍: {min} ~ {max} 設定";
      }
      else
      {
      strContent = "";
      }

      if(strContent.Length>0)
      {
      if (strShowMsg.Length == 0)
      {
      strShowMsg = strContent;
      }
      else
      {
      strShowMsg += "\n" + strContent;
      }
      }
      }
      }

      if (strShowMsg.Length == 0)
      {
      blnResult = false;
      }
      else
      {
      strShowMsg += "\n您還要繼續執行結帳嗎?";
      }

      return blnResult;
      }

jash.liao@qq.com 發表迴響 取消回覆

你的電子郵件位址並不會被公開。 必要欄位標記為 *