米利唐_后腰_乌克兰足球超级联赛_中国竞彩欧赔 - 足球竞彩分析

集團官網(wǎng)
  • 國家級全民數(shù)字素養(yǎng)與技能培訓基地
  • 河南省第一批產(chǎn)教融合型企業(yè)建設(shè)培育單位
  • 鄭州市數(shù)字技能人才(碼農(nóng))培養(yǎng)評價聯(lián)盟

怎樣進行算法的復雜度分析?

編輯:云和數(shù)據(jù) 日期:2023-03-10 17:50

復雜度分析是估算算法執(zhí)行效率的方法,公式O(f(n))表示算法的復雜度,此方法即為大O復雜度表示法O(f(n))中n表示數(shù)據(jù)規(guī)模,f(n)表示運行算法所需要執(zhí)行的指令數(shù)。

大O復雜度表示法

下面的代碼非常簡單,求 1,2,3…n 的累加和,我們要做的是估算它的執(zhí)行效率。

def?calc(n):????sum_?=?0????for?i?in?range(1,n+1):????????sum_?=?sum_?+?i????return?sum_

假設(shè)每行代碼執(zhí)行的時間都一樣為t,執(zhí)行第2行代碼需要時間t,第3,4行代碼運行了n遍,需要的時間為2n*t,這段代碼總執(zhí)行時間為(2n+1)* t

結(jié)論:代碼執(zhí)行的總時間T(n)與每行代碼的執(zhí)行次數(shù)成正比

看下面的代碼,估算該段代碼的執(zhí)行時間:

def?calc(n):????sum_?=?0????for?i?in?range(n):????????for?j?in?range(n):????????????sum_?=?sum_?+?i*j????return?sum_

同樣假設(shè)每行代碼執(zhí)行的時間都一樣為t:執(zhí)行第2行代碼需要時間t,第3行代碼運行了n遍,需要時間為n*t,第4、5行代碼運行了n2次,需要時間為2n2 * t,執(zhí)行所有代碼的總時間為 (2n2 + n + 1)* t。

結(jié)論:代碼執(zhí)行的總時間T(n)與每行代碼的執(zhí)行次數(shù)成正比。

用O(f(n))來表示算法復雜度:

def?calc(n):????sum_?=?0????for?i?in?range(1,n+1):????????sum_?=?sum_?+?i????return?sum_
def?calc(n):????sum_?=?0????for?i?in?range(n):????????for?j?in?range(n):????????????sum_?=?sum_?+?i*j????return?sum_

T(n) = O(f(n)) , O表示代碼的執(zhí)行時間T(n) 與 f(n)表達式成比例。

大O復雜度表示法:上面例子中的T(n) = O(2n+1), 另一個 T(n) = O(2n2 + n + 1)。大O時間復雜度并不表示代碼真正的執(zhí)行時間,而是表示代碼執(zhí)行時間隨數(shù)據(jù)規(guī)模增長的變化趨勢,也叫作漸進時間復雜度(asymptotic time complexity),簡稱時間復雜度。

當數(shù)據(jù)量特別大, 也就是n的取值很大的時候,大O表示法中低階、常量、系數(shù)三部分并不會左右增長趨勢,可以忽略。

def?calc(n):????sum_?=?0????for?i?in?range(1,n+1):????????sum_?=?sum_?+?i????return?sum_
def?calc(n):????sum_?=?0????for?i?in?range(n):????????for?j?in?range(n):????????????sum_?=?sum_?+?i*j????return?sum_

上面例子中的T(n) = O(2n+1), 另一個 T(n) = O(2n2 + n + 1),用大O表示法表示上面兩段代碼的時間復雜度,可以記為O(n),O(n2)。

算法A: O(n) 執(zhí)行指令,10000*n

def?calc(n):????sum_?=?0????for?i?in?range(1,n+1):????????sum_?=?sum_?+?I??"""??此處省略n行...?...??"""????return?sum_

算法B: O(n2) 執(zhí)行指令數(shù),10*n2

對比上面兩個算法,當 n = 10, n=100 時, 算法B執(zhí)行的速度更快,n = 1000 時兩者速度相當

n = 104 , n = 105, n = 106 ,算法A執(zhí)行的速度更快的

隨著數(shù)據(jù)規(guī)模的進一步增大, 這個差距會越來越大

時間復雜度分析

如何分析一段代碼的時間復雜度?

在分析一個算法、一段代碼的時間復雜度時,只關(guān)注循環(huán)執(zhí)行次數(shù)最多的那一段代碼就可以了。

def?calc(n):????sum_?=?0????for?i?in?range(n):????????for?j?in?range(n):????????????sum_?=?sum_?+?i*j????return?sum_

上面的代碼中,我們只需要關(guān)注內(nèi)層for循環(huán)的時間復雜度就可以了,內(nèi)層for循環(huán)的兩行代碼被執(zhí)行了n2次,所以總的時間復雜度就是O(n2)

總復雜度等于量級最大的那段代碼的復雜度

def?calc(n):sum_?=?0????for?i?in?range(1,n+1):????????sum_?=?sum_?+?i????sum_1?=?0????for?i?in?range(1,n+1):????????for?j?in?range(n):????????????sum_1?=?sum_1?+?i*j????return?sum_+sum_1

上面的代碼分為兩部分,分別是求 sum_、sum_1,計算sum_部分的代碼段時間復雜度O(n),計算sum_1部分的代碼段時間復雜度為O(n2) ,總的時間復雜度由復雜度最大的部分決定, 所以上面代碼復雜度為O(n2)。

嵌套代碼的復雜度等于嵌套內(nèi)外代碼復雜度的乘積

def?fn(n):????sum_?=?0????for?i?in?range(n+1):????????sum_?=?sum_?+?i????return?sum_def?calc(n):????sum_?=?0????for?i?in?range(n+1):????????sum_?=?sum_?+?fn(i)????return?sum_

上面的代碼中第二個函數(shù)調(diào)用了第一個函數(shù), 如果把fn函數(shù)調(diào)用當作一個普通操作, 那么第二個函數(shù)的時間復雜度為O(n) Fn函數(shù)的時間復雜度為O(n),那么函數(shù)整體的時間復雜度為O(n*n) = O(n2)。

當兩段代碼的數(shù)據(jù)規(guī)模不同時,不能省略復雜度低的部分

def?calc(n):sum_?=?0????for?i?in?range(1,n+1):????????sum_?=?sum_?+?i????sum_1?=?0????for?i?in?range(1,m+1):????????for?j?in?range(m):????????????sum_1?=?sum_1?+?i*j????return?sum_+sum_1

上面的代碼分為兩部分,分別是求 sum_、sum_1,計算sum_部分的代碼段時間復雜度O(n),計算sum_1部分的代碼段時間復雜度為O(m2) ,總的時間復雜度由復雜度最大的部分決定, 所以上面代碼復雜度為O(m2+n)

相關(guān)內(nèi)容

搶先一步 鴻蒙(HarmonyOS)應用開發(fā)者高級認證 免費考! 適合人群計算機相關(guān)專業(yè)在校生(技師、中職、高職、本科、研究生)對鴻蒙(HarmonyOS)有興趣的非計算機相關(guān)專業(yè)在校生目前正在從事移動應用的開發(fā)者目前正在從事計算機行業(yè)相關(guān)的人計算機專業(yè)高校老師所有對鴻蒙(HarmonyOS)有興趣的人 培訓方案掌握鴻蒙的核心概念和端云一體化開發(fā)、... 什么是Java的多態(tài)性(polymorphism)?它有哪些不同的形式? 多態(tài)性是Java面向?qū)ο缶幊痰囊粋€重要概念,它允許不同的對象以一致的方式響應同一個方法調(diào)用,具體表現(xiàn)為對象在運行時可以表現(xiàn)出多個不同的形態(tài)。多態(tài)性主要有兩種不同的形式:編譯時多態(tài)性(靜態(tài)多態(tài)性)和運行時多態(tài)性(動態(tài)多態(tài)性)。1. 編譯時多態(tài)性(靜態(tài)多態(tài)性):   ... 如何學習和搭建Hadoop開發(fā)環(huán)境? Hadoop是大數(shù)據(jù)處理領(lǐng)域的重要平臺,能夠處理和分析大量數(shù)據(jù)。為了有效地利用Hadoop,我們需要學習其基礎(chǔ)知識,并正確搭建開發(fā)環(huán)境。下面是詳細的學習和搭建指南。一、學習Hadoop基礎(chǔ)掌握基礎(chǔ)概念和原理Hadoop主要由HDFS和MapReduce兩部分組成。HDFS是分布式文件系統(tǒng),Ma... UI 設(shè)計學習如何進階成為高手 我總結(jié)了六種方法,幫助你走出舒適區(qū),提高技能,成長為自信且經(jīng)驗豐富的UI設(shè)計高手一位經(jīng)驗豐富的 UI 設(shè)計師,往往十分看中應用程序界面的吸引力和視覺刺激,確保滿足用戶期望和需求。但是,如果你已經(jīng)在 UI 設(shè)計圈摸爬滾打多年,仍然沒有出色的作品,那你極有可能是因為陷入了一個舒適圈,UI技能一直原... 在Java中Executor和Executors的區(qū)別? 在Java中,Executor和Executors都與線程池和并發(fā)執(zhí)行有關(guān),但它們是不同的概念和類。1.ExecutorExecutor是一個接口,位于java.util.concurrent包中,用于表示一個執(zhí)行任務(wù)的執(zhí)行器。它只定義了一個方法:void execute(Runnable c... String類型的常見命令有哪些? String類型,也就是字符串類型,是Redis中最簡單的存儲類型。其value是字符串,不過根據(jù)字符串的格式不同,又可以分為3類:string是普通字符串,int整數(shù)類型,可以做自增、自減操作,float浮點類型,可以做自增、自減操作。String的常見命令有:SET:添加或者修改已經(jīng)存在的...