時間復雜度與空間復雜度的詳解

目錄

1.時間復雜度

2.時間復雜度計算例題

3.空間復雜度


1.時間復雜度

算法中的基本操作的執行次數,為算法的時間復雜度。
如何表達 時間復雜度?
大O的漸進表示法
實際中我們計算時間復雜度時,我們其實并不一定要計算精確的執行次數,而只需要 大概執行次數,那么這里我們 使用大 O 的漸進表示法。
1、用常數1取代運行時間中的所有加法常數。
2、在修改后的運行次數函數中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項目相乘的常數。得到的結果就是大O

舉例:

// 請計算一下 func1 基本操作執行了多少次?
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 -- ) > 0 ) {
count ++ ;
}
System . out . println ( count );
}

?題解:

Func1 執行的基本操作次數 :
F(N)=N^2+2*N+10;
(1) 用常數1取代運行時間中的所有加法常數。
F(N)=N^2+2*N+1;
(2) 在修改后的運行次數函數中,只保留最高階項。
F(N)=N^2;
=>O(N^2);

通過上面我們會發現大O的漸進表示法去掉了那些對結果影響不大的項,簡潔明了的表示出了執行次數。 ?

另外有些算法的時間復雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規模的最大運行次數 ( 上界 )
平均情況:任意輸入規模的期望運行次數
最好情況:任意輸入規模的最小運行次數 ( 下界 )
一般情況下時間復雜度是算法的最壞運行情況
O(N)中N表示問題的規模

2.時間復雜度計算例題

例題1:

// 計算 func2 的時間復雜度?
void func2 ( int N , int M ) {
int count = 0 ;
for ( int k = 0 ; k < M ; k ++ ) {
count ++ ;
}
for ( int k = 0 ; k < N ; k ++ ) {
count ++ ;
}
System . out . println ( count );
}

答案及分析:

基本操作執行了M+N次,有兩個未知數MN,時間復雜度為 O(N+M)?

例題2:

// 計算 func3 的時間復雜度?
void func3 int N ) {
int count = 0 ;
for ( int k = 0 ; k < 100 ; k ++ ) {
count ++ ;
}
System . out . println ( count );
}

?答案及分析:

基本操作執行了100次,通過推導大O階方法,時間復雜度為 O(1)

?例題3:

// 計算 bubbleSort 的時間復雜度?
void bubbleSort ( int [] array ) {
for ( int end = array . length ; end > 0 ; end -- ) {
boolean sorted = true ;
for ( int i = 1 ; i < end ; i ++ ) {
if ( array [ i - 1 ] > array [ i ]) {
Swap ( array , i - 1 , i );
sorted = false ;
}
}
if ( sorted == true ) {
break ;
}
}
}

?答案及分析:

F(N)=(N-1+N-2+N-3……)==((N-1+1)*N)/2==0.5*N^2;

通過推導大 O 階方法 + 時間復雜度一般看最壞,時間 復雜度為 O(N^2)

?例題4:

// 計算 binarySearch 的時間復雜度?
int binarySearch ( int [] array , int value ) {
int begin = 0 ;
int end = array . length - 1 ;
while ( begin <= end ) {
int mid = begin + (( end - begin ) / 2 );
if ( array [ mid ] < value )
begin = mid + 1 ;
else if ( array [ mid ] > value )
end = mid - 1 ;
else
return mid ;
}
return - 1 ;
}

?答案及分析:

方法1:

對于不能直接看出的并較復雜的問題,可以采用數學歸納法

?答案:

?方法2:

N/(2^x)?=1(x為循環的執行次數)

x的解:

例題 5

// 計算階乘遞歸 factorial 的時間復雜度?
long factorial ( int N ) {
return N < 2 ? N : factorial ( N - 1 ) * N ;
}

對于不能直接看出的并較復雜的問題,可以采用數學歸納法,但對于遞歸我們有專門總結的方法。

F(N)=遞歸的次數*每次遞歸代碼的執行次數

?答案及分析:

通過計算分析發現基本操作遞歸了 N次, 每次遞歸代碼的執行次數為1 時間復雜度為O(N)

例題6:

// 計算斐波那契遞歸 fifibonacci 的時間復雜度?
int fifibonacci ( int N ) {
return N < 2 ? N : fifibonacci ( N - 1 ) + fifibonacci ( N - 2 );
}

??答案及分析:

對于不能直接看出的并較復雜的問題,可以采用數學歸納法(不展開)

面對這種多遞歸入口的題,可以使用補全法。

何為補全法?

以F4為例

F(N):?

?

1+2+4+……+2^(N-1)
=2^N-1;
O(2^N)

3.空間復雜度

空間復雜度是對一個算法在運行過程中 臨時占用存儲空間大小的量度 。空間復雜度不是程序占用了多少 bytes 的空 間,因為這個也沒太大意義,所以空間復雜度算的是變量的個數
空間復雜度計算規則基本跟時間復雜度類似 ,也 使用 O 漸進表示法
無論什么類型,只看開了多少的空間

?例題1:

// 計算 bubbleSort 的空間復雜度?
void bubbleSort ( int [] array ) {
for ( int end = array . length ; end > 0 ; end -- ) {
boolean sorted = true ;
for ( int i = 1 ; i < end ; i ++ ) {
if ( array [ i - 1 ] > array [ i ]) {
Swap ( array , i - 1 , i );
sorted = false ;
}
}
if ( sorted == true ) {
break ;
}
}
}

???答案及分析:

?使用了常數個額外空間,所以空間復雜度為 O(1)

例題2:

// 計算 fifibonacci 的空間復雜度?
int [] fifibonacci ( int n ) {
long [] fifibArray = new long [ n + 1 ];
fifibArray [ 0 ] = 0 ;
fifibArray [ 1 ] = 1 ;
for ( int i = 2 ; i <= n ; i ++ ) {
fifibArray [ i ] = fifibArray [ i - 1 ] + fifibArray [ i - 2 ];
}
return fifibArray ;
}

?答案及分析:

動態開辟了N個空間,空間復雜度為 O(N)

例題3:

// 計算階乘遞歸 Factorial 的空間復雜度?
long factorial ( int N ) {
return N < 2 ? N : factorial ( N - 1 ) * N ;
}

??答案及分析:

遞歸調用了 N 次,開辟了 N 個棧幀,每個棧幀使用了常數個空間。空間復雜度為 O(N)

以上為我個人的小分享,如有問題,歡迎討論!!!?

都看到這了,不如關注一下,給個免費的贊?

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

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

相關文章

ArcGIS Pro暨基礎入門、制圖、空間分析、影像分析、三維建模、空間統計分析與建模、python融合、案例應用

GIS是利用電子計算機及其外部設備&#xff0c;采集、存儲、分析和描述整個或部分地球表面與空間信息系統。簡單地講&#xff0c;它是在一定的地域內&#xff0c;將地理空間信息和 一些與該地域地理信息相關的屬性信息結合起來&#xff0c;達到對地理和屬性信息的綜合管理。GIS的…

【數據結構】樹和二叉樹

一、樹的概念及結構 1、樹的概念 樹 是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。 有一個特殊的結點&a…

mysql8.0.3集群搭建

下載mysql安裝包&#xff1a; https://dev.mysql.com/downloads/mysql/5.7.html#downloads 準備環境 1、準備三臺服務器并設置hosts 192.168.236.143 mysql1 192.168.236.144 mysql2 192.168.236.145 mysql32、設置免密登陸 #生成秘鑰 ssh-keygen -t rsa #一直按Enter即可…

php從靜態資源到動態內容

1、從HTML到PHP demo.php:后綴由html直接改為php,實際上當前頁面已經變成了動態的php應用程序腳本 demo.php: 允許通過<?php ... ?>標簽,添加php代碼到當前腳本中 php標簽內部代碼由php.exe解釋, php標簽之外的代碼原樣輸出,仍由web服務器解析 <!DOCTYPE html>…

MySQL數據庫基礎語法

一&#xff0c;數據庫操作 數據庫中不區分大小寫&#xff01;&#xff01;&#xff01; 1.1 顯示數據庫 show databases ; 如圖&#xff1a; 1.2 創建數據庫 create database [ if not exists ]數據庫名 ; 如圖&#xff1a; 1.3 使用數據庫 use 數據庫名 &#xff1b; 如圖&a…

8月13日,每日信息差

1、600余家互聯網企業發出倡議&#xff1a;積極維護防汛救災網絡秩序、截至目前&#xff0c;包括百度、微博、抖音、快手、小紅書、嗶哩嗶哩、阿里、騰訊等8家超大型互聯網平臺在內的600余家企業發出倡議書&#xff0c;唱響了萬眾一心、聚力救災救援的網上主旋律 2、蘇州調整耗…

常見的BUG分析方法有哪些?

分類法&#xff1a;對所有的BUG進行分類&#xff0c;識別出共性的問題。 根據分析的角度不同&#xff0c;也會有不同的分類方法&#xff0c;僅供參考&#xff1a; 發生階段&#xff1a;冒煙測試、迭代測試、SIT測試、UAT測試、生產&#xff1b;根據BUG的發生階段&#xff0c;我…

使用fopen等標準C庫來操作文件

fopen 需要的頭文件&#xff1a; #include <stdio.h> 函數原型&#xff1a; FILE *fopen(const char *pathname, const char *mode); 參數&#xff1a; pathname: 文件路徑mode: “r” &#xff1a;以只讀方式打開文件&#xff0c;該文件必須存在。“w” &#xff…

騰訊出了一個新聊天軟件M8

眾所周知&#xff0c;如今國內互聯網&#xff0c;微信和QQ無疑是社交領域的霸主。 下載:https://www.123pan.com/s/BP5A-RW4xh.html 不過&#xff0c;它們也有各自局限性&#xff0c;比如難以結識新朋友、功能過于復雜等。 這讓用戶產生厭倦&#xff0c;再加上近幾年AI、元宇…

PHP之PHPExcel

include PHPExcel.php; include PHPExcel/Writer/Excel2007.php; //或者include PHPExcel/Writer/Excel5.php; 用于輸出.xls的 //創建一個excel $objPHPExcel new PHPExcel(); // 輸出Excel表格到瀏覽器下載 header(Content-Type: application/vnd.ms-excel); header(Content-…

使用requests如何實現自動登錄

不知道大家有沒有注意到&#xff0c;好多網站我們登錄過后&#xff0c;在之后的某段時間內訪問該網頁時&#xff0c;不會給出請登錄的提示&#xff0c;時間到期后就會提示請登錄&#xff01;這樣在使用爬蟲訪問網頁時還要登錄&#xff0c;打亂我們的節奏&#xff0c;那么如何使…

考研408 | 【計算機網絡】 數據鏈路層

導圖&#xff1a; 數據鏈路層概念&#xff1a; 結點&#xff1a;主機、路由器 鏈路&#xff1a;網絡中兩個結點之間的物理通道&#xff0c;鏈路的傳輸介質主要有雙絞線、光纖和微波。分為有線鏈路、無線鏈路。 數據鏈路&#xff1a;網絡中兩個結點之間的邏輯通道&#xff0…

河道水位自動監測預警 yolov5

河道水位自動監測預警系統基于yolov5網絡模型AI視頻智能水尺讀數技術&#xff0c;河道水位自動監測預警系統通過在河道周邊布設監控攝像頭&#xff0c;實時監測水位的變化&#xff0c;一旦水位超過預設閾值&#xff0c;將自動發出預警信號&#xff0c;并提示相關人員采取相應的…

Three.js 實現材質邊緣通道發光效果

相關API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后處理的通用框架&#xff0c;用于將多個渲染通道&#xff08;pass&#xff09;組合在一起創建特定的視覺效果&#xff09; 2. RenderPass(是用于渲染場景的通道。它將場景和相機作為輸入&#xff0c;使用Three.…

使用script標簽解決跨域問題,但是只能使用get請求,且不需要獲取get請求的數據,例如埋點,只需要觸發后發送get請求,而不需要獲取返回的參數

在項目中&#xff0c;使用埋點的時候&#xff0c;因為使用的是外部提供的接口&#xff0c;所以直接請求的時候&#xff0c;前端會報跨域的問題&#xff0c;本著不麻煩后端的想法&#xff0c;怎怎么前端實現跨域而完全不需要后段的配合&#xff0c;這時候就想到了通過script標簽…

【簡單認識zookeeper+kafka分布式消息隊列集群的部署】

文章目錄 一、zookeeper1、定義2、工作機制3、Zookeeper 特點4、Zookeeper 數據結構5、Zookeeper 應用場景6、Zookeeper 選舉機制&#xff08;1&#xff09;第一次啟動選舉機制&#xff08;2&#xff09;非第一次啟動選舉機制 7、部署zookeeper群集 二、消息隊列概述1、為什么需…

百度云盤發展歷程與影響

摘要&#xff1a; 百度云盤作為中國領先的云存儲與共享服務提供商&#xff0c;自其創立至今經歷了多個階段的發展與變革。本論文通過對百度云盤的歷史回顧與分析&#xff0c;探討了其在技術、商業模式、用戶體驗以及對社會的影響等方面的演變。同時&#xff0c;還分析了在競爭激…

使用luarocks安裝cjson并使用cjson

1.luarocks安裝 wget https://luarocks.org/releases/luarocks-3.3.1.tar.gz --no-check-certificatels -lrthtar -xvf luarocks-3.3.1.tar.gz mv luarocks-3.3.1 /usr/local/cd /usr/local/luarocks-3.3.1/./configure --prefix/usr/local/luarocks-3.3.1 vim /etc/profilePAT…

Mac下??Git如何下載/上傳遠程倉庫

使用終端檢查電腦是否安裝Git git --version 通過此文章安裝Git ?? ???????傳送門&#x1f310; 方式1??使用終端操作 1.下載——克隆遠程倉庫到本地 git clone [遠程地址] 例&#xff1a;git clone https://gitee.com/lcannal/movie.git? 2.編…

Windows - UWP - 為UWP應用創建桌面快捷方式

Windows - UWP - 為UWP應用創建桌面快捷方式 前言 這是一個較為簡單的方式&#xff0c;不需要過多的命令行。 How 首先Win R -> shell:AppsFolder -> 回車&#xff0c; 這將顯示電腦上的已安裝應用&#xff08;Win32 & UWP&#xff09;&#xff1a; 找到想要創建…