時間空間復雜度概述

找個時間寫一寫時間復雜度和一些問題分類,也普及一下這方面知識。

如何衡量一個算法好壞

很顯然,最重要的兩個指標:需要多久可以解決問題、解決問題耗費了多少資源

那我們首先說第一個問題,要多長時間來解決某個問題。那我們可以在電腦上真實的測試一下嘛,多種方法比一比,用時最少的就是最優的啦。

但是沒必要,我們可以通過分析計算來確定一個方法的好壞,用O()表示,括號內填入N、1,等式子。

這到底是什么意思呢?

簡單來說,就是這個方法,時間隨著數據規模變化而增加的快慢。時間可以當成Y,數據規模是X,y=f(x),就這樣而已。但是f(x)不是準確的,只是一個大致關系,y=10x,我們也視作x,因為他的增長速度還是n級別的。現在就可以理解了:一般O(N)就是對每個對象訪問優先次數而已。請注意:O(1)它不是每個元素訪問一次,而是Y=1的感覺,y不隨x變化而變化,數據多大它的時間是不變的,有限的常數操作即可完成。

那我們就引入正規概念:

時間復雜度是同一問題可用不同算法解決,而一個算法的質量優劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進算法。

計算機科學中,算法的時間復雜度是一個函數,它定性描述了該算法的運行時間。這是一個關于代表算法輸入值的字符串的長度的函數。時間復雜度常用大O符號表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間復雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。

注意:文中提到:不包括這個函數的低階項和首項系數。什么意思呢?就是說10n,100n,哪怕1000000000n,還是算做O(N),而低階項是什么意思?不知大家有沒有學高等數學1,里面有最高階無窮大,就是這個意思。舉個例子。比如y=n*n*n+n*n+n+1000

就算做o(n*n*n),因為增長速率最大,N*N及其它項增長速率慢,是低階無窮大,n無限大時,忽略不計。

?

那接著寫:o(n*n*n)的算法一定不如o(n)的算法嗎?也不一定,因為之前說了,時間復雜度忽略了系數,什么意思?o(n)可以是10000000n,當n很小的時候,前者明顯占優。

所以算法要視實際情況而定。

算法的時間 復雜度常見的有:
常數階 O(1),對數階 O(log n),線性階 O(n),
線性對數階 O(nlog n),平方階 O(n^2),立方階 O(n^3),…,
k 次方階O(n^k),指數階 O(2^n),階乘階 O(n!)。

常見的算法的時間 復雜度之間的關系為:
?????? O(1)<O(log n)<O(n)<O(nlog n)<O(n^2)<O(2^n)<O(n!)<O(n^n)?

?

我們在競賽當中,看見一道題,第一件事就應該是根據數據量估計時間復雜度。

計算機計算速度可以視作10^9,如果數據量是10000,你的算法是O(N*N),那就很玄,10000*10000=10000 0000,別忘了還有常數項,這種算法只有操作比較簡單才可能通過。你可以想一想O(nlog n)的算法一般就比較穩了。那數據量1000,一般O(N*N)就差不多了,數據量更小就可以用復雜度更高的算法。大概就這樣估算。

?

當 n 很大時,指數階算法和多項式階算法在所需時間上非常
懸殊。因此,只要有人能將現有指數階算法中的任何一個算法化
簡為多項式階算法,那就取得了一個偉大的成就。

體會一下:

?

空間復雜度也是一樣,用來描述占空間的多少。

注意時間空間都不能炸。

所以才發明了那么多算法。

符上排序算法的時間空間表,體會一下:

?


排序博客:加深對時間空間復雜度理解

https://blog.csdn.net/hebtu666/article/details/81434236

?

?

相關擴展:https://blog.csdn.net/hebtu666/article/details/82465495

?

?

?

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

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

相關文章

二叉樹遍歷算法總結

文章目錄前提要素深度優先搜索DFS經典遍歷算法前序遍歷遞歸版迭代版中序遍歷遞歸版迭代版后序遍歷遞歸版迭代版Morris遍歷算法中序遍歷前序遍歷后序遍歷廣度優先搜索BFS按層遍歷參考資料前提要素 本文代碼用Java實現。 //二叉樹節點結構 public static class TreeNode {publi…

時間復雜度 P/NP/NPC

你會經常看到網上出現“這怎么做&#xff0c;這不是NP問題嗎”、“這個只有搜了&#xff0c;這已經被證明是NP問題了”之類的話。你要知道&#xff0c;大多數人此時所說的NP問題其實都是指的NPC問題。他們沒有搞清楚NP問題和NPC問題的概念。NP問題并不是那種“只有搜才行”的問…

kmp1-HDU1711 HDU1686 HDU2087 HDU3746

HDU 1711 kmp模板題 http://acm.hdu.edu.cn/showproblem.php?pid1711 #include<stdio.h> #include<string.h> #define N 1000005 int s[N]; int p[N]; int next[N]; int m,n; void getnext(){int j0,k-1;next[0]-1;while(j<m){if(k-1||p[j]p[k]){j;k;next[j]…

kmp2-HDU1358 HUST1010 POJ2406 POJ2752

HDU1358 http://acm.hdu.edu.cn/showproblem.php?pid1358 先構造出 next[] 數組&#xff0c;下標為 i&#xff0c;定義一個變量 j i - next[i] 就是next數組下標和下標對應值的差&#xff0c;如果這個差能整除下標 i&#xff0c;即 i%j0 ,則說明下標i之前的字符串&#xff0…

18暑期培訓總結

暑假一共直播講了七次課&#xff0c;每次一小時到一個半小時&#xff0c;前六次講解python主要實用語法&#xff0c;最后一次講了學習方法和簡單基礎的思想和算法。由于時間有限&#xff0c;不能做到很好&#xff0c;請見諒。 學院做題網站&#xff1a;橙白oj http://oj.acm-i…

第七次課 課上代碼

時間空間復雜度&#xff08;例子&#xff1a;1-n求和&#xff09; 復雜度&#xff1a;https://blog.csdn.net/hebtu666/article/details/82463970 https://blog.csdn.net/hebtu666/article/details/82465495 二分 一個數組查找某個值1 2 3 5 6 7 8 9 10 15 20。。 查找11 …

數據結構課上筆記1

第一節課復習了c語言的一些知識&#xff0c;并簡單介紹了數據結構這門課程。 1、引用和函數調用&#xff1a; 1.1引用&#xff1a;對一個數據建立一個“引用”&#xff0c;他的作用是為一個變量起一個別名。這是C對C語言的一個重要補充。 用法很簡單&#xff1a; int a 5; …

并查集實現

并查集是什么東西&#xff1f; 它是用來管理元素分組情況的一種數據結構。 他可以高效進行兩個操作&#xff1a; 查詢a&#xff0c;b是否在同一組合并a和b所在的組 萌新可能不知所云&#xff0c;這個結構到底有什么用&#xff1f; 經分析&#xff0c;并查集效率之高超乎想象…

字符串上的簡單動態規劃

因為數據結構快學串了&#xff0c;以前又做過一些字符串dp的題&#xff0c;今天突然就想把它們寫在一起吧。 直接開始 問題1&#xff1a;給兩個字符串&#xff0c;求最長公共子串 問題2&#xff1a;給兩個字符串&#xff0c;求最長公共子序列 問題3&#xff1a;給一個字符串…

線段樹簡單實現

首先&#xff0c;線段樹是一棵滿二叉樹。&#xff08;每個節點要么有兩個孩子&#xff0c;要么是深度相同的葉子節點&#xff09; 每個節點維護某個區間&#xff0c;根維護所有的。 如圖&#xff0c;區間是二分父的區間。 當有n個元素&#xff0c;初始化需要o(n)時間&#xf…

樹狀數組實現

樹狀數組能夠完成如下操作&#xff1a; 給一個序列a0-an 計算前i項和 對某個值加x 時間o(logn) 注意&#xff1a;有人覺得前綴和就行了&#xff0c;但是你還要維護啊&#xff0c;改變某個值&#xff0c;一個一個改變前綴和就是o(n)了。 線段樹樹狀數組的題就是這樣&#x…

數據結構課上筆記2

今天繼續說明了一些基本概念&#xff0c;講解了時間空間復雜度。 &#xff08;對于概念的掌握也很重要&#xff09; 元素之間的關系在計算機中有兩種表示方法&#xff1a;順序映像和非順序映像&#xff0c;由此得到兩種不同的儲存結構&#xff1a; 順序存儲結構和鏈式存儲結構…

雙端單調隊列

上次我們介紹了單調棧結構https://blog.csdn.net/hebtu666/article/details/82717317 這次介紹一種新的數據結構&#xff1a;雙端隊列&#xff1a;雙端隊列是指允許兩端都可以進行入隊和出隊操作的隊列&#xff0c;其元素的邏輯結構仍是線性結構。將隊列的兩端分別稱為前端和后…

KMP子字符串匹配算法學習筆記

文章目錄學習資源什么是KMP什么是前綴表為什么一定要用前綴表如何計算前綴表前綴表有什么問題使用next數組來匹配放碼過來構造next數組一、初始化二、處理前后綴不相同的情況三、處理前后綴相同的情況使用next數組來做匹配代碼總覽測試代碼時間復雜度分析學習資源 字符串&…

數組實現隊列

數組實現隊列結構&#xff1a; 相對棧結構要難搞一些&#xff0c;隊列的先進先出的&#xff0c;需要一個數組和三個變量&#xff0c;size記錄已經進來了多少個元素&#xff0c;不需要其它萌新看不懂的知識。 觸底反彈&#xff0c;頭尾追逐的感覺。 循環使用數組。 具體解釋…

棧/隊列 互相模擬實現

用兩個棧來實現一個隊列&#xff0c;完成隊列的Push和Pop操作。 隊列中的元素為int類型。 思路&#xff1a;大概這么想&#xff1a;用一個輔助棧把進第一個棧的元素倒一下就好了。 比如進棧1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 第一個棧&#xff1a; 5 …

數據結構課上筆記3

這節課介紹了線性表結構和順序表示的一部分內容。 操作太多&#xff0c;而且書上有&#xff0c;就不一一介紹分析了。 線性表定義&#xff1a;n個數據元素的有限序列。 特點&#xff1a; 存在唯一一個稱作“第一個”的元素。存在唯一一個稱作“最后一個”的元素除最后一個元…

內存分區

之前一直比較懵&#xff0c;想想還是單獨寫一個短篇來記錄吧 一般內存主要分為&#xff1a;代碼區、常量區、靜態區&#xff08;全局區&#xff09;、堆區、棧區這幾個區域。 代碼區&#xff1a;存放程序的代碼&#xff0c;即CPU執行的機器指令&#xff0c;并且是只讀的。 常…

棧的排序

一個棧中元素的類型為整型&#xff0c;現在想將該棧從頂到底按從大到小的順序排序&#xff0c;只許申請一個棧。除此之外&#xff0c;可以申請新的變量&#xff0c;但是不能申請額外的數據結構&#xff0c;如何完成排序&#xff1f; 思路&#xff1a; 將要排序的棧記為stack,申…

雙鏈表實現

以前寫的不帶頭的單鏈表實現&#xff0c;當時也啥也沒學&#xff0c;好多東西不知道&#xff0c;加上一心想壓縮代碼&#xff0c;減少情況&#xff0c;所以寫得不太好。 請教了老師&#xff0c;首先是命名問題和代碼緊湊性等的改進。還有可讀性方面的改進&#xff0c;多寫了一…