Day1 時間復雜度

一 概念

在 C++ 中,時間復雜度是衡量算法運行時間隨輸入規模增長的趨勢的關鍵指標,用于評估算法的效率。它通過?大 O 表示法(Big O Notation)?描述,關注的是輸入規模?n?趨近于無窮大時,算法時間增長的主導因素(忽略常數和低階項)。

  • 輸入規模(n):算法處理的數據量(如數組長度、鏈表節點數、矩陣維度等)。
  • 大 O 表示法:表示算法時間復雜度的上界,例如?O(n)?表示時間與輸入規模?n?成線性關系。
  • 核心原則:只保留最高階項,忽略常數因子和低階項(如?O(2n + 3)?簡化為?O(n)O(n2 + n)?簡化為?O(n2))。

二 常見時間復雜度類型?

1.O (1):常數時間

無論輸入規模多大,算法執行時間恒定(與?n?無關)。

典型場景:

  • 數組 /vector?的隨機訪問(通過下標?[i])。
  • 哈希表(unordered_map)的插入、查找(平均情況)。

示例:訪問數組元素?

#include <vector>int get_element(const std::vector<int>& vec, int index) {return vec[index];  // 隨機訪問,時間復雜度 O(1)
}

2.?O (n):線性時間

時間與輸入規模?n?成正比,需逐個處理每個元素。
典型場景

  • 線性枚舉(遍歷數組、鏈表等)。
  • 未排序數組的順序查找。

示例:遍歷?vector?求和

#include <vector>int sum_vector(const std::vector<int>& vec) {int sum = 0;for (int num : vec) {  // 遍歷所有元素,時間復雜度 O(n)sum += num;}return sum;
}

3.?O (logn):對數時間

時間隨輸入規模的對數增長,通常出現在分治算法中(如二分查找)。
典型場景

  • 有序數組的二分查找(std::lower_bound)。
  • 平衡二叉搜索樹(如?std::setstd::map)的插入、查找。

示例:二分查找(C++ 標準庫實現)

#include <vector>
#include <algorithm>  // for std::lower_bound// 查找目標值的位置(返回迭代器)
auto binary_search(const std::vector<int>& vec, int target) {return std::lower_bound(vec.begin(), vec.end(), target);// 時間復雜度 O(logn)(數組已排序)
}

4.?O (nlogn):線性對數時間

時間增長趨勢為?n × logn,常見于高效的排序算法。
典型場景

  • 快速排序、歸并排序(平均情況)。
  • std::sort(C++ 標準庫排序,基于快速排序 / 堆排序)。

示例:使用?std::sort?排序

#include <vector>
#include <algorithm>void sort_vector(std::vector<int>& vec) {std::sort(vec.begin(), vec.end());  // 平均時間復雜度 O(nlogn)
}

5.O (n2):平方時間

時間與輸入規模的平方成正比,常見于雙重循環的暴力算法。
典型場景

  • 冒泡排序、選擇排序(最壞 / 平均情況)。
  • 二維數組的遍歷(如矩陣元素逐個處理)。

示例:冒泡排序

#include <vector>void bubble_sort(std::vector<int>& vec) {int n = vec.size();for (int i = 0; i < n - 1; ++i) {for (int j = 0; j < n - i - 1; ++j) {  // 雙重循環,時間復雜度 O(n2)if (vec[j] > vec[j + 1]) {std::swap(vec[j], vec[j + 1]);}}}
}

6.?其他復雜度

  • O(2?):指數時間(如斐波那契數列的遞歸實現,存在大量重復計算)。
  • O(n!):階乘時間(如全排列生成)。

三、時間復雜度的分析方法?

1.?單循環:O (n)

單個循環遍歷?n?次,時間復雜度為?O(n)

for (int i = 0; i < n; ++i) {// 操作(時間復雜度 O(1))
}
// 總時間復雜度:O(n)

2.?雙重循環:O (n2)

外層循環?n?次,內層循環?n?次,總次數為?n × n = n2

for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {// 操作(O(1))}
}
// 總時間復雜度:O(n2)

當外層循環到第 i 次時,內層循環 i 次,總次數為?(1 + n)n / 2 = (n + n^2) / 2次。

for (int i = 0; i < n; ++i) {for (int j = 0; j <= i; ++j) {//操作(O(1))}
}
/*  i  0  1  2  3  ...  n-1j  1  1  2  3  ...  n總操作次數為等差數列:(1 + n)n / 2 = (n + n^2) / 2只保留最高階項,忽略常數因子和低階項,故時間復雜度O(n^2)
*/

3.?對數循環:O (logn)

每次循環將問題規模減半(如二分查找)。

int i = 1;
while (i < n) {i *= 2;  // 每次規模翻倍
}
// 循環次數為 log?n,時間復雜度 O(logn)
int i = n * n;
while (i != 1) {i /= 2; //每次規模減少為原來的一半
}/*
t(操作次數) 0       1           2            3     ...
i          n^2   n^2 / 2     n^2 / 4      n^2 / 8  ...由上面規律可得:i = n^2 / 2^t
將該表達式與 i = 1 聯立
得 t = 2log2(n)
所以時間復雜度為 O(log2(n)),記為 O(logn)
*/

4.?遞歸的時間復雜度

遞歸的時間復雜度需結合遞歸深度每層操作次數
示例:斐波那契數列的遞歸實現(低效版)

int fib(int n) {if (n <= 1) return n;return fib(n - 1) + fib(n - 2);  // 每次遞歸分裂為 2 個子問題
}
// 時間復雜度:O(2?)(存在大量重復計算)

四、時間復雜度的優化策略

1.?用哈希表優化查找(O (n) → O (1))

將線性查找(O (n))替換為哈希表(unordered_map)的鍵值查找(O (1)),以空間換時間。

示例:兩數之和。在數組中找到兩個元素值等于target,返回這兩個元素組成的數組。

#include <vector>
#include <unordered_map>std::vector<int> two_sum(const std::vector<int>& nums, int target) {std::unordered_map<int, int> hash;  // 哈希表存儲值→索引for (int i = 0; i < nums.size(); ++i) {int complement = target - nums[i];if (hash.count(complement)) {  // 查找時間 O(1)return {hash[complement], i};}hash[nums[i]] = i;  // 插入時間 O(1)}return {};
}
// 原暴力解法時間復雜度 O(n2),優化后 O(n)

2.?用排序 + 二分查找優化(O (n2) → O (nlogn))

將雙重循環的暴力匹配替換為排序后二分查找。
示例:查找數組中是否存在兩數之和為目標值

#include <vector>
#include <algorithm>bool has_two_sum(std::vector<int>& nums, int target) {std::sort(nums.begin(), nums.end());  // 排序 O(nlogn)for (int num : nums) {int complement = target - num;// 二分查找 complement,時間 O(logn)if (std::binary_search(nums.begin(), nums.end(), complement)) {return true;}}return false;
}
// 原暴力解法 O(n2),優化后 O(nlogn)

3.?避免重復計算(O (2?) → O (n))

通過動態規劃或記憶化搜索,消除遞歸中的重復子問題。
示例:斐波那契數列的動態規劃實現

#include <vector>int fib(int n) {if (n <= 1) return n;std::vector<int> dp(n + 1);  // 存儲已計算的結果dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; ++i) {dp[i] = dp[i - 1] + dp[i - 2];  // 避免重復計算,時間 O(n)}return dp[n];
}
// 原遞歸解法 O(2?),優化后 O(n)

五 總結

時間復雜度反映算法運行時間隨輸入規模增長的趨勢,不同復雜度的增長速度從低到高排列如下:

O(1) < O(logn) < O(n) < O(nlogn) < O(n2)

時間復雜度是評估算法效率的核心指標。在 C++ 中,通過分析循環嵌套、遞歸深度或操作次數,可以確定算法的時間復雜度。實際編碼時,應優先選擇低時間復雜度的算法(如 O (nlogn) 優于 O (n2)),并利用哈希表、排序 + 二分等優化手段降低復雜度。同時,結合數據結構的特性(如unordered_map的 O (1) 查找),可以顯著提升程序性能。

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

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

相關文章

PAC文件:智能代理配置的瑞士軍刀

在日常上網和企業網絡環境中&#xff0c;我們經常需要配置代理服務器來訪問特定資源、增強安全性或管理網絡流量。Windows和macOS系統自帶的代理配置通常提供全局代理或簡單的排除列表&#xff0c;這在某些復雜場景下顯得不夠靈活。例如&#xff0c;我們可能只想代理某個特定的…

獲取高德地圖JS API的安全密鑰和Key的方法

要使用高德地圖JavaScript API&#xff0c;您需要獲取API Key和安全密鑰(securityJsCode)。以下是獲取步驟&#xff1a; 1. 注冊高德開放平臺賬號 首先訪問高德開放平臺&#xff0c;如果沒有賬號需要先注冊。 2. 創建應用獲取Key 登錄后進入"控制臺" 點擊"應…

攜程酒店 phantom-token token1004 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 部分python代碼 搞APP搞的心態有點崩…

小紅書多賬號運營效率優化:技術方案與自動化實踐

目錄 一、效率瓶頸與流程優化方向 二、技術實現方案與效率提升路徑 1. 多賬號統一管理&#xff1a;環境隔離與批量操作 2. 自動化任務設計&#xff1a;RPA與腳本化執行 四、效果驗證與數據對比 五、總結與開源工具推薦 六、下載地址&#xff1a; 一、效率瓶頸與流程優化…

FastDDS Transport功能模塊初步整理

一. 總體結構 二. 主要類的功能 2.1 TransportDescriptor和TransportInterface ? FastDDS中整個Transport類的設計遵循的是設計模式中的建造者模式&#xff0c;其中&#xff0c;TransportDescriptor就是建造者&#xff0c;而TransportInterface則是建造出來的產品。 ? Tra…

zabbix最新版本7.2超級詳細安裝部署(一)

如果文章對你有用&#xff0c;請留下痕跡在配置過程中有問題請及時留言&#xff0c;本作者可以及時更新文章 目錄 1、提前準備環境 2、zabbix7.2安裝部署 3、安裝并配置數據庫 4、為Zabbix server配置數據庫 5、為Zabbix前端配置PHP 6、啟動Zabbix server和agent進程 7、關閉防…

CodeBlocks調試報錯

嘗試打斷點&#xff0c;并且點擊紅色箭頭啟動debugger時&#xff0c;控制臺報錯 Active debugger config: GDB/CDB debugger:Default Building to ensure sources are up-to-date Selecting target: Debug Adding source dir: C:\Users\Lenovo\Desktop\exercise\ Adding source…

Manus 開放注冊:AI 智能體領域的新起點

2025 年 5 月 13 日成為了一個具有特殊意義的日子 —— 備受矚目的 AI 智能體平臺 Manus&#xff08;Manus&#xff09;正式宣布開放注冊。這一消息猶如一顆重磅炸彈&#xff0c;瞬間在全球科技圈引起了廣泛關注和熱烈討論。在此之前&#xff0c;Manus 一直以其獨特的魅力和極高…

車載網關作為車輛網絡系統的核心樞紐

我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 鈍感力的“鈍”&#xff0c;不是木訥、遲鈍&#xff0c;而是直面困境的韌勁和耐力&#xff0c;是面對外界…

俄羅斯方塊算法2025.5.10

問題描述 俄羅斯方塊&#xff08;Tetris&#xff09;作為風靡全球38年的現象級益智游戲&#xff0c;其簡單易學但難于精通的特性使其成為游戲史上的不朽經典。以下是其核心游戲規則解析及我們的要求&#xff1a; 游戲界面由20行10列的可視區域組成&#xff0c;7種不同形狀的四…

Femap許可網絡配置

電磁仿真領域&#xff0c;Femap以其卓越的性能和廣泛的應用場景&#xff0c;成為眾多工程師和科研人員的首選工具。為了滿足多用戶協作的需求&#xff0c;Femap提供了靈活的網絡配置方案。本文將詳細介紹Femap許可網絡配置的方法和優勢&#xff0c;幫助您輕松實現多用戶高效協作…

計算機視覺----時域頻域在圖像中的意義、傅里葉變換在圖像中的應用、卷積核的頻域解釋

1、時域&#xff08;時間域&#xff09;——自變量是時間,即橫軸是時間,縱軸是信號的變化。其動態信號x&#xff08;t&#xff09;是描述信號在不同時刻取值的函數。 2、頻域&#xff08;頻率域&#xff09;——自變量是頻率,即橫軸是頻率,縱軸是該頻率信號的幅度,也就是通常說…

主流高防服務器技術對比與AI防御方案實戰

1. 高防服務器核心能力對比 當前市場主流高防服務商&#xff08;如阿里云、騰訊云、華為云&#xff09;的核心防御能力集中在流量清洗與靜態規則防護&#xff0c;但面臨以下挑戰&#xff1a; 靜態防御瓶頸&#xff1a;傳統方案依賴預定義規則&#xff0c;對新型攻擊&#xff…

常時間運行的程序 導致系統卡頓 自動監控系統CPU和內存利用率 自動選擇 內存回收 軟件重啟 電腦重啟

長時間運行安防系統&#xff0c;導致CPU或內存利用率超80%&#xff0c;使得電腦變的緩慢、卡頓的問題。定時獲取CPU和內存利用率的數據&#xff0c;在不同時間段&#xff08;如凌晨與平時&#xff09;&#xff0c;根據利用率的不同的閾值&#xff0c;進行&#xff1a;內存回收(…

OpenCV播放攝像頭視頻

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 播放攝像頭視頻和播放視頻文件類似&#xff0c;也是通過類VideoCapture來實現&#xff0c;只不過調用open的時候傳入的是攝像頭的索引號。如果計算機安裝了一個攝像頭&#xff0c;則open的第一個參數通常是0&…

操作系統:內存管理

目錄 1、主要目標 2、核心概念和技術 2.1 物理內存與虛擬內存 2.2 內存分頁機制 2.3 頁面置換算法 3、監控與性能優化 3.1 查看物理內存 3.2 查看虛擬內存 3.3 性能問題 1> 內存不足&#xff08;OOM&#xff09; 2> 內存泄漏 3> 內存碎片 3.4 性能優化策…

專題四:綜合練習( 找出所有子集的異或總和再求和)

以leetcode1863題為例 題目分析&#xff1a; 找到每個子集&#xff0c;然后子集中的元素異或之后全部相加 算法原理分析&#xff1a; 畫決策樹&#xff1a;第一層為這個子集有一個元素 第二層這個子集有兩個元素 從上往下羅列&#xff0c;把所有子集都羅列出來&#xf…

【python】—conda新建python3.11的環境報錯

1.報錯 conda create -n py3.11 python3.11 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ Collecting package metadata: done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channel…

RabbitMQ事務機制

在RabbitMQ中&#xff0c;生產者為了確保消息發送成功&#xff0c;一種是使用 confirm 確認機制&#xff0c;另一種就是使用事務機制&#xff0c;事務機制就是允許生產者在發送消息時&#xff0c;將多個消息操作作為一個原子單元進行處理&#xff0c;要么所有操作都成功執行&am…

兩臺筆記本電腦直接通過HDMI線連接?

兩臺筆記本電腦直接通過HDMI線連接通常無法實現屏幕共享或數據傳輸&#xff0c;因為HDMI接口設計主要用于單向音視頻輸出(如連接顯示器或電視)。以下是詳細分析和替代方案&#xff1a; 為什么HDMI直連兩臺電腦不適用&#xff1f; 接口功能限制&#xff1a;? 大多數筆記本電腦的…