網(wǎng)站首頁 編程語言 正文
目錄
1.什么是算法
算法特性
2.算法的復雜度
3.時間復雜度
3.1時間復雜度定義
3.2?大O的漸進表示法
4.空間復雜度
定義
舉例:
?5.時間復雜度和空間復雜度的對比
1.什么是算法
算法(Algorithm)是對某一特定類型的問題求解步驟的一種描述,是指定的有限序列,字面意思就是用于計算的方法。
算法特性
1.有窮性:一個算法總是會再執(zhí)行有限次數(shù)后停止。
2.確定性:每個步驟都有確定的含義,對相同的輸入有相同的輸出。
3.輸入:一個算法有零個或多個輸入。
4.輸出:一個算法有一個或多個輸出。
5.可行性:算法中每一步都可以通過已經(jīng)實現(xiàn)的基本運算的有限次運行來實現(xiàn)。
2.算法的復雜度
通常用算法的復雜度來衡量一個算法的好壞。那么,什么是復雜度呢?
算法在編寫成可執(zhí)行程序后,運行時需要耗費時間資源和空間(內(nèi)存)資源 。因此衡量一個算法的好壞,一般是從時間和空間兩個維度來衡量的,即時間復雜度和空間復雜度。
時間復雜度主要衡量一個算法的運行快慢,而空間復雜度主要衡量一個算法運行所需要的額外空間。
3.時間復雜度
3.1時間復雜度定義
算法的時間復雜度是一個函數(shù),它定量描述了該算法的運行時間。(注:一個算法的執(zhí)行時間從理論上來說是不能算出來的,但算法花費的時間與其中語句的執(zhí)行次數(shù)成正比例,因此算法中的基本操作的執(zhí)行次數(shù),為算法的時間復雜度)
?通俗一點來說:時間復雜度就是一個算法中執(zhí)行次數(shù)最多的那條語句的通式省略系數(shù)保留階數(shù)最高的式子。
3.2?大O的漸進表示法
推導大O階方法:
1、用常數(shù)1取代運行時間中的所有加法常數(shù)。若是一個算法的執(zhí)行次數(shù)為確定的常數(shù)項,那么他的時間復雜度為O(1)
2、在修改后的運行次數(shù)函數(shù)中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項目相乘的常數(shù)。得到的結(jié)果就是大O階。
舉個例子:
int fun(int x)
{
int count = 0;
for (int i = 0; i < x; i++)
{
for (int j = 0;j
以此算法為例,count++,執(zhí)行次數(shù)為x*x次,那么它的時間復雜度為O(x^2)
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,可以看出來它的執(zhí)行次數(shù)為
F(n)=n*n+2*n+10;應用大O的漸進表示法,我們保留最高階n*n=n^2,因此上述算法的時間復雜度為O(n^2)。
那么為什么是這樣呢?因為當n無窮大時,除去最高階對整個影響較大外,其他的常數(shù)及一次項對整體次數(shù)來說可忽略不計,時間復雜度取的是最差結(jié)果,因此對時間復雜度有了大O的漸進表示法。
4.空間復雜度
定義
空間復雜度也是一個數(shù)學表達式,不是程序占用了多少字節(jié)的空間,而是對一個算法在運行過程中臨時占用存儲空間大小的量度 。
空間復雜度計算規(guī)則基本跟實踐復雜度類似,也使用大O漸進表示法。
注意:函數(shù)運行時所需要的棧空間(存儲參數(shù)、局部變量、一些寄存器信息等)在編譯期間已經(jīng)確定好了,因此空間復雜度主要通過函數(shù)在運行時候顯式申請的額外空間來確定。
舉例:
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;
}
}
上述算法中:n,exchange,i 在運行時要申請額外的空間來完成程序,因此額外申請了3個空間,是常數(shù),因此用大O漸進表示法表示其空間復雜度就是O(1)
?5.時間復雜度和空間復雜度的對比
注:時間是累加的,一去不復返的;空間卻是可以循環(huán)利用的。
?這里我們用斐波那契數(shù)的遞歸算法來對比時間復雜度與空間復雜度
原文鏈接:https://blog.csdn.net/weixin_53316121/article/details/123301278
相關(guān)推薦
- 2022-06-25 Python利用format函數(shù)實現(xiàn)對齊打印(左對齊、右對齊與居中對齊)_python
- 2023-05-22 pytorch的Backward過程用時太長問題及解決_python
- 2023-07-08 git代碼回滾到某個tag
- 2022-07-26 瀏覽器解析機制和XSS向量編碼
- 2022-04-16 python中defaultdict字典功能特性介紹_python
- 2022-04-23 超出省略號,el-tooltip懸停展示全部的簡單實現(xiàn)
- 2023-07-06 springboot監(jiān)聽Redis 緩存過期(Key 失效)事件
- 2023-10-26 解決:NODE_ENV 不是內(nèi)部或外部命令,也不是可運行的程序,或者批處理文件
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支