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

C語言三分鐘精通時間復雜度與空間復雜度

 更新時間:2022年02月07日 15:14:12   作者:罅隙`  
算法復雜度分為時間復雜度和空間復雜度。其作用:?時間復雜度是度量算法執(zhí)行的時間長短;而空間復雜度是度量算法所需存儲空間的大小

一、時間復雜度

1)O(n)的含義

  • 程序消耗的時間用算法的操作單元數(shù)來表示
  • 假設數(shù)據(jù)的規(guī)模為n,則用f(n)表示操作單元數(shù)的大小,而f(n)常被簡化
  • O表示的是一般的情況,而不是上界或下界。并且它是在數(shù)據(jù)量級非常大的情況下所展現(xiàn)出的時間復雜度
  • 因為O代表的是一個一般的情況,所以當用例不同時,算法的時間復雜度不同,需要具體分析

2)復雜表達式的簡化

表達式簡化遵循以下兩個原則:

  • 去掉常數(shù)項
  • 只保留最高項

為例分析:

  • 去掉常數(shù)項后為
  • 只保留最高項后為

不難想象,當n趨一個非常大的數(shù)量級的時候,最高項將其決定性作用。但是若常數(shù)項也是一個非常大的數(shù)量級,那我們就不可以輕易將其舍去。

3)O(n)不一定優(yōu)于O(n^2)

        由上面簡化法則我們可以看到,常數(shù)項是被忽略的,如,當n < 20時前者的操作單位數(shù)是小于后者的。

所以在決定使用什么算法的時候并不是算法的時間復雜度越低越好,還需要考慮數(shù)據(jù)的規(guī)模

        那為什么我們默認時間復雜度低于呢?正如前面提到的關于O的定義:它是在數(shù)據(jù)量級非常大的情況下所展現(xiàn)出的時間復雜度,所以我們默認前者的時間復雜度更優(yōu)。

?4)遞歸的時間復雜度

?遞歸的時間復雜度 = 遞歸次數(shù) X 每次遞歸的操作次數(shù)。

現(xiàn)在我們從一道面試題來分析時間復雜度:求x的n次方

①直觀的for循環(huán)遍歷

int fuc1(int n)
{
	int ret = 1;
	for (int i = 1; i < n; i++)
		ret *= i;
	return ret;
}

【分析】時間復雜度為O(n),因為操作單元數(shù)為n次?

②遞歸版本1

int fuc2(int n,int x)
{
	if (n == 0)
		return 1;
	if (n == 1)
		return x;
	return x * fuc2(n - 1, x);
}

【分析】遞歸次數(shù)為n次,每次相乘的時間復雜度為O(1),所以時間復雜度仍為O(n)

?③遞歸版本2?

int fuc3(int n, int x)
{
	if (n == 0)
		return 1;
	if (n == 1)
		return x;
	if (n % 2 == 1)
		return fuc3(n / 2, x) * fuc3(n / 2, x) * x;//奇數(shù)次冪的情況
	return fuc3(n / 2, x) * fuc3(n / 2, x);		   //偶數(shù)次冪的情況
}

【分析】上面代碼的時間復雜度為嗎?我們可以畫二叉樹來理解,以n = 16為例?

每一個結(jié)點都表示需要進行一次遞歸,因此結(jié)點數(shù)代表著遞歸次數(shù),所以先我們計算二叉樹結(jié)點數(shù)?

  • 一顆滿二叉樹的結(jié)點數(shù)根據(jù)等比數(shù)列求和公式可以求出為:?(m為二叉樹深度)?
  • 二叉樹深度m 計算公式?:(向下取整)?

        因為n為奇數(shù)時我們將其拆成偶數(shù)處理,如:

將深度公式代入結(jié)點總和公式我們可以得出, 節(jié)點數(shù) = n - a(a為某個常數(shù)),所以時間復雜度還是

④遞歸版本3?

int fuc4(int n, int x)
{
	if (n == 0)
		return 1;
	else if (n == 1)
		return 1;
	int t = fuc4(n / 2, x);
	if (n % 2 == 1)
		return t * t * x;
	return t * t;
}

通過將遞歸操作抽離出來從而減少遞歸次數(shù),我們真正實現(xiàn)了時間復雜度為?

我們再分析一下求斐波那契數(shù)列函遞歸解法時間復雜度:?

int fib(int n)
{
	if (n <= 0)
		return 1;
	if (n == 1)
		return 1;
	return fib(n - 1) + fib(n - 2);
}

同樣的我們可以畫二叉樹來分析。求第k個斐波那契數(shù),我們不難想象,我們將構(gòu)造出一個深度為k的二叉樹,深度為k的二叉樹最多有個結(jié)點,所以我們得出該算法的時間復雜度為。優(yōu)化的思路和上述求x的n次方的思路一樣,主要是減少遞歸的調(diào)用次數(shù)?

int fib(int first, int second, int n)
{
	if (n <= 0)
		return 0;
	if (n < 3)
		return 1;
	else if (n == 3)
		return first + second;
	else
		return fib(second, first + second, n - 1);
}

二、空間復雜度

1)O(1)空間復雜度?

程序占用空間不隨n的變化而變化,即占用的空間是一個常數(shù)?

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

程序占用的空間與n無關,上圖中之涉及為j分配內(nèi)存空間,是一個固定的常量?

2)???????O(n)空間復雜度?

程序占用空間隨n增長而線性增長;?

int arr[n];

3)???????O(mn)空間 復雜度?

常常是定義一個二維集合,集合的大小與集合的長與寬相管?

int arr[row * col];

4)遞歸算法空間算法復雜度分析?

?遞歸算法空間復雜度 = 每次遞歸的空間復雜度 X 遞歸深度(遞歸調(diào)用棧的最大長度)

我們同樣來分析上面提到的求斐波那契數(shù)函數(shù)的空間復雜度:?

int f(int n)
{
	if (n <= 0)
		return 1;
	if (n == 1)
		return 1;
	return f(n - 1) + f(n - 2);
}

在遞歸的過程中依次將f(5),f(4), f(3),f(2),f(1)壓棧,每一次調(diào)用所占用的空間都為所以占用的空間為,所以上述代碼的空間復雜度為?

我們再來分析遞歸實現(xiàn)的二分查找的空間復雜度?:

int binary_search(int arr[], int l, int r, int x)
{
	if (r >= l)
	{
		int mid = l + (r - l) / 2; //避免先加后除產(chǎn)生溢出的錯誤
		if (arr[mid] == x)
			return mid;
		else if (arr[mid] < x)
			return binary_search(arr, mid + 1, r ,x);
		else
			return binary_search(arr, l, mid - 1, x);
	}
	return -1;
}

每次遞歸所占用的空間都是一定的,所以每次遞歸的空間復雜度為,而遞歸的最大深度為,所以空間復雜度為

到此這篇關于C語言三分鐘精通時間復雜度與空間復雜度的文章就介紹到這了,更多相關C語言 時間復雜度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言 不使用strcat函數(shù)實現(xiàn)連接兩個字符串功能代碼

    C語言 不使用strcat函數(shù)實現(xiàn)連接兩個字符串功能代碼

    今天小編就為大家分享一篇C語言 不使用strcat函數(shù)實現(xiàn)連接兩個字符串功能代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++中l(wèi)ist的用法實例講解

    C++中l(wèi)ist的用法實例講解

    list是順序容器的一種,list是一個雙向鏈表,使用list需要包含頭文件list,這篇文章主要給大家介紹了關于C++中l(wèi)ist的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • Qt QChart 創(chuàng)建圖表的實現(xiàn)方法

    Qt QChart 創(chuàng)建圖表的實現(xiàn)方法

    這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C語言指針詳解之野指針

    C語言指針詳解之野指針

    這篇文章主要為大家介紹了C語言野指針,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • FFmpeg實戰(zhàn)之利用ffplay實現(xiàn)自定義輸入流播放

    FFmpeg實戰(zhàn)之利用ffplay實現(xiàn)自定義輸入流播放

    ffplay是FFmpeg提供的一個極為簡單的音視頻媒體播放器,可以用于音視頻播放、可視化分析。本文將利用ffplay實現(xiàn)自定義輸入流播放,需要的可以參考一下
    2022-12-12
  • C語言實現(xiàn)打印數(shù)字金字塔

    C語言實現(xiàn)打印數(shù)字金字塔

    這篇文章主要介紹了C語言實現(xiàn)打印數(shù)字金字塔方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 基于openCV實現(xiàn)人臉檢測

    基于openCV實現(xiàn)人臉檢測

    這篇文章主要為大家詳細介紹了基于openCV實現(xiàn)人臉檢測的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言超詳細講解指向函數(shù)的指針

    C語言超詳細講解指向函數(shù)的指針

    C語言程序在編譯后,每個函數(shù)都有一個首地址(也就是函數(shù)第一條指令的地址),這個地址稱為函數(shù)的指針。可以定義指向函數(shù)的指針變量,使用指針變量間接調(diào)用函數(shù)
    2022-07-07
  • C語言連續(xù)子向量的最大和及時間度量實例

    C語言連續(xù)子向量的最大和及時間度量實例

    這篇文章主要介紹了C語言連續(xù)子向量的最大和及時間度量,需要的朋友可以參考下
    2014-09-09
  • C語言的字符空間與非字符空間你了解嗎

    C語言的字符空間與非字符空間你了解嗎

    這篇文章主要介紹了C語言的字符空間與非字符空間,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08

最新評論