国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了算法的時間復雜度和空間復雜度。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

本章重點

一 時間復雜度

2.1?時間復雜度的概念

2.2?大O的漸進表示法

2.3?常見的時間復雜度的計算

二 空間復雜度

三 常見復雜度對比

四 復雜度的oj練習

4.1?消失的數(shù)字

4.2?旋轉(zhuǎn)數(shù)字


每一天都是人生限定,每一天都值得100%努力


本章重點

(1)算法效率(2)時間復雜度(3)空間復雜度(4)常見的時間復雜度以及復雜度oj練習


? 衡量一個算法的好壞,是從時間和空間兩個維度來衡量的,即時間復雜度和空間復雜度。時間復雜度主要衡量一個算法運行的快慢,空間復雜度主要衡量一個算法運行所需要的額外空間。

一 時間復雜度

2.1?時間復雜度的概念

? 算法的時間復雜度是一個函數(shù)(指的是數(shù)學函數(shù)),算法中的基本操作的執(zhí)行次數(shù),為算法的時間復雜度。

void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < N; ++j)
		{
			++count;
		}
	}
	//N*N
	for (int k = 0; k < 2 * N; ++k)
	{
		++count;
	}
	//2*N
	int M = 10;
	while (M--)
	{
		++count;
	}
	//M=10
	printf("%d\n", count);
}

(1)時間復雜度表達式為:F(N) = N*N+2 * N + 10
(2)大O漸進表示法:O(N^2)

這個函數(shù)的基本操作次數(shù)是:F(N) = N*N+2 * N + 10,隨著N的增大,后兩項對整個影響的結(jié)果變可以忽略不計小。當N無限大的時候,后兩項對結(jié)果的影響

實際中我們計算時間復雜度時,我們其實并不一定要計算精確的執(zhí)行次數(shù),而只需要 大概執(zhí)行次數(shù) ,那么這里我們使用大 O的漸進表示法。

2.2?大O的漸進表示法

O 符號( Big O notation ):是用于描述函數(shù)漸進行為的數(shù)學符號。
推導大 O 階方法:
1 、用常數(shù) 1 取代運行時間中的所有加法常數(shù)。
2 、在修改后的運行次數(shù)函數(shù)中,只保留最高階項。
3 、如果最高階項存在且不是 1 ,則去除與這個項目相乘的常數(shù)。得到的結(jié)果就是大 O 階。

4.另外有些算法的時間復雜度存在最好、平均和最壞情況: 最壞情況:任意輸入規(guī)模的最大運行次數(shù)(上界) ;平均情況:任意輸入規(guī)模的期望運行次數(shù) ;最好情況:任意輸入規(guī)模的最小運行次數(shù)(下界);在實際中一般情況關(guān)注的是算法的最壞運行情況,所以數(shù)組中搜索數(shù)據(jù)時間復雜度為O(N)

2.3?常見的時間復雜度的計算

代碼一:

void Func4(int N)
{
	int count = 0;
	for (int k = 0; k < 100; ++k)
	{
		++count;
	}
	printf("%d\n", count);
}

時間復雜度為O(1)【因為大O的漸進表示法的第一條用常數(shù)1取代運行時間中的所有加法常數(shù)。】(我們可以看到執(zhí)行次數(shù)為100)(所以,看到大O的漸進表示法,并不是讓我們只能執(zhí)行一次)(常數(shù)都是1)

代碼二:

void Func2(int N)
{
 int count = 0;
 for (int k = 0; k < 2 * N ; ++ k)
 {
 ++count;
 }
 int M = 10;
 while (M--)
 {
 ++count;
 }
 printf("%d\n", count);
}

時間復雜度為O(N)[大O的漸進表示法,第三條:如果最高階項存在且不是1,則去除與這個項目相乘的常數(shù)。得到的結(jié)果就是大O階?!緦嶋H的執(zhí)行次數(shù)是:2*N+10】

代碼三:

void Func3(int N, int M)
{
	int count = 0;
	for (int k = 0; k < M; ++k)
	{
		++count;
	}
	for (int k = 0; k < N; ++k)
	{
		++count;
	}
	printf("%d\n", count);
}

時間復雜度為O(N+M);如果給出N遠大于M,就可以寫成O(N);如果給出N和M差不多就可以寫成O(N)或者O(M);該代碼什么都沒有給,所以就是O(M+N);

代碼4

const char* strchr(const char* str, int character)
{
	while (*str)
	{
		if (*str == character)
			return str;
		else
			++str;
	}
	return NULL;
}

時間復雜度為O(N);因為不確定什么時候被找到,第四條:在實際中一般情況關(guān)注的是算法的最壞運行情況,所以數(shù)組中搜索數(shù)據(jù)時間復雜度為O(N)

關(guān)于時間復雜度,我們要準確分析時間復雜度,一定要去看思想,不能僅僅去看程序是幾層循環(huán),主要是要看代碼的思想。比如:冒泡排序(O(N^2)),就是N-1,N-2,N-3……2,1,是一個等差數(shù)列(N-1+1)(N-1)/2=N(N-1)【這是最差情況】,N-1【最好的情況】。

二分查找的時間復雜度:O(㏒?N )【最好的情況:O(1)一次找到;? 最差的情況(找不到的情況):O(log2 N )? ?(1*2*2*2…2)^X(次)= N(從找不到的時候,向前思想】

時間復雜度,會把O(㏒?N)簡寫成O(logN).有些書籍也會寫成O(lgN)(這個是不正規(guī)的)

代碼5

long long Fac(size_t N)
{//階乘
	if (0 == N)
		return 1;

	return Fac(N - 1) * N;
}

時間復雜度為O(N),;實際上是N+1

代碼6

long long Fac(size_t N)
{
	if (0 == N)
		return 1;
	for (size_t i = 0; i < N; ++i)
	{
		printf("%d", i);
	}
	printf("\n");

	return Fac(N - 1) * N;
}

時間復雜度為O(N^2),;實際上是(N-1)+(n-2)+……+1+0

遞歸算法的時間復雜度:1、每次函數(shù)調(diào)用如果是是O(1),那么就看他的遞歸次數(shù)(遞歸次數(shù)是多少,時間復雜度就是多少)(代碼5)

2、如果不是O(1),那么就看他的遞歸調(diào)用次數(shù)的累加(每次遞歸,函數(shù)調(diào)用的累加)(代碼6)

代碼7

long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}
//斐波那契數(shù)列
//符合遞歸算法的第一種

?時間復雜度為O(2^N),第一層調(diào)用一次,第二層?調(diào)用2次,第三層調(diào)用4次?,一直到Fib(3)分成Fib(2)+Fib(1),那就是N-1層(假設每一層都是滿的,起始并不是每一層都是滿的),那最后一層就是2^(N-1),然后就是等比數(shù)列相加,就是(2^n-1)-1,

二 空間復雜度

空間復雜度 也是一個數(shù)學表達式,是對一個算法在運行過程中 臨時占用存儲空間 大小的量度 。
空間復雜度算的是 變量的個數(shù), 空間復雜度計算規(guī)則基本跟實踐復雜度類似,也使用 O 漸進表示法 。 注意:函數(shù)運行時所需要的??臻g ( 存儲參數(shù)、局部變量、一些寄存器信息等 ) 在編譯期間已經(jīng)確定好了,因 此空間復雜度主要通過函數(shù)在運行時候顯式申請的額外空間來確定
代碼一:
void BubbleSort(int* a, int n)
{
	assert(a);
	for (size_t end = n; end > 0; --end)
	{
		int exchange = 0;
		for (size_t i = 1; i < end; ++i)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				exchange = 1;
			}
		}
		if (exchange == 0)
			break;
	}
}

空間復雜度為O(1),臨時占用儲存空間的變量有i、exchange、end,一共三個。

代碼2

long long* Fibonacci(size_t n)
{
	if (n == 0)
		return NULL;

	long long* fibArray = (long long*)malloc((n + 1) * sizeof(long long));
	fibArray[0] = 0;
	fibArray[1] = 1;
	for (int i = 2; i <= n; ++i)
	{
		fibArray[i] = fibArray[i - 1] + fibArray[i - 2];
	}
	return fibArray;
}

空間復雜度為O(N),臨時占用儲存空間有指針開辟的空間n+1個,指針fibArray,i;一共n+3個

代碼3

long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}
空間復雜度為O(N), 遞歸調(diào)用了N 次,開辟了 N 個棧幀,每個棧幀使用了常數(shù)個空間??臻g復雜度為 O(N)
代碼4
long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}

時間復雜度為O(2^N),空間復雜度為O(N),會誤認為空間復雜度也是O(2^N),但是遞歸的調(diào)用的函數(shù),調(diào)用完之后就銷毀了,把空間還給系統(tǒng)了,下次調(diào)用的時候,再次開辟,空間又被使用,空間是可以重復利用。所以仍然是那一份空間。(局部變量存在棧上面,函數(shù)結(jié)束,局部變量也就銷毀了)

知識點:時間一去不復返,是累積的,空間回收以后,可以重復利用。

三 常見復雜度對比

一些常見的復雜度

查找算法的時間復雜度菜鳥,筆記,初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言

四 復雜度的oj練習

4.1?消失的數(shù)字

數(shù)組nums包含從0n的所有整數(shù),但其中缺了一個。請編寫代碼找出那個缺失的整數(shù)。(時間復雜度為O(N)

輸入:[3,0,1]輸出:2;?

思路一:先排序,然后進行遍歷(冒泡O(N^2),看是否是前一個數(shù)字+1得到的值(但是時間復雜度不符合題意)

思路二:映射方式(首先定義一個數(shù)組,里面的值全部賦值成-1,然后輸入的數(shù)組,每一個值是多少,就作為下標對應的位置寫多少)(時間復雜度為:O(N))

思路三:異或(用一個val和0-N的數(shù)字異或,再和數(shù)據(jù)中的數(shù)字異或,最后cal中得知就是缺失的值)(O(N))

思路三:等差數(shù)列(O(N))

代碼1展示:(思路三)函數(shù)接口型

int missingNumber(int* nums, int numsSize){
    int x = 0;
    for (int i = 0; i < numsSize; ++i)
    {
        x ^= nums[i];
    }
    for (int i = 0; i < numsSize + 1; ++i)
    {
        x ^= i;
    }
    return x;

}

4.2?旋轉(zhuǎn)數(shù)字

給定一個整數(shù)數(shù)組?nums,將數(shù)組中的元素向右輪轉(zhuǎn)?k?個位置,其中?k?是非負數(shù)。輸入: nums = [1,2,3,4,5,6,7], k = 3輸出: [5,6,7,1,2,3,4]解釋:向右輪轉(zhuǎn) 1 步: [7,1,2,3,4,5,6]向右輪轉(zhuǎn) 2 步: [6,7,1,2,3,4,5]向右輪轉(zhuǎn) 3 步: [5,6,7,1,2,3,4]

思路一:右旋K次(每次右旋一次)【時間復雜度為O(N*K);空間復雜度為O(1)】(時間復雜度的k最大為N-1),最壞的結(jié)果為O(N^2))

思路二:開設一個新的數(shù)組,把后k個放到新數(shù)組的前面,前面的依次放到后面【時間復雜度O(N),空間復雜度O(N)】?(這種方法比第一種,就是時間換取空間的算法)

思路三:三趟逆置【時間復雜度為O(N),空間復雜度為O(1)】

(思路一和思路三在C語言進階欄目-C進階習題里面有詳細說明 http://t.csdn.cn/sFLCM)

思路三:(函數(shù)接口型)文章來源地址http://www.zghlxwxcb.cn/news/detail-790089.html

void reverse(int* arr,int left, int right)
{
    while (left < right)
    {
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        ++left;
        --right;
    }
}
void rotate(int* nums, int numsSize, int k){
    int m = k % numsSize;
    reverse(nums, 0, numsSize - m - 1);
    reverse(nums, numsSize - m, numsSize - 1);
    reverse(nums, 0, numsSize -1);
}

到了這里,關(guān)于算法的時間復雜度和空間復雜度的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 算法學習22:時間復雜度 和 空間復雜度

    算法學習22:時間復雜度 和 空間復雜度

    提示:以下是本篇文章正文內(nèi)容: ??????文章鏈接?????? 提示:這里對文章進行總結(jié): ??????

    2024年04月22日
    瀏覽(33)
  • 如何衡量算法的效率?時間復雜度&&空間復雜度

    如何衡量算法的效率?時間復雜度&&空間復雜度

    本篇博客會講解如何衡量一個算法的效率。衡量算法的效率,主要有2個維度,分別是:時間復雜度和空間復雜度。 時間復雜度用來衡量算法的時間效率。時間復雜度越低,算法的耗時越短,效率則越高。 空間復雜度用來衡量算法的空間效率??臻g復雜度越低,算法占用的空

    2023年04月20日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu):算法(特性,時間復雜度,空間復雜度)

    數(shù)據(jù)結(jié)構(gòu):算法(特性,時間復雜度,空間復雜度)

    算法(Algorithm)是對 特定問題求解步驟 的一種描述,它是指令的有限序列,其中的每條指令表示一個或多個操作。 一個算法必須總在執(zhí)行有窮步之后結(jié)束,且每一步都可在有窮時間內(nèi)完成。 算法必須是有窮的,而程序可以是無窮的 算法中每條指令必須有確切的含義,對于

    2024年02月06日
    瀏覽(27)
  • 算法時間空間復雜度

    算法時間空間復雜度

    1. 有窮性 :執(zhí)行有窮步(有限步)之后結(jié)束。 2. 確定性 :只有唯一的執(zhí)行路徑。 3. 可行性 :代碼可以執(zhí)行起來。 4、 輸入 :零個或多個輸入。 5. 輸出 :一個或多個輸出。 時間效率和空間效率有時候是有矛盾的 概念: 若有某個輔助函數(shù) f ( n ) color{pink}{f(n)} f ( n ) 使得當

    2024年02月04日
    瀏覽(33)
  • 八大排序算法(含時間復雜度、空間復雜度、算法穩(wěn)定性)

    八大排序算法(含時間復雜度、空間復雜度、算法穩(wěn)定性)

    下列算法默認都是對數(shù)組進行升序 1.1、算法思想 插入排序是一種簡單直觀的排序算法,它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應位置并插入。 插入排序的具體步驟如下: 從第一個元素開始,該元素可以認為已經(jīng)被排序;

    2024年02月08日
    瀏覽(23)
  • 算法的時間復雜度和空間復雜度(數(shù)據(jù)結(jié)構(gòu))

    算法的時間復雜度和空間復雜度(數(shù)據(jù)結(jié)構(gòu))

    目錄 1、算法效率 1如何衡量一個算法的好壞 2算法的復雜度 2、時間復雜度 1時間復雜度的概念 2大O的漸進表示法 2時間復雜度計算例題 1、計算Func2的時間復雜度 2、計算Func3的時間復雜度 3、計算Func4的時間復雜度 4、計算strchr的時間復雜度 5、計算BubbleSort的時間復雜度 6、計算

    2024年02月03日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)與算法—時間復雜度和空間復雜度

    數(shù)據(jù)結(jié)構(gòu)與算法—時間復雜度和空間復雜度

    目錄 1、什么是數(shù)據(jù)結(jié)構(gòu)? 2、什么是算法? 3、算法的復雜度 4、時間復雜度 (1) 時間復雜度的概念: ?(2) 大O的漸進表示法:? 六個例題: (3)?時間復雜度對比:? 三個例題:? OJ題分析時間復雜度 5、空間復雜度 (1)常見復雜度對比 ?(2)OJ題分析空間復雜度 小結(jié) 數(shù)據(jù)結(jié)構(gòu) (D

    2024年02月07日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)--算法的時間復雜度和空間復雜度

    數(shù)據(jù)結(jié)構(gòu)--算法的時間復雜度和空間復雜度

    算法效率是指 算法在計算機上運行時所消耗的時間和資源 。這是衡量算法執(zhí)行速度和資源利用情況的重要指標。 例子: 這是一個斐波那契函數(shù),用的是遞歸的計算方法,每次創(chuàng)建函數(shù)就會在棧區(qū)開辟一塊空間,遞歸次數(shù)越多,開辟空間越多; 所以, 代碼的簡潔說明不了算

    2024年02月15日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)與算法-時間復雜度與空間復雜度

    數(shù)據(jù)結(jié)構(gòu)與算法-時間復雜度與空間復雜度

    數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式,指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 算法就是定義良好的計算過程,他取一個或一組的值為輸入,并產(chǎn)生一個或一組值作為輸出。簡單來說算法就是一系列的計算步驟,用來將輸入數(shù)據(jù)轉(zhuǎn)化成輸出結(jié)果。 算法在

    2024年02月07日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】時間復雜度和空間復雜度

    【數(shù)據(jù)結(jié)構(gòu)和算法】時間復雜度和空間復雜度

    目錄 ? 一、前言 二、時間復雜度 2.1時間復雜度表示形式 2.1.1規(guī)則: 3.1如何計算時間復雜度 3.1.1線性階 3.1.2平方階 3.1.3對數(shù)階 常見的時間復雜度排序: 三、空間復雜度 3.1Java的基本類型內(nèi)存占用 數(shù)據(jù)結(jié)構(gòu)和算法是程序的靈魂,這是某位程序員大佬所言,學習了這門,我們便可

    2023年04月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包