算法的時間復雜度和空間復雜度的原理

一、算法分析

如何判斷一個算法的好壞呢?首先算法必須要正確,這是最基本的要求。其次:

  1. 算法花費的時間
  2. 算法占用的空間小(輔助存儲空間)
  3. 算法要容易調試,測試,理解,編碼,維護等

二、時間復雜度

1、語句頻度

一個算法的執行時間理論上是無法計算出來的,只有上機測試才能知道。但實際上也沒有必要對所有算法上機測試(因為不同的計算機CPU情況是不一樣的),只需要知道在相同條件下,哪個算法執行的時間長就可以了。并且一個算法的執行時間與算法的語句執行次數成正比,比較語句的執行次數就可以了。

語句頻度是指該語句在整個算法執行過程中的執行次數,可以用所有語句的語句頻度之和來衡量一個算法的執行時間。

		for (int i = 0; i < n; i++) {for (int j = 1; j < n; j++) {a = 0;}}

語句for (int i = 0; i < n; i++)的語句頻度為n+1,語句for (int j = 1; j < n; j++)的語句頻度為n的平方,語句a = 0的語句頻度為n*(n-1),所以該算法的語句頻度(相當于算法的時間耗費)為:T(n)=2*n的平方+1

2、時間復雜度

上面提到的時間頻度中,當n(問題規模)不斷變化時,T(n)也會不斷變化。為了弄清它變化時有什么規律,引入了時間復雜度的概念。

設T(n)的一個輔助函數為f(n),定義當n大于等于某一個正整數n0時,存在正的常數C,使得0<=T(n)<=Cf(n),則稱f(n)是T(n)的同數量級函數。把T(n)表示成數據量級的形式為:

T(n)=O(f(n))

其中O為Order(數據量級)的第一個字母,其含義是算法的執行時間T(n)與函數f(n)成正比。因此定義時間復雜度為T(n)=O(f(n)),f(n)一般是算法中所有語句中最大的語句頻度。

通常情況下,隨著問題規模n的增大,算法耗時T(n)增長最慢的算法是最優的算法。

下面舉例說明常見的時間復雜度:

  • 常數階
int a = 1;
int b = 2;
int c = 3;

這類代碼即使有幾萬行十幾萬行,也不會隨著某個變量n的增加而增加。所以時間復雜度為:T(n)=O(1)

  • 線性階
for(i=1; i<=n; i++) {j = i;j++;
}

j = i和j++都會執行n次,最大的語句頻度是n,所以時間復雜度為:T(n)=O(n)

  • 對數階
int i = 1;
while(i < n) {i = i * 2;
}

語句i = i * 2會執行log2n次,最大的語句頻度是log2n,但是通常時間復雜度為:T(n)=O(logn),將底數給省略了。這是因為時間復雜度反應的是算法執行時間T(n)隨著問題規模n的變化規律,log2n是log3n的log23倍,log23是常數,所以log2n和log3n是同一數量級的,省略了底數之后同樣能反映這種變化規律。

  • 平方階
		for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {a = 0;}}

語句a=0會執行n的平方次,最大的語句頻度是n的平方,所以時間復雜度為:T(n)=O(n2)

ps:算法的執行時間有時候不光跟問題規模有關,還跟輸入的數據有關,不做說明的話,時間復雜度通常指的是數據最壞情況下的時間復雜度,因為算法的執行時間不可能超過最壞情況下的執行時間。

三、空間復雜度

由于數據實際占用空間與操作系統的軟件(編譯系統),硬件(字節)密切相關,故算法的實際占用空間無法準確判斷。通常衡量算法的空間使用情況不是實際占用空間,而是指整個算法用于輔助的存儲單元個數。

類似于時間復雜度的概念,可提出空間復雜度的概念來衡量算法占用的空間:

S(n)=O(f(n))

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

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

相關文章

5條件篩選功能_一分鐘,徹底學會Excel高級篩選,坐等升職加薪!

Excel中高級篩選是普通篩選的加強&#xff0c;能夠實現更加復雜的篩選功能。請您看下面的示例圖&#xff1a;數據示例圖如果要求篩選出班級為2班且語文成績大于100分的數據&#xff0c;那么使用普通篩選連續篩選兩次就可以得到結果。請您看下面的操作演示&#xff1a;普通篩選操…

數據結構之樹【完善中】

一、樹的概念 樹是一種分組的層次結構。 樹的定義&#xff1a; 樹是n(n>0)個數據元素的集合,在任意一棵非空樹中&#xff0c;有如下特征 有且只有一個根結點&#xff08;無前驅結點&#xff09;當n>1時&#xff0c;其他結點被分為若干個互不相交集合&#xff0c;并且…

phpgif圖片包_PHP生成GIF動態圖片驗證碼

1 <?php2 /**3 * 調用示例4 **/5 session_start();6 $randCode ;7 //驗證碼隨機8 $str"abcdefghjkmnpqrstuvwsyzABCDEFGHJKMNPQRSTUVWSYZ23456789";9 for($i0;$i<4;$i){10 $safe.substr($str,rand(0,strlen($str)),1);11 }12 $_SESSION["imgcode"]…

工程圖標注粗糙度_Inventor教程之工程圖標注實例

1工程圖標注實例對以下實體零件進行全部的標注演示。操作步驟如下&#xff1a;(1)打開文件。運行Inventor&#xff0c;單擊“快速入門”選項卡“啟動”面板上的“打開”按鈕&#xff0c;在“打開”對話框中選擇“實體零件”&#xff0c;單擊“打開”按鈕進入實體零件。(2)新建工…

Oracle數據庫 invalid character問題解決

今天使用PL/SQL Developer這個工具來操作Oracle數據時發現了一個問題&#xff1a; select * from tb_student_grade pivot(max(grade) for course in(math as 數學,chinese as 語文,english as 英語)); 執行這個SQL語句提示invalid character,原因是我的數據庫編碼是AMERICAN…

定時線程_SpringBoot定時任務,@Async多線程異步執行

一、使用SpringBoot實現定時任務這個不是重點&#xff0c;就簡單的實現一下&#xff0c;至于cron表達式怎么寫也不是重點&#xff0c;自行百度即可。1-1、基于 Scheduled 注解的方式import org.springframework.scheduling.annotation.EnableScheduling;import org.springframe…

SpringBoot入門一

SpringBoot能夠很簡單的創建一個直接運行的單體Spring應用 特性&#xff1a; 單體Spring應用內置的tomcat、Jetty提供默認的starter來構建配置自動配置Spring和第三方庫 推薦一個很好的學習教程&#xff0c;https://blog.csdn.net/u010486495/article/details/79348302 1 構…

mysql怎么把datetime類型轉換_mysql怎樣實現time轉datetime

mysql實現time轉datetime的方法&#xff1a;使用在sql語句中【FROM_UNIXTIME(時間值)】&#xff0c;代碼為【insert into test(time) values(FROM_UNIXTIME(%d))",time(NULL)】。mysql實現time轉datetime的方法&#xff1a;FROM_UNIXTIME(time(NULL))將liunx系統的time_t類…

SpringBoot入門二

參考Spring Boot Starters - 御坂研究所 創建自己的starter starter是依賴的一種synthesize&#xff08;合成&#xff09;。 starter會把需要用到的依賴全部包含進來&#xff0c;避免開發者自己手動引入依賴。 starter的邏輯 pom.xml<parent><groupId>org.spri…

Tomcat入門

一&#xff0c;tomcat啟動 雙擊startup.bat,如果出現一閃而過的情況&#xff0c;在文件的末尾添加pause&#xff0c;就可以看到環境變量設置的路徑是否正確 如果無法在電腦的高級系統設置中設置環境變量&#xff0c;可以在setclasspath.bat中設置環境變量 set JAVA_HOMEC:\P…

php mysql 圖像_將圖像插入MySQL并使用PHP檢索圖像

此文可能比較繁瑣&#xff0c;有更好的方法&#xff0c;但是出于教程目的&#xff0c;這是我的"“最佳實踐”的路線。今天&#xff0c;我們將討論一個似乎每個人都有些困惑的話題……在MySQL中存儲BLOB圖像&#xff0c;然后使用PHP再次顯示它們。盡管始終建議不要這樣做&a…

利用Maven逆向工程生成mybatis映射文件

一&#xff0c;pom.xml 注意修改逆向工程配置文件的路徑 <build><pluginManagement><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1…

mysql update多個表_mysql update 多表 (復制)

定我們有兩張表&#xff0c;一張表為Product表存放產品信息&#xff0c;其中有產品價格列Price&#xff1b;另外一張表是ProductPrice表&#xff0c;我們要將ProductPrice表中的價格字段Price更新為Price表中價格字段的80%。在Mysql中我們有幾種手段可以做到這一點&#xff0c;…

ORA-00907:missing right parenthesis缺少右括號

一&#xff0c;有嵌套查詢&#xff0c;并且子查詢中用了union all合并兩個查詢時&#xff0c;前一個查詢用了order by&#xff0c;那么會報錯并提示ORA-00907:missing right parenthesis缺少右括號&#xff1a; select * from ( select t.* from emp t where t.jobMANAGER ord…

mysql重復記錄大于十的數據庫_面試官:在使用mysql數據庫時,遇到重復數據怎么處理?...

前言前段時間&#xff0c;很多人問我能不能寫一些數據庫的文章&#xff0c;正好自己在測試mysql數據庫性能的時候&#xff0c;出現了一個問題&#xff0c;也就是出現了很多重復的數據&#xff0c;想起來自己long long ago寫過一篇類似的&#xff0c;僅此就拿來總結了一下。如果…

線程組的概念

一&#xff0c;線程組和線程的結構&#xff1a;樹形結構 每個Thread必然存在于一個ThreadGroup中&#xff0c;Thread不能獨立于ThreadGroup存在。 執行main()方法線程的名字是main 如果在new Thread時沒有顯式指定&#xff0c;那么默認將父線程&#xff08;當前執行new Threa…

mysql中ak替換鍵_數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束...

數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束數據庫:唯一性約束所謂唯一性約束(unique constraint)不過是數據表內替代鍵的另一個名稱而已。替代鍵(alternate key)可以是數據表內不作為主鍵的其他任何列&#xff0c;只要該鍵對該數據表唯一即可…

Oracle自定義類型

Oracle自定義類型可以通過type/create type來聲明或者創建 一&#xff0c;四種創建方式 1.1&#xff0c;使用create type創建object類型 create or replace type obj_type as object(id number,name varchar2(50 byte),birthday date); 1.2&#xff0c;使用create type創建…

Oracle/mysql查詢語句的執行過程

執行順序 from on join/pivot/unpivot(mysql沒有pivot和unpivot) where group by having select distinct order by limit&#xff08;oralce沒有&#xff09; 書寫順序 select distinct <select_list> from <left_table> <join_type>join <righ…

mysql定時sql腳本_定時執行的SQL腳本

因為要同步一個表&#xff0c;所以每天要同步一次數據&#xff0c;但是對SQL不是精通的我&#xff0c;為了測試寫了一段代碼來測試定時功能創建一個存儲過程&#xff0c;是用來插數據的&#xff0c;沒有輸出和輸出參數create or replace procedure temp_pro asbegininsert into…