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

打開數(shù)據(jù)結(jié)構(gòu)大門:深入理解時間與空間復(fù)雜度

這篇具有很好參考價值的文章主要介紹了打開數(shù)據(jù)結(jié)構(gòu)大門:深入理解時間與空間復(fù)雜度。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在我們的編程之旅中,C語言為我們打下了堅實的基礎(chǔ)。然而,如今我們踏入了新的領(lǐng)域——數(shù)據(jù)結(jié)構(gòu)與算法

c語言系列文章大家可以瀏覽我的專欄:c語言學(xué)習(xí)

**那么現(xiàn)在就以算法的時間復(fù)雜度和空間復(fù)雜度開始,逐步探索這個數(shù)據(jù)結(jié)構(gòu)的精彩之處 **


一.算法效率

1.1 如何衡量一個算法的好壞

通常我們都會認為越簡短算法越好 ,但是我們在用遞歸實現(xiàn)求斐波那契數(shù)列的時候,代碼確實簡短,但是效率卻不高

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

}

讓求個第50個耗費的時間就已經(jīng)不短了,所以我們需要一個統(tǒng)一的標準來衡量代碼的好壞——算法的復(fù)雜度

1.2 算法的復(fù)雜度

算法在編寫成可執(zhí)行程序后,運行時需要耗費時間資源空間(內(nèi)存)資源 。因此衡量一個算法的好壞,一般

是從時間空間兩個維度來衡量的,即我們所說的時間復(fù)雜度和空間復(fù)雜度

  • 時間復(fù)雜度:時間復(fù)雜度描述了算法解決問題所需的時間量級。它表示隨著輸入規(guī)模的增加,算法執(zhí)行所需時間的增長趨勢,時間復(fù)雜度主要衡量一個算法的運行快慢
  • 空間復(fù)雜度:空間復(fù)雜度衡量了算法在執(zhí)行過程中所需的額外內(nèi)存空間。表示隨著輸入規(guī)模增加,算法所需內(nèi)存的增長趨勢。空間復(fù)雜度主要衡量一個算法運行所需要的額外空間

而如今計算機的存儲容量已經(jīng)達到了很高的程度。所以我們?nèi)缃褚呀?jīng)不需要再特別關(guān)注一個算法的空間復(fù)雜度,更加著重于時間復(fù)雜度


二.時間復(fù)雜度

2.1基本概念

算法的時間復(fù)雜度是一個函數(shù),它定量描述了該算法的運行時間。一個算法執(zhí)行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程序放在機器上跑起來,才能知道。顯然這很麻煩,所以才有了時間復(fù)雜度這個分析方式。

一個算法所花費的時間與其中語句的執(zhí)行次數(shù)成正比例,算法中的基本操作的執(zhí)行次數(shù),為算法的時間復(fù)雜度

確定一個算法中某個基本操作與問題規(guī)模 N 之間的關(guān)系式,即可確定該算法的時間復(fù)雜度

eg:計算一下test1中++count語句總共執(zhí)行了多少次?

#include<stdio.h>
int test1(int N)
{
int count = 0;
for (int i = 0; i < N; ++i)
{
	for (int j = 0; j < N-1; ++j)
	{
		++count;
	}
}
for (int k = 0; k < N; ++k)
{
	++count;
}
int M = 20;
while (M--)
{
	++count;
}
}

int main()
{
test1();
return 0;
}

可以知道執(zhí)行的次數(shù)F(N)只與N有關(guān):
F ( N ) = N ? ( N ? 1 ) + N + 20 F(N)=N*(N-1)+N+20 F(N)=N?(N?1)+N+20

  • N = 10 F(N) = 120
  • N = 100 F(N) = 10020

實際中計算時間復(fù)雜度時,其實并不一定要計算很精確的執(zhí)行次數(shù),只需要知道大概執(zhí)行次數(shù),即使用大O的漸進表示法

2.2 大O的漸進表示法

大 O 漸進表示法(Big O notation): 是一種用于描述算法復(fù)雜度的數(shù)學(xué)表示方法。它用于衡量算法在最壞情況下執(zhí)行時間的上限,即算法的增長率

規(guī)則

  1. 常數(shù)1取代運行時間中的所有加法常數(shù)
  2. 在修改后的運行次數(shù)函數(shù)中,只保留最高階項
  3. 如果最高階項存在且不是1,則去除與這個項目相乘的常數(shù)。得到的結(jié)果就是大O階

上面的 F ( N ) = N ? ( N ? 1 ) + N + 20 F(N)=N*(N-1)+N+20 F(N)=N?(N?1)+N+20 用大O表示法為:
O ( N 2 ) O(N^2) O(N2)

通過上面這個例子會發(fā)現(xiàn)大O的漸進表示法去掉了那些對結(jié)果影響不大的項,簡潔的表示出了執(zhí)行次數(shù)

有些算法的時間復(fù)雜度也分最好,平均,最壞的情況:

  • 最壞情況:任意輸入規(guī)模的最大運行次數(shù)
  • 平均情況:任意輸入規(guī)模的期望運行次數(shù)
  • 最好情況:任意輸入規(guī)模的最小運行次數(shù)

eg:在一個長度為n的整形數(shù)組arr里找a這個值

最好情況第一次就找到了 平均情況n/2次找到 最壞情況n次找的

在實際中一般情況關(guān)注的是算法的最壞運行情況,所以數(shù)組中搜索數(shù)據(jù)時間復(fù)雜度為O(N)

2.3常見時間復(fù)雜度計算

void test2(int N,int M)
{
	int count = 0;
	for (int k = 0; k < M; ++k)
	{
		count++;
	}
	for (int k = 0; k < N; ++k)
	{
		count++;
	}
}

基本操作執(zhí)行了M+N次,時間復(fù)雜度為O(N)

void test3()
{
	int count = 0;
	for (int k = 0; k < 100; ++k)
	{
		++count;
	}
}

基本操作執(zhí)行了100次(常數(shù)),時間復(fù)雜度為O(1)

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;
	}
}

基本操作執(zhí)行最好N次,最壞執(zhí)行了(N*(N+1)/2次,通過推導(dǎo)大O階方法+時間復(fù)雜度看最

壞,時間復(fù)雜度為 O ( N 2 ) O(N^2) O(N2)

int BinarySearch(int* a, int n, int x)
{
	assert(a);
	int begin = 0;
	int end = n - 1;
	while (begin <= end)
	{
		int mid = begin + ((end - begin) >> 1);//相當于begin+(n/2)
		if (a[mid] < x)
			begin = mid + 1;
		else if (a[mid] > x)
			end = mid - 1;
		else
			return mid;//找到了返回下標
	}
	return -1;//沒找到返回-1
}

基本操作執(zhí)行最好1次,最壞O( log ? 2 N \log_2N log2?N)次,時間復(fù)雜度為 O( log ? 2 N \log_2N log2?N) (一般情況下寫成 l g N lgN lgN)


三.空間復(fù)雜度

3.1基本概念

空間復(fù)雜度也是一個數(shù)學(xué)表達式,是對一個算法在運行過程中臨時占用存儲空間大小的量度

空間復(fù)雜度不是程序占用了多少bytes的空間,算的是變量的個數(shù)。

空間復(fù)雜度計算規(guī)則基本跟實踐復(fù)雜度類似,也使用大O漸進表示法

3.2常見時間復(fù)雜度計算

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;
	}
}

使用了常數(shù)個額外空間,所以空間復(fù)雜度為 O(1)

long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}

空間復(fù)雜度是 O(N),其中 N 是輸入的參數(shù)。這是因為每次遞歸調(diào)用都會在內(nèi)存中創(chuàng)建一個新的函數(shù)調(diào)用幀


好啦,今天的內(nèi)容梳理就先到這里了,下一次應(yīng)該會是順序表了。感謝大家支持!?。??文章來源地址http://www.zghlxwxcb.cn/news/detail-761726.html

到了這里,關(guān)于打開數(shù)據(jù)結(jié)構(gòu)大門:深入理解時間與空間復(fù)雜度的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】 順序表詳解!深入理解!

    【數(shù)據(jù)結(jié)構(gòu)】 順序表詳解!深入理解!

    ?? 嶼小夏 : 個人主頁 ??個人專欄 : 數(shù)據(jù)結(jié)構(gòu)解析 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是數(shù)據(jù)結(jié)構(gòu)?我們?yōu)槭裁匆獙W(xué)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)中的順序表長什么樣子?它是怎么運用? ? 本期我們將對這些一一講解,徹底明白數(shù)據(jù)結(jié)構(gòu)的重要性,以及順序表是一種什么的數(shù)據(jù)

    2024年02月08日
    瀏覽(26)
  • 深入理解數(shù)據(jù)結(jié)構(gòu):隊列的實現(xiàn)及其應(yīng)用場景

    深入理解數(shù)據(jù)結(jié)構(gòu):隊列的實現(xiàn)及其應(yīng)用場景

    隊列(Queue)是一種具有先進先出(FIFO)特性的數(shù)據(jù)結(jié)構(gòu)。在隊列中,數(shù)據(jù)的插入和刪除操作分別在隊列的兩端進行。插入操作在隊列的尾部進行,而刪除操作則在隊列的頭部進行。這種特性使得隊列在很多實際應(yīng)用中非常有用,比如任務(wù)調(diào)度、緩沖區(qū)管理等。 線性表是一種

    2024年04月28日
    瀏覽(30)
  • (一)深入理解Mysql底層數(shù)據(jù)結(jié)構(gòu)和算法

    (一)深入理解Mysql底層數(shù)據(jù)結(jié)構(gòu)和算法

    索引是幫助MySQL高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu) 數(shù)據(jù)結(jié)構(gòu)模擬網(wǎng)站:Data Structure Visualization 二叉樹 不適合做自增ID的數(shù)據(jù)結(jié)構(gòu)。如下示意圖,假設(shè)采用二叉樹作為表自增主鍵ID的數(shù)據(jù)存儲結(jié)果如下:當查詢id為5的數(shù)據(jù)時,其查詢次數(shù)為5次 紅黑樹 不適合做mysql的索引,因為當

    2024年01月25日
    瀏覽(27)
  • 深入理解數(shù)據(jù)結(jié)構(gòu)第一彈——二叉樹(1)——堆

    深入理解數(shù)據(jù)結(jié)構(gòu)第一彈——二叉樹(1)——堆

    前言: 在前面我們已經(jīng)學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)操作:順序表和鏈表及其相關(guān)內(nèi)容,今天我們來學(xué)一點有些難度的知識—— 數(shù)據(jù)結(jié)構(gòu)中的二叉樹 ,今天我們先來學(xué)習(xí) 二叉樹中堆 的知識,這部分內(nèi)容還是非常有意思的,下面我們就開始慢慢學(xué)習(xí) 準備工作:本人習(xí)慣將文件放在

    2024年04月17日
    瀏覽(28)
  • 深入理解數(shù)據(jù)結(jié)構(gòu)第五彈——排序(2)——快速排序

    深入理解數(shù)據(jù)結(jié)構(gòu)第五彈——排序(2)——快速排序

    排序(1): 深入了解數(shù)據(jù)結(jié)構(gòu)第四彈——排序(1)——插入排序和希爾排序-CSDN博客 前言: 在前面我們已經(jīng)講過了幾種排序方式,他們的效率有快有慢,今天我們來學(xué)習(xí)一種非常高效的排序方式——快速排序 目錄 一、快速排序的思想 二、快速排序的遞歸實現(xiàn) 2.1 霍爾法

    2024年04月15日
    瀏覽(28)
  • 深入理解數(shù)據(jù)結(jié)構(gòu)第六彈——排序(3)——歸并排序

    深入理解數(shù)據(jù)結(jié)構(gòu)第六彈——排序(3)——歸并排序

    排序1:深入了解數(shù)據(jù)結(jié)構(gòu)第四彈——排序(1)——插入排序和希爾排序-CSDN博客 排序2:深入理解數(shù)據(jù)結(jié)構(gòu)第五彈——排序(2)——快速排序-CSDN博客 前言: 在前面,我們已經(jīng)學(xué)習(xí)了插入排序、堆排序、快速排序等一系列排序,今天我們來講解一下另一個很高效的排序方法

    2024年04月17日
    瀏覽(28)
  • 深入理解哈希表:數(shù)據(jù)結(jié)構(gòu)中的重要角色

    目錄 一. 哈希表的原理與結(jié)構(gòu) 哈希函數(shù) 存儲數(shù)組 哈希沖突與解決方法 總結(jié) 二. 哈希函數(shù)的作用與設(shè)計 哈希函數(shù)的作用: 哈希函數(shù)的設(shè)計: 常見的哈希函數(shù)設(shè)計方法包括: 三. 哈希沖突與解決方法 1. 開放尋址法(Open Addressing) 2. 鏈地址法(Chaining) 四. 哈希表的應(yīng)用 五

    2024年02月11日
    瀏覽(24)
  • 探索數(shù)據(jù)結(jié)構(gòu):順序串與鏈式串的深入理解

    探索數(shù)據(jù)結(jié)構(gòu):順序串與鏈式串的深入理解

    ?? 歡迎大家來到貝蒂大講堂?? ????養(yǎng)成好習(xí)慣,先贊后看哦~???? 所屬專欄:數(shù)據(jù)結(jié)構(gòu)與算法 貝蒂的主頁:Betty’s blog 串是一種特殊的 順序表 ,即每一個元素都是單獨一個 字符 。在C語言中我們學(xué)習(xí)的字符串便是串的一種,它在我們的數(shù)據(jù)搜索與文本編譯中起著不

    2024年04月17日
    瀏覽(34)
  • 深入理解數(shù)據(jù)結(jié)構(gòu)第三彈——二叉樹(3)——二叉樹的基本結(jié)構(gòu)與操作

    深入理解數(shù)據(jù)結(jié)構(gòu)第三彈——二叉樹(3)——二叉樹的基本結(jié)構(gòu)與操作

    二叉樹(1): 深入理解數(shù)據(jù)結(jié)構(gòu)第一彈——二叉樹(1)——堆-CSDN博客 二叉樹(2): 深入理解數(shù)據(jù)結(jié)構(gòu)第二彈——二叉樹(2)——堆排序及其時間復(fù)雜度-CSDN博客 前言: 在前面我們講了堆及其應(yīng)用,幫助我們初步了解了二叉樹的一些原理,但那與真正的二叉樹仍有不同,

    2024年04月09日
    瀏覽(32)
  • Mysql性能調(diào)優(yōu)——1.深入理解Mysql索引數(shù)據(jù)結(jié)構(gòu)和算法

    Mysql性能調(diào)優(yōu)——1.深入理解Mysql索引數(shù)據(jù)結(jié)構(gòu)和算法

    本系列所說的Mysql性能調(diào)優(yōu),主要是針對開發(fā)者在實際環(huán)境中的sql調(diào)優(yōu),代碼層面上的優(yōu)化。不涉及到mysql底層代碼的調(diào)優(yōu)。 我們知道,一個mysql數(shù)據(jù)表,數(shù)據(jù)量小的時候,可能簡單的查詢耗時不會太久,性能也可以接受。但當數(shù)據(jù)量大的時候,查詢速度會很緩慢。這時候我們

    2024年02月09日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包