【數據結構】算法效率的雙刃劍:時間復雜度與空間復雜度

前言

在算法的世界里,效率是衡量算法優劣的關鍵標準。今天,就讓我們深入探討算法效率的兩個核心維度:時間復雜度和空間復雜度,幫助你在算法設計的道路上更進一步。

一、算法效率:衡量算法好壞的關鍵

算法的效率主要體現在兩個方面:時間和空間。時間復雜度衡量的是算法運行的快慢,而空間復雜度則衡量算法運行所需的額外空間。在計算機發展的早期,存儲容量有限,空間復雜度備受關注。然而,隨著計算機存儲容量的飛速發展,如今我們更關注算法的時間復雜度。

1.1 斐波那契數列:一個經典的例子

斐波那契數列是一個經典的算法問題。其遞歸實現方式簡潔明了,但這種簡潔性是否意味著它是一個好的算法呢?答案并非絕對。遞歸實現雖然代碼簡潔,但其時間復雜度較高,對于較大的輸入值,運行時間會顯著增加。這正是我們需要深入分析算法復雜度的原因。

long long Fib(int N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}

二、時間復雜度:算法運行快慢的量化

時間復雜度是衡量算法運行時間的函數。它通過分析算法中基本操作的執行次數來確定。在實際中,我們通常使用大O的漸進表示法來簡化復雜度的表達。

2.1 大O的漸進表示法

大O符號(Big O notation)是描述函數漸進行為的數學符號。推導大O階的方法如下:
用常數1取代運行時間中的所有加法常數。
在修改后的運行次數函數中,只保留最高階項。
如果最高階項存在且不是1,則去除與這個項目相乘的常數。
例如,對于以下代碼:

void Func1(int N)
{int count = 0;for (int i = 0; i < N; ++i){for (int j = 0; j < N; ++j){++count;}}for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}
}

通過計算,我們發現基本操作++count的執行次數為 N^ 2+2*N+10。使用大O的漸進表示法,我們去掉常數項和低階項,得到時間復雜度為 O(N ^2 )。

2.2 常見時間復雜度計算舉例

讓我們通過一些實例來進一步理解時間復雜度的計算。

實例1

void Func2(int N)
{int count = 0;for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}
}

基本操作執行了 2N+10 次,時間復雜度為 O(N)。

實例2

void Func3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++k){++count;}for (int k = 0; k < N; ++k){++count;}
}

基本操作執行了 M+N 次,時間復雜度為 O(N+M)。

實例3

void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++k){++count;}
}

基本操作執行了10次,時間復雜度為 O(1)。(O(1)不是代表一次,而是代表常數次)

實例4

const char *strchr(const char *str, int character);while(*str)
{if(*str == character)return str;str++;

在這里插入圖片描述

時間復雜度為 O(N)。(一般以最壞情況作為時間復雜度)

實例5

void BubbleSort(int *a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

時間復雜度為 O(N^2 )。(最好:O(N),最壞:O(N ^ 2))

實例6(有序 經典二分查找)

int BinarySearch(int *a, int n, int x)
{assert(a);int begin = 0;int end = n - 1;while (begin < end){int mid = begin + ((end - begin) >> 1);if (a[mid] < x)begin = mid + 1;else if (a[mid] > x)end = mid;elsereturn mid;}return -1;
}

時間復雜度為 O(logN)。(最好:O(1),最壞:O(logN)區間縮放到一個值時,要么找到,要么找不到,折半查找多少次(x)就除多少個2。2^x=N

三、空間復雜度:算法所需額外空間的量化

空間復雜度是對一個算法在運行過程中臨時占用存儲空間大小的量度。它主要通過函數在運行時顯式申請的額外空間來確定。

3.1 空間復雜度計算實例

實例1

long long Fac(size_t N)
{if (0 == N)return 1;return Fac(N - 1) * N;
}
Fac(N)
Fac(N-1)
Fac(N-2)
...
Fac(1)
Fac(0)

空間復雜度為 O(N)。

實例2

long long *Fibonacci(size_t n)
{if (n == 0)return NULL;long long *fibArray = (long long *)malloc((n + 1) * sizeof(long long));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n; ++i){fibArray[i] = fibArray[i - 1] + fibArray[i - 2];}return fibArray;
}

空間復雜度為 O(N)。

實例3

long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}
   2^0  Fib(N)2^1Fib(N-1)  Fib(N-2)2^2 Fib(N-2) Fib(N-3)  Fib(N-3) Fib(N-2)...2^(N-1)Fib(2)  Fib(1)

空間復雜度為 O(2^N)。

四、常見復雜度對比

常見的復雜度從低到高依次為:O(1)、O(logN)、O(N)、O(NlogN)、O(N^2 )、O(2 ^N )、O(N!)。選擇合適的算法,可以顯著提升程序的運行效率。
在這里插入圖片描述
在這里插入圖片描述

五、復雜度的OJ練習

理論學習之后,通過實踐來鞏固知識是必不可少的。以下是一些推薦的OJ題目:
消失的數字
參考:
1.
在這里插入圖片描述
2.
在這里插入圖片描述

旋轉數組

總結

時間復雜度和空間復雜度是算法設計中不可或缺的兩個維度。通過深入理解它們,我們可以更好地選擇和設計高效的算法。希望這篇文章能幫助你更好地掌握算法效率的分析方法,讓你在算法學習的道路上更進一步。

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

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

相關文章

Java基礎-26-多態-認識多態

在Java編程中&#xff0c;多態&#xff08;Polymorphism&#xff09; 是面向對象編程的核心概念之一。通過多態&#xff0c;我們可以編寫更加靈活、可擴展的代碼。本文將詳細介紹什么是多態、如何實現多態&#xff0c;并通過具體的例子來幫助你更好地理解這一重要概念。 一、什…

使用自定義的RTTI屬性對對象進行流操作

由于歷史原因&#xff0c;在借鑒某些特定出名的游戲引擎中&#xff0c;不知道當時的作者的意圖和編寫方式 特此做這篇文章。&#xff08;本文出自游戲編程精粹4 中 使用自定義的RTTI屬性對對象進行流操作 文章&#xff09; 載入和 保存 關卡&#xff0c;并不是一件容易辦到的事…

周總結aa

上周學習了Java中有關字符串的內容&#xff0c;與其有關的類和方法 學習了static表示靜態的相關方法和類的使用。 學習了繼承(extends) 多態&#xff08;有繼承關系&#xff0c;有父類引用指向子類對象&#xff09; 有關包的知識&#xff0c;final關鍵字的使用&#xff0c;及有…

密碼學基礎——密碼學相關概念

目錄 1.1 密碼系統&#xff08;Cryptosystem&#xff09; 1.2 密碼編碼學 1.3 密碼分析學 1.4 基于算法保密 1.5 基于密鑰保密 1.6密碼系統的設計要求 1.7 單鑰體制 1.8 雙鑰體制 密鑰管理 1.1 密碼系統&#xff08;Cryptosystem&#xff09; 也稱為密碼體制&#xff0…

初始JavaEE篇 —— Mybatis-plus 操作數據庫

找往期文章包括但不限于本期文章中不懂的知識點&#xff1a; 個人主頁&#xff1a;我要學編程程(?_?)-CSDN博客 所屬專欄&#xff1a;JavaEE 目錄 前言 Mybatis-plus 快速上手 Mybatis-plus 復雜操作 常用注解 TableName TableField TableId 打印日志 條件構造器 …

PyQt6實例_批量下載pdf工具_主線程啟用線程池

目錄 前置&#xff1a; 代碼&#xff1a; 視頻&#xff1a; 前置&#xff1a; 1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭&#xff0c;放在 【PyQt6實例】 專欄 2 本系列涉及到的PyQt6知識點&#xff1a; 線程池&#xff1a;QThreadPool,QRunnable&#xff1b; 信號與…

1.2 斐波那契數列模型:LeetCode 面試題 08.01. 三步問題

動態規劃解三步問題&#xff1a;LeetCode 面試題 08.01. 三步問題 1. 題目鏈接 LeetCode 面試題 08.01. 三步問題 題目要求&#xff1a;小孩上樓梯&#xff0c;每次可以走1、2或3步&#xff0c;計算到達第 n 階臺階的不同方式數&#xff0c;結果需對 1e9 7 取模。 2. 題目描述…

UE5 學習筆記 FPS游戲制作30 顯示擊殺信息 水平框 UI模板(預制體)

文章目錄 一制作單條死亡信息框水平框的使用創建一個水平框添加子元素調整子元素順序子元素的布局插槽尺寸填充對齊 制作UI 根據隊伍&#xff0c;設置文本的名字和顏色聲明變量 將變量設置為構造參數根據隊伍&#xff0c;設置文本的名字和顏色在構造事件中&#xff0c;獲取玩家…

HTTP---基礎知識

天天開心&#xff01;&#xff01;&#xff01; 文章目錄 一、HTTP基本概念1. 什么是HTTP&#xff0c;又有什么用&#xff1f;2. 一次HTTP請求的過程3.HTTP的協議頭4.POST和GET的區別5. HTTP狀態碼6.HTTP的優缺點 二、HTTP的版本演進1.各個版本的應用場景2、注意要點 三、HTTP與…

數據結構 KMP 字符串匹配算法

KMP算法是計算機科學中的一種字符串匹配算法&#xff0c;KMP是三個創始人名字首字母 題目 AcWing - 算法基礎課 前置知識點 KMP算法是一種高效的字符串匹配算法&#xff0c;算法名稱取自于三位共同發明人名字的首字母組合。該算法的主要使用場景就是在字符串&#xff08;也叫…

Conda配置Python環境

1. 安裝 Conda 選擇發行版&#xff1a; Anaconda&#xff1a;適合需要預裝大量科學計算包的用戶&#xff08;體積較大&#xff09;。 Miniconda&#xff1a;輕量版&#xff0c;僅包含 Conda 和 Python&#xff08;推薦自行安裝所需包&#xff09;。 驗證安裝&#xff1a; co…

數倉開發那些事(11)

某神州優秀員工&#xff1a;一閃&#xff0c;領導說要給我漲米。 一閃&#xff1a;。。。。&#xff08;著急的團團轉&#xff09; 老運維&#xff1a;Oi&#xff0c;兩個吊毛&#xff0c;看看你們的hadoop集群&#xff0c;健康度30分&#xff0c;怎么還在抽思謀克&#xff1f…

MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案

? MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案 前言一、問題現象二、原因分析1. 使用了 strictInsertFill/strictUpdateFill 導致更新失效2. 實體類注解配置錯誤3. MetaObjectHandler 未生效4. 使用自定義 SQL 導致自動填充失效5. 字段類型不匹配 三、…

C++ STL常用算法之常用算術生成算法

常用算術生成算法 學習目標: 掌握常用的算術生成算法 注意: 算術生成算法屬于小型算法&#xff0c;使用時包含的頭文件為 #include <numeric> 算法簡介: accumulate // 計算容器元素累計總和 fill // 向容器中添加元素 accumulate 功能描述: 計算區間內容器元素…

axios基礎入門教程

一、axios 簡介 axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;可用于瀏覽器和 Node.js 環境&#xff0c;支持以下特性&#xff1a; 發送 HTTP 請求&#xff08;GET/POST/PUT/DELETE 等&#xff09; 攔截請求和響應 自動轉換 JSON 數據 取消請求 并發請求處理 二…

短視頻團隊架構工作流程---2025.3.30 李劭卓

短視頻團隊架構&工作流程—2025.3.30 李劭卓 文章目錄 短視頻團隊架構&工作流程---2025.3.30 李劭卓1 工作職責1.1 編劇&#xff1a;1.2 主編&#xff1a;1.3 總編&#xff1a;1.4 導演&#xff1a;1.5 攝影&#xff1a;1.6 演員&#xff1a;1.7 后期&#xff1a;1.8 美…

MySQL 高效 SQL 使用技巧詳解

MySQL 高效 SQL 使用 技巧詳解 一、為什么需要優化 SQL&#xff1f; 性能瓶頸&#xff1a;慢查詢導致數據庫負載升高&#xff0c;響應時間延長。資源浪費&#xff1a;低效 SQL 可能占用大量 CPU、內存和磁盤 I/O。 目標&#xff1a;通過優化 SQL 將查詢性能提升 10 倍以上&am…

AI基礎03-視頻數據采集

上篇文章我們學習了圖片的數據采集&#xff0c;今天主要了解一下視頻數據采集的方法。視頻是由一系列圖像構成的&#xff0c;其中每一張圖片就是一幀。視頻數據采集方法通常有自動圖像采集和基于處理器的圖像采集兩種。我們學習一下如何利用python 工具和筆記本計算機攝像頭進行…

Scala 數組

Scala 數組 引言 Scala 作為一門多范式編程語言&#xff0c;融合了面向對象和函數式編程的特點。數組是編程語言中非常基礎和常見的數據結構&#xff0c;在 Scala 中也不例外。本文將詳細介紹 Scala 中的數組&#xff0c;包括其定義、操作以及在實際開發中的應用。 Scala 數…

Text-to-SQL將自然語言轉換為數據庫查詢語句

有關Text-To-SQL方法&#xff0c;可以查閱我的另一篇文章&#xff0c;Text-to-SQL方法研究 直接與數據庫對話-text2sql Text2sql就是把文本轉換為sql語言&#xff0c;這段時間公司有這方面的需求&#xff0c;調研了一下市面上text2sql的方法&#xff0c;比如阿里的Chat2DB,麻…