欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言數(shù)據(jù)結(jié)構(gòu)與算法之時間空間復(fù)雜度入門

 更新時間:2022年02月15日 12:24:08   作者:喬喬家的龍龍  
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)與算法之時間空間復(fù)雜度的入門教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

數(shù)據(jù)結(jié)構(gòu)與算法

終于開始搞這塊難啃的骨頭了,走上這條漫漫長路之前要明白:

什么是數(shù)據(jù)結(jié)構(gòu)?什么是算法?

是數(shù)據(jù)之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素集合,為編寫出一個“好”的程序,必須分析待處理對象的特性及各處理對象之間存在的關(guān)系,這也就是研究數(shù)據(jù)結(jié)構(gòu)的意義所在為編寫出一個“好”的程序,必須分析待處理對象的特性及各處理對象之間存在的關(guān)系這也就是研究數(shù)據(jù)結(jié)構(gòu)的意義所在

算法是解決特定問題求解步驟的描述,在計算機中表現(xiàn)為指令的有限序列 ,并且每條指令表示一個或多個操作

拋開上面的學術(shù)性口水話,簡單來說就是:

1.數(shù)據(jù)結(jié)構(gòu)是計算機存儲,組織數(shù)據(jù)的方式

2.算法是一系列規(guī)定的計算步驟,為了實現(xiàn)的特定的計算目的而應(yīng)用

給個更直觀的視圖就是:算法+數(shù)據(jù)結(jié)構(gòu)就等于程序,數(shù)據(jù)結(jié)構(gòu)可以理解為實現(xiàn)一個程序的基本單位,算法可以看作一個加工過程。

比如我去從一個很大的數(shù)組里面提取某個特定的對象,我們既可以老老實實從頭到尾遍歷查找,也就是所謂的暴力搜索,工程量隨著數(shù)組的容量增大而增大;我們也可以巧奪智取,用二分查找讓我們工作事半功倍。

分析維度

在知道基本概念后,我們說在拿到一個算法后,我們怎么去看他的好壞?或者給你多個算法,他們都實現(xiàn)同一個功能,我們怎么去判斷他的優(yōu)缺點去取舍呢?正常情況下,我們會選擇把這個代碼放在某個環(huán)境下運行比較時間,但這個做法有一個致命的缺點,在我們不同機器上,會有不同的結(jié)果,在好的機器上,運行時間會很短,但是在比較差一點的主機上,就稍有遜色,這樣一來就有失公平。

大O的漸進表示法

不要直接計算時間,,我們需要去計算一個漸進的時間復(fù)雜度,也就是所謂的Big O (大O表示法),他其實本質(zhì)上實在求一個量級(時間)在增加時的一個變化趨勢

時間復(fù)雜度公式:T(n)=O(f(n))

T(n):時間頻度(執(zhí)行次數(shù))
n :問題規(guī)模;
f(n):T(n)的同數(shù)量級函數(shù);
O :代表正比例關(guān)系;
O(f(n)):即算法的漸進時間復(fù)雜度

常數(shù)階

我們的算加法的完整過程:

int main()
{
int a = 1;
int b = 1;
int sum = a+b;
printf("%d",sum);
}

我們每走一步就會執(zhí)行一次,上面的代碼我就執(zhí)行了四次;那么如果我把他的sum部分重復(fù)執(zhí)行數(shù)十次數(shù)百次數(shù)千次,但他本質(zhì)上和執(zhí)行四次沒有區(qū)別,執(zhí)行時間是恒定的,這個層面上,他的時間復(fù)雜度就是O(1)(常數(shù)階)。

不管這個常數(shù)是多少,4或∞,都不能寫成O(4)、O(∞),都要寫成O(1)

線性階

我們給出一個 for loop

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

分析線性階時會比常數(shù)階更復(fù)雜因為要分析他的循環(huán)結(jié)構(gòu),上面的代碼限制再++,總共執(zhí)行3次,包括常數(shù)階的賦值就是O(3n+1),在我的n足夠大時他會無限接近于無窮,這時的+1就會沒有意義。

這時就順理成章,嵌套循環(huán)我們也就可以理解了,兩層 for 就是O(n2),三層就是O(n2)for 下面加一個雙層for循環(huán)就是O(n+n2)……這里面就包含了**平方階**;此時我O(n)的效率就比O(n2)高。

對數(shù)階

我們再給出一個while loop

int n = 0;
while(n<100000)
{
n*=2;
}

我們要看執(zhí)行次數(shù)就要看多少步才能走出循環(huán),就意味著要乘 x 個2能>=10000,則表示為 2^x =100000,假設(shè)為隨機數(shù) a,則 x= log 2 ^a,
復(fù)雜度為O(logn)

除了上面三種之外還有其他的復(fù)雜度

在這里插入圖片描述

從常數(shù)階到階乘是越來越復(fù)雜,我們看一下直觀數(shù)據(jù):

在這里插入圖片描述

這里橫軸是輸入(input)量級,縱軸是消耗時間也就是時間復(fù)雜度,也就是有個很直觀的信息:算法復(fù)雜度越高,需要的時間越長,到后面就直接指數(shù)級增長。

其他時間復(fù)雜度指標

雖然有下面這些種吧,但我們主要會把重心放在 O 上,畢竟它是最常用的指標。

在這里插入圖片描述

空間復(fù)雜度

空間復(fù)雜度是指內(nèi)存空間增長的趨勢,相對就容易理解一些,O(1)就是相當于單次賦值,而 O(n)相當于賦值n次,可以把他想成一個大小為 n 的數(shù)組,復(fù)雜度越高需要分配的空間就越多;同理,O(n^2)就可以想成一個n行n列的二維數(shù)組。

今天就到這里吧,摸了家人們,更多關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)與算法時間空間復(fù)雜度的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于c++11的event-driven library的理解

    基于c++11的event-driven library的理解

    這篇文章主要介紹了基于c++11的event-driven library的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++中signed?main和int?main的區(qū)別

    C++中signed?main和int?main的區(qū)別

    這篇文章介紹了C++中signed?main和int?main的區(qū)別,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • C++ AfxBeginThread的介紹/基本用法

    C++ AfxBeginThread的介紹/基本用法

    這篇文章主要簡單介紹了C++ AfxBeginThread的基本用法,十分的細致,有需要的小伙伴可以參考下。
    2015-06-06
  • C語言示例講解while循環(huán)語句的用法

    C語言示例講解while循環(huán)語句的用法

    在不少實際問題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語句。一組被重復(fù)執(zhí)行的語句稱之為循環(huán)體,C語言while語句可以是單個語句,也可以是一個語句塊,其條件可以是任意表達式,true是任意非零值,當條件為真時,循環(huán)進行迭代
    2022-06-06
  • C++智能指針詳解

    C++智能指針詳解

    從比較簡單的層面來看,智能指針是RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機制對普通指針進行的一層封裝。這樣使得智能指針的行為動作像一個指針,本質(zhì)上卻是一個對象,這樣可以方便管理一個對象的生命周期
    2022-08-08
  • C++設(shè)置事件通知線程工作的方法

    C++設(shè)置事件通知線程工作的方法

    這篇文章主要介紹了C++設(shè)置事件通知線程工作的方法,是Windows應(yīng)用程序設(shè)計中非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • Qt實戰(zhàn)案例之如何利用QProcess類實現(xiàn)啟動進程

    Qt實戰(zhàn)案例之如何利用QProcess類實現(xiàn)啟動進程

    這篇文章主要介紹了Qt實戰(zhàn)案例之如何利用QProcess類實現(xiàn)啟動進程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • EasyC++內(nèi)部鏈接性和無鏈接性

    EasyC++內(nèi)部鏈接性和無鏈接性

    這篇文章主要介紹了EasyC++內(nèi)部鏈接性和無鏈接性,當我們使用static關(guān)鍵字,將變量的作用于限制在整個文件時,該變量的鏈接性為內(nèi)部鏈接性,然而無鏈接性的變量其實就是在代碼塊當中使用static關(guān)鍵字創(chuàng)建的,接下來一起進入文章了解更多內(nèi)容吧
    2021-12-12
  • C++實現(xiàn)求動態(tài)矩陣各元素的和

    C++實現(xiàn)求動態(tài)矩陣各元素的和

    這篇文章主要為大家詳細介紹了C++實現(xiàn)求動態(tài)矩陣各元素的和,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語言模擬實現(xiàn)strstr函數(shù)的示例代碼

    C語言模擬實現(xiàn)strstr函數(shù)的示例代碼

    strstr是C語言中的函數(shù),作用是返回字符串中首次出現(xiàn)子串的地址。本文將用C語言模擬實現(xiàn)strstr函數(shù),感興趣的小伙伴可以跟隨小編一起學習一下
    2022-07-07

最新評論