【軟件設計師】通俗易懂的去了解算法的時間復雜度

?🐓?時間復雜度

常用排序的時間復雜度

時間頻度

算法需要花費的時間,和它語句執行的次數是成正比的,所以會把一個算法種語句執行次數稱為語句頻度和時間頻度、記作T(n)。

定義

時間復雜度就是找到一個無限接近時間頻度T(n)同數量級的函數,當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間復雜度

通俗一點就是找到一個和T(n)同一量級的函數F(n),寫作O(f(n)),一般在程序中我們會看最內層或者說其執行次數最多的代碼行。

時間復雜度計算

時間復雜度中O是受T(n)種n變化次數最多的那一項影響,比如:T(n) = n^3+n^2+n+23 那這個最大的影響項就是O( n^3)

常見的時間復雜度

階數

執行次數函數舉例非正式術語
12O(1)常數階
2n+3O(n)線性階
n^2+2n+1O(n^2)平方階
5log2n+20O(logn)/log2n對數階
2n+3nlog2n+19O(nlogn)nlogn階
n^3+n^2+3n+4O(n^3)立方階
2^nO(2^n)指數階

大小排序

消耗時間從小到大

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(nn)

?🐓?實例

常數階O(1)

沒有任何循環等復雜結構,時間復雜度就是O(1)常量階

代碼示例:

int a = 1; //O(1)
int b = 1; //O(1)
int t = a + b; //該行執行了O(1)次,故O(1)

對數階O(log?n)

在while循環里面,每次都將 i 乘以 2,乘完之后,i 距離 n 就越來越近了。假設循環x次之后,i 就大于 2 了,此時這個循環就退出了,也就是說 2 的 x 次方等于 n,那么 x = log2n也就是說當循環 log2n 次以后,這個代碼就結束了。因此這個代碼的時間復雜度為:O(log2n)?

代碼示例:

int i = 1;
while (i <= n){i = i * 2; //該行執行了O(log2n)次,故O(log2n)
}

線性階O(n)

for循環里面的代碼會執行n遍,因此它消耗的時間是隨著n的變化而變化的,因此這類代碼都可以用O(n)來表示它的時間復雜度。

代碼示例:

for (int i = 1; i <= n; i++) {System.out.println(1); //該行執行了O(n)次,故O(n)
}

線性對數階O(nlog?n)

線性對數階O(nlogN) 其實非常容易理解,將時間復雜度為O(logn)的代碼循環N遍的話,那么它的時間復雜度就是 n * O(logN),也就是了O(nlogN)。

代碼示例:

 for (int i = 1; i <= n; i++) { //該循環執行了n次int j = 1;while (j<=n){j = j * 2; //該行執行了O(nlog2n)次,故O(nlog2n)}}

平方階O(n2)

平方階O(n2) 就更容易理解了,就是兩層n的循環嵌套,如果把 O(n) 的代碼再嵌套循環一遍,它的時間復雜度就是 O(n2),這段代碼其實就是嵌套了2層n循環,它的時間復雜度就是 O(nn),即 O(n2) 如果將其中一層循環的n改成m,那它的時間復雜度就變成了 O(mn)。

代碼示例:

for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {System.out.println(1);//該行執行了O(n2)次,故O(n2)}
}

立方階O(n3)

立方階和平方階差不多,只是多了一層循環,一共有三層n循環,它的時間復雜度就是O(n*n)。

代碼示例:

for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {for (int k = 1; k <= n; k++) {System.out.println(1);//該行執行了O(n3)次,故O(n3)}}
}

n指數階O(2?)

很少遇見,盡量少,建議少些這種復雜度的代碼。

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

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

相關文章

小腦萎縮患者生活指南:守護你的每一步

親愛的讀者朋友們&#xff0c;今天我們要聊一聊一個特殊但非常重要的群體——小腦萎縮患者。在這個充滿挑戰的旅程中&#xff0c;我們將一起探索如何用愛和智慧為患者打造一個更加安全、舒適的生活環境。 小腦萎縮是指小腦細胞逐漸減少&#xff0c;導致小腦體積縮小的一種病癥…

全量知識系統問題及SmartChat給出的答復 之16 幣圈生態鏈和行為模式

Q.42 幣圈生態鏈和行為模式 我認為&#xff0c;上面和“幣”有關的一系列概念和技術&#xff0c;按設計模式的劃分 &#xff0c;整體應該都屬于行為模式&#xff0c;而且應該囊括行為模式的所有各個方面。 而行為又可以按照三種不同的導向&#xff08;以目的或用途為導向、過…

互聯網摸魚日報(2024-03-04)

互聯網摸魚日報(2024-03-04) 36氪新聞 Sora來了&#xff0c;你又焦慮了嗎&#xff1f; 最前線&#xff5c;安踏首家球鞋集合店落地北京三里屯 一位中國遙感科學家&#xff0c;決定“跨界”拯救瀕危動物野駱駝 | 最前線 本周雙碳大事&#xff1a;工信部等七部門發文推動制造…

mirthConnect忽略HTTPS SSL驗證

mirthConnect SSL忽略驗證 1、下載https網站證書 點擊不安全---->證書無效 2、查看mirth 秘鑰庫口令 在mirthConnect 的conf目錄下面keystore.storepass 3、導入證書到本地 在jdk的bin目錄下面執行 keytool -importcert -file "下載的網站證書路徑" -keysto…

LeetCode每日一題【c++版】- leetcode 225.用隊列實現棧

題目描述 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。int pop() 移除并返回棧頂元素…

Python中按指定數量分割列表字符串的方法

引言 處理列表數據時&#xff0c;有時我們需要將一個包含長字符串的列表分割成按照特定長度的小字符串的多個列表。這在文本處理、批量數據處理或者當我們需要將數據分塊進行并行處理時非常常見。Python作為一個強大的編程語言&#xff0c;提供了很多方便的方法來實現這一功能…

CV論文--2024.3.4

1、Deep Networks Always Grok and Here is Why 中文標題&#xff1a;深度網絡總是讓人摸不著頭腦&#xff0c;原因如下 簡介&#xff1a;本文探討了深度神經網絡&#xff08;DNN&#xff09;中一種稱為"延遲泛化"或"Grokking"的現象。在接近零的訓練誤差…

使用ssh密鑰提交、拉取代碼的介紹

網絡世界中的數據并不安全 網絡中無時無刻有大量的數據傳輸&#xff0c;傳輸過程中需要經過各種網絡設備和物理媒介你的數據可能會在傳輸的某一個環節被一個“中間人”攔截&#xff0c;造成泄密&#xff0c;甚至會篡改你的數據&#xff0c;讓你發出錯誤的信息 SSH 為 Secure …

MySQL 5.5、5.6、5.7的主從復制改進

主從復制面臨的問題 MySQL一直以來的主從復制都是被詬病,原因是: 1、主從復制效率低 早期mysql的復制是通過將binlog語句異步推送到從庫。從庫啟動一個IO線程將接收到的數據記錄到relaylog中;另外啟動一個SQL線程負責順序執行relaylog中的語句實現對數據的拷貝。 這里的…

如何用Elementor創建WordPress會員網站

在下面的文章中&#xff0c;我們將向您展示如何使用Elementor和MemberPress在WordPress中輕松構建會員網站。這篇文章將涵蓋WordPress會員網站設置過程、會員資格和受保護內容創建、重要頁面和登錄表單設計、電子郵件通知管理、報告等。 目錄 什么是WordPress會員網站&#x…

【go從入門到精通】go基本類型和運算符用法

大家好&#xff0c;這是我給大家準備的新的一期專欄&#xff0c;專門講golang&#xff0c;從入門到精通各種框架和中間件&#xff0c;工具類庫&#xff0c;希望對go有興趣的同學可以訂閱此專欄。 --------------------------------------------------------------------------…

與字體有關的CSS

隱藏多余字體 text-overflow: ellipsis &#xff08;多余文本顯示省略號&#xff09; 需要配合overflow使用 -webkit-box-orient: vertical; display: -webkit-box; -webkit-line-clamp: number &#xff08;超出多少行顯示省略號&#xff09; 強制顯示一行 whi…

.NET高級面試指南專題十四【 觀察者模式介紹,最常用的設計模式之一】

簡介&#xff1a; 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為型設計模式&#xff0c;其目的是定義了一種一對多的依賴關系&#xff0c;當一個對象的狀態發生變化時&#xff0c;所有依賴于它的對象都會得到通知并自動更新。 原理&#xff1a; 在觀察者模式中…

從零開始搭建web組態

成果展示&#xff1a;by組態[web組態插件] 一、技術選擇 目前只有兩種選擇&#xff0c;canvas和svg Canvas: 是一個基于像素的渲染引擎&#xff0c;使用JavaScript API在畫布上繪制圖像&#xff0c;它的優點包括&#xff1a; Canvas渲染速度快&#xff0c;適合處理大量圖像和…

TIOBE 2024榜單啟示:程序員如何把握未來編程趨勢與機遇

程序員如何選擇職業賽道&#xff1f; 程序員的職業賽道就像是一座迷宮&#xff0c;有前端的美麗花園&#xff0c;后端的黑暗洞穴&#xff0c;還有數據科學的神秘密室。你準備好探索這個充滿挑戰和機遇的迷宮了嗎&#xff1f;快來了解如何選擇職業賽道吧&#xff01; 方向一…

linux時間校準(ntpdate)

在Linux中&#xff0c;可以使用ntpdate命令來進行時間校準。 首先&#xff0c;打開終端并輸入以下命令安裝ntpdate工具 yum install ntpdate 然后&#xff0c;運行以下命令來同步系統的時間與網絡上的NTP服務器 ntpdate time.nist.gov 若要設置定期自動更新時間&#xff0c;可…

CSS中如何解決 1px 問題?

1px 問題指的是&#xff1a;在一些 Retina屏幕 的機型上&#xff0c;移動端頁面的 1px 會變得很粗&#xff0c;呈現出不止 1px 的效果。原因很簡單——CSS 中的 1px 并不能和移動設備上的 1px 劃等號。它們之間的比例關系有一個專門的屬性來描述&#xff1a; window.devicePix…

重構筆記系統:Docker Compose在微服務架構中的應用與優化

雖然我的筆記系統的開發是基于微服務的思想&#xff0c;但是在服務的配置和編排上感覺還是不太合理&#xff0c;具體來說&#xff0c;在開發上的配置和在生產上的配置差別太大。現在規模小&#xff0c;后面規模變大&#xff0c;估計這一塊會成為系統生長的瓶頸。 因此&#xff…

【Web】速談FastJson反序列化中BasicDataSource的利用

目錄 關于BCEL BCEL的惡意利用demo FastJson配合BCEL初始化任意類 parse情況下后天精心構造彌補先天之不足 exp 參考文章&#xff1a; BCEL ClassLoader去哪了 Java動態類加載&#xff0c;當FastJson遇到內網 關于BCEL BCEL(Byte Code Engineering Library)的全名是Apa…

跨時鐘信號處理方法

1. 背景 現在的芯片&#xff08;比如SOC&#xff0c;片上系統&#xff09;集成度和復雜度越來越高&#xff0c;通常一顆芯片上會有許多不同的信號工作在不同的時鐘頻率下。比如SOC芯片中的CPU通常會工作在一個頻率上&#xff0c;總線信號&#xff08;比如DRAM BUS&#xff09;會…