時間復雜度分析

復雜度分析的必要性:

當給我們一段代碼時,我們是以什么準則來判斷代碼效率的高低呢?每一段代碼都會消耗一段時間,或占據一段數據空間,那么自然是在實現相同功能的情況下,代碼所耗時間最少,所占據空間最小的代碼效率更優。所以對于所耗時間,我們采用時間復雜度進行分析,對于所占空間,我們采用空間復雜度進行分析。

時間復雜度:

在問題中,我們將題目中數據的頻數成為n。一個算法中的語句執行次數稱為語句頻度或時間頻度,記為T(n)。我們想要知道當n不斷變化時,T(n)的變化規律。若有某個輔助函數f(n),使得當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間復雜度,簡稱時間復雜度。

大O符號表示法的引入:

下面我們先來看這一段代碼:

1|for(i=1; i<=n; ++i)
2|{
3|  j = i;
4|  j++;
5|}

假設每行代碼的執行時間都是相同的,假設為1。

則第1行執行時間是1,第3行執行時間為n,第4行執行時間為n。所以有T(n) = (2n + 1),

有當n趨于無窮大時,+1, 與*2 的意義可以忽略。所以時間復雜度記為O(n)。

常見的時間復雜度量級:

常數階O(1)
對數階O(logN)
線性階O(n)
線性對數階O(nlogN)
平方階O(n2)
立方階O(n3)
K次方階O(nk)
指數階(2n)

復雜度從上到下越來越大,執行效率越來越低下

下面對一些復雜度舉例分析:

1,常數階——無論有多少行,其復雜度不隨n的變化而變化。

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

?2,線性階O(n):

如上文舉例所示。

3,對數階O(logN):

int i = 1;
while(i<n)
{i = i * 2;
}

while循環中,將i * 2,i變化的越來越快,離n也越來越近。假設循環x次后,i就大于2了;所以有

2的x次方等于n,所以x = log2^n,所以代碼的時間復雜度為O(logN);

4,線性對數階O(NlogN):

就是將線性階循環N次,便是線性對數階。

for(m=1; m<n; m++)
{i = 1;while(i<n){i = i * 2;}
}

5,k次方階:

就是k層循環嵌套。

經典算法的時間復雜度分析:

一般算法題或筆試題的時間限制為1s,或2s以內;故c++的操作次數一般控制在10^7 ~ 10^8為佳。

log(10^x)≈3*x。

調和級數的時間復雜度為O(logN);

分母只取質數的調和級數時間復雜度為O(loglogN);

而在不同數據范圍內,應該選擇怎樣的算法與時間復雜度:

· 當N <= 30, ——指數級別,dfs + 剪枝,狀壓DP;

· 當N <= 100, ——O(N^3) 或O(N^3 logN) floyd算法,或普通dp

· 當N <= 1000.——O(N^2) 或 O(N ^ 2 logN)? dp,? 二分

· 當N <= 10000 —— O(N *?\sqrt{N}),塊狀鏈表。

· 當N? <= 10^5——O(N logN),各種排序,線段樹,樹狀數組,set/map,heap,堆優化版Dijkstra,spfa,二分,求半平面交

· 當N <= 10^6 —— O(N)以及常數較小的O(NlogN)hash,單調隊列,雙指針,BFS,并查集,kmp,AC自動機。(常數較小的O(NlogN))sort、樹狀數組、heap、dijkstra、spfa

·當N ≤ 10^7——?O(n)雙指針掃描、kmp、AC自動機、線性篩素數

· 當N <= 10^9——O(\sqrt{N}) 判斷質數,試除法求質數,試除法求所有約數,試除法分解質因數

` 當N <= 10 ^ 18——O(logN)最大公約數,快速冪,數位DP

· 當n≤10^1000——O(logN * loglogN)k表示位數,高精度加減乘除
?

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

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

相關文章

L1-1、Prompt 是什么?為什么它能“控制 AI”?

*Prompt 入門 L1-1 想象一下&#xff0c;你只需輸入一句話&#xff0c;AI 就能自動為你寫一篇文案、生成一份報告、甚至規劃你的創業計劃。這種“對話即編程”的背后魔法&#xff0c;就是 Prompt 的力量。 &#x1f50d; 一、Prompt 的定義與由來 Prompt&#xff08;提示詞&am…

微信小程序文章管理系統開發實現

概述 在內容為王的互聯網時代&#xff0c;高效的文章管理系統成為各類平臺的剛需。幽絡源平臺今日分享一款基于SSM框架開發的微信小程序文章管理系統完整解決方案&#xff0c;該系統實現了多角色內容管理、智能分類、互動交流等功能。 主要內容 一、用戶端功能模塊 ??多角…

【Python-Day 5】Python 格式化輸出實戰:%、format()、f-string 對比與最佳實踐

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

R7周:糖尿病預測模型優化探索

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 一、數據預處理 1.設置GPU import torch.nn.functional as F import torch.nn as nn import torch, torchvisiondevice torch.device("cuda"…

使用Tortoise-ORM和FastAPI構建評論系統

title: 使用Tortoise-ORM和FastAPI構建評論系統 date: 2025/04/25 21:37:36 updated: 2025/04/25 21:37:36 author: cmdragon excerpt: 在models.py中定義了Comment模型,包含id、content、created_at、updated_at字段,并與User和Article模型建立外鍵關系。schemas.py中定義了…

【VS Code】如何使用SSH打開遠程服務器Docker上的項目或文件夾

要在VS Code中使用SSH打開遠程服務器Docker上的項目或文件夾&#xff0c;您需要結合使用VS Code的Remote - SSH擴展和Docker的遠程訪問功能。以下是詳細步驟&#xff1a; 安裝VS Code Remote - SSH擴展 打開VS Code。點擊左側活動欄的擴展圖標&#xff08;或使用快捷鍵CtrlShif…

NHANES指標推薦:PLP

文章題目&#xff1a;Association of pyridoxal 5-phosphate (PLP) with lipid profiles: a population-based cohort study DOI&#xff1a;10.3389/fnut.2025.1545301 中文標題&#xff1a;5-磷酸吡哆醛 (PLP) 與血脂譜的關系&#xff1a;一項基于人群的隊列研究 發表雜志&am…

MySQL 詳解之備份與恢復策略:數據安全的最后一道防線

在任何信息系統中,數據都是最寶貴的資產。數據的丟失可能源于多種原因:硬件故障、人為誤操作、軟件 Bug、惡意攻擊,甚至自然災害。一旦發生數據丟失,如果沒有有效的備份和恢復機制,后果可能是災難性的,可能導致業務中斷、經濟損失甚至法律責任。 數據庫備份與恢復,正是…

2026《數據結構》考研復習筆記五(棧、隊列)

棧、隊列 一、棧1.卡特蘭數2.不合法的出棧序列 二、隊列1.循環隊列2.輸入輸出受限隊列&#xff08;四個數1234&#xff09; 三、算法1.棧在括號匹配中的應用2.中綴表達式求值&#xff08;通過轉化為后綴表達式再后綴表達式求值&#xff09;3.中綴表達式轉化為后綴表達式4.后綴表…

深入解析微軟MarkitDown:原理、應用與二次開發指南

一、項目背景與技術定位 微軟開源的MarkitDown并非簡單的又一個Markdown解析器&#xff0c;而是針對現代文檔處理需求設計的工具鏈核心組件。該項目誕生于微軟內部大規模文檔系統的開發實踐&#xff0c;旨在解決以下技術痛點&#xff1a; 大規模文檔處理性能&#xff1a;能夠高…

pyinstaller打包paddleocr發生錯誤解決

python環境是3.9&#xff0c;github paddleocr v2.10.0。 一個非常簡單的案例如下&#xff0c;打包時發生錯誤。 import requests from paddleocr import PaddleOCR if __name__ "__main__":paddleocr_ocr PaddleOCR(use_angle_clsTrue, langch,det_model_dirmode…

算法之回溯法

回溯法 回溯法定義與概念核心思想回溯法的一般框架偽代碼表示C語言實現框架 回溯法的優化技巧剪枝策略實現剪枝的C語言示例記憶化搜索 案例分析N皇后問題子集和問題全排列問題尋路問題 回溯法的可視化理解決策樹狀態空間樹回溯過程 回溯法與其他算法的比較回溯法與動態規劃的區…

命令行指引的嘗試

效果 步驟 首先初始化一個空的項目&#xff0c;然后安裝一些依賴 npm init -y npm install inquirer execa chalk ora至于這些依賴是干嘛的&#xff0c;如下圖所示&#xff1a; 然后再 package.json 中補充一個 bin 然后再根目錄下新建一個 index.js , 其中的內容如下 #!/…

探秘LLM推理模型:hidden states中藏著的self verification的“鑰匙”

推理模型在數學和邏輯推理等任務中表現出色&#xff0c;但常出現過度推理的情況。本文研究發現&#xff0c;推理模型的隱藏狀態編碼了答案正確性信息&#xff0c;利用這一信息可提升推理效率。想知道具體如何實現嗎&#xff1f;快來一起來了解吧&#xff01; 論文標題 Reasoni…

流量抓取工具(wireshark)

協議 TCP/IP協議簇 網絡接口層&#xff08;沒有特定的協議&#xff09;PPPOE 物理層數據鏈路層 網絡層: IP(v4/v6) ARP&#xff08;地址解析協議) RARP ICMP(Internet控制報文協議) IGMP傳輸層&#xff1a;TCP(傳輸控制協議&#xff09;UDP&#xff08;用戶數據報協議)應用層…

.NET倉儲層在 using 塊中創建 SqlSugarClient 的風險

如題&#xff0c;先看代碼示例 using 塊的使用 public ISugarQueryable<T> GetSet(Expression<Func<T, bool>> whereExpression null) {using (SqlSugarClient dbClient SqlSugarInstance.GetInstance()){var query dbClient.Queryable<T>();if (w…

C語言----函數棧幀講解

目錄 1.函數棧幀是什么? 2. 理解函數棧幀能解決什么問題 3、函數棧幀的創建和銷毀具體過程 3.1 什么是棧 3.2 認識相關寄存器和匯編指令 3.3函數棧幀的創建和銷毀 3.3.1 預備知識 3.3.2 函數的調用堆棧 3.3.3 準備環境 3.3.4 轉到反匯編 3.3.5 函數棧幀的創建 3.3…

代碼隨想錄學習筆記---二叉樹

學習目標&#xff1a; 學習代碼隨想錄–二叉樹 每天學習1道,復習兩道 學習內容&#xff1a; 2025.4.7 復習內容: 24. 兩兩交換鏈表中的節點 25. 最大二叉樹 學習內容 26. 合并二叉樹 2025.4.8 復習內容: 27. 二分查找 28. 合并二叉樹 29. 27. 移除元素 學習內容: 30. 二叉…

Git ——提交至github,Vercel拉取,更新不了項目的問題解決

首先因為github上有個錯誤 1 failing check Vercel - No GitHub account was found matching the commit author email address 發現好像是vercel拉取不了項目&#xff0c;vercel登錄的郵箱與我此次提交更改的郵箱不匹配&#xff0c;查看Git的user確實如此&#xff08;之前的…

Vue3項目中 npm 依賴安裝 --save 與 --save-dev 的區別解析

這兩個命令的區別如下&#xff1a; bash npm install --save types/crypto-js # 安裝到 dependencies&#xff08;生產依賴&#xff09; npm install --save-dev types/crypto-js # 安裝到 devDependencies&#xff08;開發依賴&#xff09; 核心區別 依賴分類不同…