如何從最壞、平均、最好的情況分析複雜度?

来源:https://www.cnblogs.com/tong-yuan/archive/2020/07/22/13358458.html
-Advertisement-
Play Games

本篇文章收錄於專輯:http://dwz.win/HjK 前言 你好,我是彤哥,一個每天爬二十六層樓還不忘讀源碼的硬核男人。 上一節,我們從事後統計法過渡到漸近分析法,詳細講解瞭如何進行演算法的複雜度分析。 但是,如果遵循嚴格的漸近分析法,需要掌握大量數學知識,這無疑給我們評估演算法的優劣帶來了很大的挑 ...


file

本篇文章收錄於專輯:http://dwz.win/HjK

前言

你好,我是彤哥,一個每天爬二十六層樓還不忘讀源碼的硬核男人。

上一節,我們從事後統計法過渡到漸近分析法,詳細講解瞭如何進行演算法的複雜度分析。

但是,如果遵循嚴格的漸近分析法,需要掌握大量數學知識,這無疑給我們評估演算法的優劣帶來了很大的挑戰。

那麼,有沒有更好地評估演算法的方法呢?

答案是必然的,本節,我們就從最壞、平均、最好三種情況來分析分析複雜度。

案例

為了便於講解,我寫了一個小例子:

public class LinearSearch {
    public static void main(String[] args) {
        int[] array = new int[]{1, 8, 9, 3, 5, 6, 10, 13};
        int index = search(array, 10);
        System.out.println("index=" + index);
    }

    private static int search(int[] array, int value) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] == value) {
                return i;
            }
        }
        return -1;
    }
}

這個例子使用線性搜索從一個數組中查找一個元素,這個元素有可能存在,也有可能不存在於數組中。

最壞情況

在最壞情況下,要查找的元素不存在於數組中,此時,它的時間複雜度是多少呢?

很簡單,必然需要遍歷完所有元素才會發現要查找的元素不存在於數組中。

所以,最壞情況下,使用線性查找的時間複雜度為O(n)。

平均情況

在平均情況下,我們要照顧到每一個元素,此時,它的時間複雜度如何計算呢?

在上一節,我們已經講過計算方式了,不過,這裡考慮到有元素不存在於數組中,所以,是(n+1)種可能:

1*1/(n+1) + 2*/(n+1) + ... + n*1/(n+1) + (n+1)/(n+1) = 1/(n+1) * (n+1)(n+2)/2 = (n+2)/2

所以,在平均情況下,忽略掉常數項,使用線性查找的時間複雜度也是O(n)。

為什麼要忽略掉常數項?

當n趨向於無窮大的時候,常數項的意義不是很大,所以,可以忽略,比如(n+2)/2=n/2 + 1,n本身已經趨向於無窮大,加不加1有什麼意義呢,n的倍數是2還是1/2並不會有明顯的差別。

同樣地,低階項一般也會抹掉,比如2n^2 + 3n + 1,當n趨向於無窮大的時候,n^2的值是遠遠大於3n的,所以,不需要保留3n。

所以,計算複雜度時通常都會把常數項和低階項抹掉,只保留高階項。

最好情況

最好情況是什麼呢?

如果我們要查找的元素正好是數組的第一個元素,查找一次就找到了,這無疑是最好的情況。

所以,在最好情況下,使用線性查找的時間複雜度是O(1)。

小結

通過上面的分析,可以看到,最壞情況和最好情況是比較好評估的,而平均情況則比較難以計算。

但是,最好情況又不能代表大多數樣本,且平均情況與最壞情況在省略常數項的情況下往往是比較接近的。

所以,通常,我們使用最壞情況來評估演算法的時間複雜度,這也是比較簡單的一種評估方法,且往往也是比較準確的。

後記

本節,我們從最壞、平均、最好三種情況分析了線性查找的時間複雜度,經過詳細地分析,我們得出結論,通常使用最壞情況來評估演算法的時間複雜度。

請註意,我們這裡使用了“通常”,說明有些情況是不能使用最壞情況來評估演算法的時間複雜度的。

那麼,你知道什麼情況下不能使用最壞情況來評估演算法的時間複雜度嗎?

下一節,我們接著聊。

關註公眾號“彤哥讀源碼”,解鎖更多源碼、基礎、架構知識!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在不少電影電視劇中,主角的身邊都有這麼一位電腦高手:他們分分鐘可以黑進反派的網路,攻破安全防線,破解口令密碼,拿到重要文件。他們的電腦屏幕上都是一些看不懂的圖形和數字,你能看懂的就只有那個進度條,伴隨著緊張的BGM,慢慢的向100%靠近······ 上面的場景和套路是不是很眼熟? 影視作品中的黑客當 ...
  • 讓這兩個select相互綁定,讓roleOptions選取值後,worklist彈出得是roleOptions值 <el-select v-model="postForm.projectName" placeholder="請選擇" @change="getList(postForm)"> <el- ...
  • 前言 JS是前端的核心,但有些使用技巧你還不一定知道;本文梳理了JS的41個技巧,幫助大家提高JS的使用技巧;文章有點長,可以clone下源碼,直接擼,源碼地址請戳全部源碼,原創不易,歡迎star;序列文章:Vue 開發必須知道的 36 個技巧React 開發必須知道的 34 個技巧 Array 1 ...
  • 學Web前端要熟練哪些技能?怎樣才能順利求職?Web前端是公認的入門簡單、就業廣闊的行業之一,但隨著越來越多的人加入到前端行業,企業對相關人才的招聘門檻也在無形中被抬高。很多人想知道Web前端開發人才掌握什麼技術才能通過企業面試?接下來小編就給大家一一列舉。 分析各大招聘網站對Web前端人才的技能需 ...
  • 前面介紹了很多ABP系列的文章《ABP框架使用》,一步一步的把我們日常開發中涉及到的Web API服務構建、登錄日誌和操作審計日誌、字典管理模塊、省份城市的信息維護、許可權管理模塊中的組織機構、用戶、角色、許可權、菜單等內容,以及配置管理模塊,界面的高級查詢處理等內容,並根據我們在Winform領域多年... ...
  • 語義化 (1)優點: 使標簽有含義,結構更清晰 增強文檔可讀性,以便代碼維護 瀏覽器和網路爬蟲更好地解析內容 很好地進行搜索引擎優化 (2)新增常用結構標簽如下: header、nav、main、section、aside、article、footer、time、process、figure 表單控 ...
  • 移動端重置樣式 1、禁止用戶選中文字,安卓無效 ­webkit­user­select: none; 2、禁止長按彈出系統菜單。 ­webkit­touch­callout: none; 3、去除android下a/button/input標簽被點擊時產生的邊框 & 去除ios下a標簽被點擊時產生的 ...
  • 1. number, string, boolean(聲明方式加不加new的區別) var a = number( 1 ) 返回數字 1 var b = string( false ) 返回字元串 'false' var c = boolean( 1) 返回布爾值 true (5個false值: 0 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...