算法復雜度分析(下)

前一篇文章算法復雜度分析(上)講述了復雜度的大 O 表示法和幾個分析原則,這篇文章我們來講講另外幾種復雜度,最好情況時間復雜度(best case time complexity)、最壞情況時間復雜度(worst case time complexity)、平均時間復雜度(average case time complexity)和均攤時間復雜度(amortized time complexity)。

最好、最壞情況時間復雜度

顧名思義,這兩種時間復雜度指的是特殊情況下的時間復雜度。我們看下面的例子:

// n 表示數組 array 的長度
int find(int[] array, int n, int x) {int i = 0;int pos = -1;for (; i < n; ++i) {if (array[i] == x) {pos = i;break;}}return pos;
}
復制代碼

這段代碼實現的功能是,在數組 array 中尋找變量 x 第一次出現的位置,若沒有找到,則返回 -1;否則返回位置下標。

用上一篇文章的方法顯然是無法分析這段代碼的復雜度的。因為,不同情況下的時間復雜度是不同的。當數組中第一個元素就是要找的 x 時,時間復雜度是 O(1);而當最后一個元素才是 x 時,時間復雜度則是 O(n)。

為了表示代碼在不同情況下的時間復雜度,就需要引入三個概念:最好情況時間復雜度、最壞情況時間復雜度和平均情況時間復雜度。

其中,最好情況時間復雜度就是在最理想情況下執行代碼的時間復雜度,它的時間是最短的;最壞情況時間復雜度就是在最糟糕情況下執行代碼的時間復雜度,它的時間是最長的。

平均情況時間復雜度

最好、最壞時間復雜度反應的是極端條件下的復雜度,發生的概率不大,不能代表平均水平。那么為了更好的表示平均情況下的算法復雜度,就需要引入平均時間復雜度。

繼續用前面 find 函數為例,假設變量 x 在和不在數組 array 中的概率分別為 1 / 2;當存在于數組中時,在每個位置的概率均等,為 1 / n。那么,平均情況時間復雜度就可以用下面的方式計算:

((1 + 2 + ... + n) / n + n) / 2 = (3n + 1) / 4

這個值就是概率論中的加權平均值,也叫期望值。所以平均情況時間復雜度也叫加權平均時間復雜度或期望時間復雜度。可見,find 函數的平均時間復雜度為 O(n)。

大多數情況下,不需要區分最好、最壞、平均情況時間復雜度,只用一個復雜度就可以滿足需求了。只有當同一塊代碼在不同情況下,時間復雜度有數量級上的區別時,才需要考慮這三種復雜度。

均攤時間復雜度

由上面我們可以知道,平均時間復雜度只有在某些特殊的時候才會用到。均攤時間復雜度的應用場景比它更為特殊。均攤時間復雜度是指,當大部分情況下時間復雜度都很低,只有個別情況下時間復雜度比較高時,并且這些操作之間存在著前后連貫的時序關系,這時候,可以將較高時間復雜度的操作耗時均攤至時間復雜度較低的操作上。這種分析方法叫做攤還分析法,得到的復雜度叫做均攤時間復雜度。

而且,在能夠應用均攤時間復雜度分析的場合,一般均攤時間復雜度就等于最好情況時間復雜度。

例如:

int[] array = new int(n);
int count = 0;void addLast (int val) {if (count == array.length) {int[] newArray = new int(2 * n);for (int i = 0; i < 2 * n; i++) {newArray[i] = array[i];}newArray[count] = val;array = newArray;} else {array[count] = val}count++;
}
復制代碼

這段代碼實現的功能是往數組的末尾增加一個元素,如果數組沒有滿,直接往后面插入元素;如果數組滿了,即 count == array.length,則將數組擴容一倍,然后再插入元素。

例如,數組長度為 n,則前 n 次調用 addLast() 復雜度都為 O(1);第 n + 1 次則需要先進行 n 次元素轉移操作,然后再進行 1 次插入操作,復雜度為 O(n)。而且很容易看出,O(1) 復雜度的操作和 O(n) 復雜度的操作出現頻率是有規律的,每 n 次 O(1) 操作后會跟隨一個 O(n) 操作。

那么,就可以將 O(n) 操作的復雜度均攤至每次 O(1) 操作中,均攤下來,這組操作的需要進行 (n + n * 1) / (n + 1) = 2n / (n + 1) 次操作,所以均攤復雜度為 O(1)。


本文首發自微信公眾號《代碼寫完了》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

免費分享一些.NET Core比較優秀的社區資料和微軟官方資料

這次小編所分享的這套筆記手冊&#xff0c;主要是分享一些.NET Core比較優秀的社區資料和微軟官方資料。已經把所有的重要知識點進行了完整的歸類和整理&#xff0c;可以讓大家更清晰和快速的學習.NET Core&#xff0c;不浪費任何多余的時間&#xff01;全網首發&#xff01;相…

python異或運算怎么算_小強學Python+OpenCV之-1.4.4掩膜mask及位運算(與、或、非、異或)...

問題引入在小強學PythonOpenCV之&#xff0d;1.4.2裁剪一節&#xff0c;我們使用的是numpy數組切片功能實現圖片區域的裁剪。那么&#xff0c;如果我們想要裁剪圖像中任意形狀的區域時&#xff0c;應該怎么辦呢&#xff1f;答案是&#xff0c;使用掩膜(masking)。但是這一節我們…

51 Nod 1670 打怪獸

1670 打怪獸lyk在玩一個叫做“打怪獸”的游戲。游戲的規則是這樣的。lyk一開始會有一個初始的能量值。每次遇到一個怪獸&#xff0c;若lyk的能量值>怪獸的能量值&#xff0c;那么怪獸將會被打敗&#xff0c;lyk的能量值增加1&#xff0c;否則lyk死亡&#xff0c;游戲結束。若…

QQ協議調試器 QQDebugger

QQ協議老變&#xff0c;為了分析協議&#xff0c;單用抓包工具還是不夠的&#xff0c;還是得需要很好的調試工具。在網上找了幾個調試工具&#xff0c;易用性均欠佳&#xff0c;不得已自己開發了一個 QQDebugger&#xff0c;不敢專美&#xff0c;特意發布出來。QQDebugger 在功…

PostgreSQL 10.1 手冊_部分 II. SQL 語言_第 5 章 數據定義_5.5. 修改表

5.5. 修改表 5.5.1. 增加列5.5.2. 移除列5.5.3. 增加約束5.5.4. 移除約束5.5.5. 更改列的默認值5.5.6. 修改列的數據類型5.5.7. 重命名列5.5.8. 重命名表當我們已經創建了一個表并意識到犯了一個錯誤或者應用需求發生改變時&#xff0c;我們可以移除表并重新創建它。但如果表中…

Uptime-Kuma 一個輕量的開源監控工具

點擊藍字 關注我們你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘記關注。今天給大家介紹一個開源的監控工具 Uptime Kuma, 主要用來監控 Web 以及網絡, 和 Prometheus 相比, 它是輕量的, Uptime Kuma 是基于…

怎么查看mysql正在運行的語句_MySQL如何查詢當前正在運行的SQL語句

通過status命令&#xff0c;查看Slow queries這一項&#xff0c;如果值長時間>0,說明有查詢執行時間過長以下為引用的內容&#xff1a;mysql> status;--------------mysql Ver 11.18 Distrib 3.23.58, for redhat-linux-gnu (i386)Connection id: 53Current database: (n…

SpringBoot實戰之SpringBoot自動配置原理

SpringBoot 自動配置主要通過 EnableAutoConfiguration, Conditional, EnableConfigurationProperties 或者 ConfigurationProperties 等幾個注解來進行自動配置完成的。EnableAutoConfiguration 開啟自動配置&#xff0c;主要作用就是調用 Spring-Core 包里的 loadFactoryName…

Install OpenCV-Python in Ubuntu

之前安裝python版opencv&#xff0c;需要下載whl文件&#xff0c;進行安裝&#xff0c;這是在window環境下的&#xff1a;安裝opencv_python,下載whl包安裝系統python下的opencv 今天發現一個簡單的方法。Install OpenCV-Python in UbuntuInstall package python-opencv with f…

如何健康地跑步?

最近某司高管跑步 28 公里后猝死&#xff0c;被各大媒體報道&#xff0c;每次這種悲劇發生&#xff0c;而且還跟跑步扯上關系&#xff0c;總是讓人心痛。通過報道了解到&#xff0c;這位高管酷愛跑馬拉松&#xff0c;身體素質和運動能力肯定是強于普通人的&#xff0c;但還是遭…

項目共享協調機制

API&#xff0c;協調前端與后端開發的連接點。 面臨幾個問題 1. API更新不及時&#xff0c;導致前端開發的接口沒有及時更新而出現各種問題。 2. 文檔描述得不準確 3. 沒有統一的標準。 我們可以使用swagger editor&#xff0c; swagger ui。第一是編輯器&#xff0c;第二個是展…

vs2008C1902程序數據庫管理不匹配

大清早打開vs2008,出現這么詭異的錯&#xff0c; 刪了一個dll的就好了。如圖

mysql user表 空_mysql 忘記密碼,重置密碼,mysql.user表為空的解決辦法

一、用戶表有用戶&#xff0c;直接修改密碼ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)修改mysql配置文件my.cnf&#xff1a;vim /etc/my.cnf在[mysqld]中添加skip-grant-tables重啟mysql服務&#xff0c;用空密碼直接登錄&#xff0c;查…

鏈式封裝與調用

var CheckObject function(){}; CheckObject.prototype function(){checkName:function(){// codereturn this;},checkEmail:function(){// code return this;},checkPassword:function(){// codereturn this;} } //使用 var Check new CheckObject() Check.checkName().che…

全新升級的AOP框架Dora.Interception[3]: 基于特性標注的攔截器注冊方式

在Dora.Interception中按照約定方式定義的攔截器可以采用多種方式注冊到目標方法上。本篇文章介紹最常用的基于“特性標注”的攔截器注冊方式&#xff0c;下一篇會介紹另一種基于&#xff08;Lambda&#xff09;表達式的注冊方式&#xff1a;全新升級的AOP框架Dora.Interceptio…

在慘遭勒索病毒攻擊之后,微軟呼吁重新制定“數字日內瓦公約”

基于美國安全局泄露文檔開發的病毒程序成為上周的主要新聞&#xff0c;該病毒導致全世界大量的Windows電腦癱瘓。WannaCry勒索病毒在150個國家有20萬個受害者&#xff0c;包括英國的醫院、西班牙的基礎設施部門和俄羅斯的內政部。Renault在受到攻擊之后關閉了幾家在法國境內的工…

【代碼審計】PHP代碼審計---基礎記錄

PHP偽協議 PHP偽協議事實上是其支持的協議與封裝協議&#xff0c;支持的種類有以下12種。 * file:// — 訪問本地文件系統 * http:// — 訪問 HTTP(s) 網址 * ftp:// — 訪問 FTP(s) URLs * php:// — 訪問各個輸入/輸出流&#xff08;I/O streams&#xff09; * zlib:// — 壓…

全新升級的AOP框架Dora.Interception[4]: 基于表達式的攔截器注冊

基于特性標注的攔截器注冊方式僅限于將攔截器應用到自己定義的類型上&#xff0c;對于第三方提供的類型就無能為力了。對于Dora.Interception來說&#xff0c;攔截器注冊本質上建立攔截器與一個或者多個目標方法之間的映射&#xff0c;所以最笨的方式就是利用反射的方式得到表示…

mysql8.0.12插件_MySQL8.0.12 安裝及配置

MySQL8.0.12 安裝及配置發布時間&#xff1a;2018-08-07 10:39,瀏覽次數&#xff1a;274, 標簽&#xff1a;MySQL一.安裝1.從網上下載MySQL8.0.12版本&#xff0c;下載地址&#xff1a;https://dev.mysql.com/downloads/mysql/2. 下載完成后解壓我解壓的路徑是&#xff1a;D:\J…

python模塊之hashlib

hashlib模塊實現了多種安全哈希和信息摘要算法的通用接口&#xff0c;包括FIPS中定義的SHA1, SHA224, SHA256, SHA384, SHA512以及RFC 1321中定義的MD5 注意點&#xff1a;1. adler32及crc32哈希由zlib模塊提供2. 某些算法已知存在哈希碰撞弱點 哈希算法 每個hash算法都有一個同…