資料結構筆記 二

2021-09-10 03:21:17 字數 1787 閱讀 8036

在上次分享中,我分享了資料結構的一些基本概念,大家都知道,資料結構和演算法是密不可分的,本次我將討論演算法的基本概念,以及時間複雜度等問題

什麼是演算法 演算法是針對問題根據問題的特性來預先設計的求解過程。資料得以描述,目的是為了解決問題。如何針對各種各樣的資料結構與問題規模去設計不同的過程解決特定的問題,這就是演算法的藝術。鑑於在乙個計算系統中計算資源的稀缺性,我們要設計不同的演算法並且加以比較,從而選取最合適問題的演算法方案去提公升程式的經濟性。

演算法的五大特性 1、0個或多個輸入  2、至少乙個輸出  3、有窮性  4、確定性  5、可行性

演算法的設計的要求 1、健壯性  2、正確性  3、可讀性  4、高效率  5、低儲存

演算法的優劣與演算法描述的語言無關 好的演算法和語言是沒有任何關係的,在我認為,演算法就是一種思想,好的演算法可以是程式,也可以是乙個公式,甚至可以是解決問題所畫出來的圖形。

如何衡量演算法的好壞 乙個演算法的執行,會產生兩種開銷:

1)處理時間 (即時間複雜度)

2)空間或記憶體(即為空間複雜度)

上面我們引入了倆個很重要的概念,分別是時間複雜度和空間複雜度 <

電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串的長度的函式。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。

是不是覺得有點難以理解,還是直接上例子吧。

for(i=1;i<=n;i++)

for(j=1;j<=i;j++)

x=x+1;

//問時間複雜度為多少?

首先,我們看外層迴圈,i的值從1增到n,當i=1時,內層迴圈迴圈1次,當i=2,內層迴圈迴圈

了2次,如此,當i=n時,內層迴圈迴圈了n次,由此我們可以知道語句頻度(即總共算了多少次)為

1+2+3+...+n=(n+1)n/2,當n->無窮大時,為n平方,則該演算法的時間複雜度為o(n2)。

下面我們再看乙個例子

s=0;

while (n>=(s+1)*(s+1))

s=s+1;

看了之後是不是感覺太彆扭了,渾身不舒服,別急,我們把條件那塊化一下子。

我們可以將n>=(s+1)*(s+1)化成(s+1)<=n1/2,那麼s<=n1/2-1,那麼換成for迴圈,如下

for (s=0;s<=n^1/2-1;s++)
是不是看著舒服多了,來看怎麼分析它的時間複雜度,那不就是當n=無窮的時候,迴圈了根號n次嘛,所以時間複雜度為o(n1/2)

那麼,看到這塊,大家是不是覺得時間複雜度也沒有那麼難了,那遞迴的時間複雜度怎麼算,這裡舉乙個python求斐波那契數列的遞迴例子

def fib(n):

return(fib(n-1)+fib(n-2) if n>2 else 1)

是不是又有些蒙了,這個我們可以畫個樹來做,fib(n)=fib(n-1)+fib(n-2),fib(n-1)=fib(n-3)+fib(n-2),……

是不是一目了然了,當n為無窮大時,時間複雜度為o(2n)

空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度

資料結構筆記(二)

優點 無需為表示表中元素之間的邏輯關係而增加額外的儲存空間 可以快速查詢元素,修改元素 o 1 缺點 插入,刪除的時間複雜度 o n 線性表長度變化較大時,難以確定儲存空間的容量 造成儲存空間的 碎片 棧是限定僅在表尾進行插入和刪除操作的線性表 棧頂 top 棧底 bottom 不含任何資料元素的棧...

資料結構(筆記二)

高斯的1 100運算 普通的運算 高斯的運算 可能以計算機的神速,兩個演算法都可以秒殺解決掉 但是,如果我們把條件換成1加到1千萬,或者1加到1千億,差距就可想而知了,好的演算法甚至讓人腦快過電腦。輸入 輸出 有窮性,確定性和可行性。輸入 輸出 有窮性 確定性 可行性 效率高一般指的是演算法的執行時...

演算法筆記(二)資料結構

資料結構實計算機中對資料的一種儲存和組織的方式,同時也泛指相互之間存在一種或多種特定關係的資料的集合。到現在為止,計算機技術領域中還沒有乙個統一的資料結構的定義。以下是引用的部分解釋 data structure d,r 其中d是資料元素的集合,r是該集合中所有元素之間的關係的有限集合。2 sart...