一個演算法對於某個輸入的迴圈次數是可以事先估計出來的_資料結構與演算法入門...
阿新 • • 發佈:2020-12-18
技術標籤:一個演算法對於某個輸入的迴圈次數是可以事先估計出來的下拉選單實現樹狀結構資料結構中為什麼輸入資料還沒輸入完全就結束了演算法在某個集合中找個一個或者多個的和等於某個固定值
今天分享一下資料結構與演算法的基本知識,主要包括以下幾點:資料結構基本概念、資料結構型別、演算法基本概念、演算法時間複雜度和空間複雜度。資料結構基本概念1、資料
① 資料(data)是描述客觀事物的數值、字元以及能輸入機器且能被處理的各種符號集合。 ② 資料的含義非常廣泛,除了通常的數值資料、字元、字串是資料以外,聲音、影象等一切可以輸入計算機並能被處理的都是資料。 eg: 除了表示人的姓名、身高、體重等的字元、數字是資料,人的照片、指紋、三維模型、語音指令等也都是資料。 2、資料項 ① 資料項(data item)具有原子性,是不可分割的最小資料單位。 (類似資料庫的欄位) eg: 描述學生相關資訊的姓名、性別、學號等都是資料項,三維座標中的每一維座標值也是資料項。 資料項具有原子性,是不可分割的最小單位。 3、資料元素 ① 資料元素(data element)是資料的基本單位,是資料集合的個體,通常由若干個資料項組成,在計算機程式中通常作為一個整體來進行處理。 (類似資料庫的每條記錄) eg: 一條描述一位學生的完整資訊的資料記錄就是一個數據元素; 空間中一點的三維座標也可以是一個數據元素。 4、資料物件 ① 資料物件(data object)是性質相同的資料元素的集合,是資料的子集。 (類似資料庫的表) eg:一個學校的所有學生的集合就是資料物件,空間中所有點的集合也是資料物件; 5、資料結構 ① 資料結構(data structure)是指相互之間存在一種或多種特定關係的資料元素的集合。 ② 是組織並存儲資料以便能夠有效使用的一種專門格式,它用來反映一個數據的內部構成,即一個數據由那些成分資料構成,以什麼方式構成,呈什麼結構。 ③ 由於資訊可以存在於邏輯思維領域,也可以存在於計算機世界,因此作為資訊載體的資料同樣存在於兩個世界中,表示一組資料元素及其相互關係的資料結構同樣也有兩種不同的表現形式: 一種是資料結構的邏輯層面,即資料的邏輯結構; 一種是存在於計算機世界的物理層面,即資料的儲存結構。 ④ 資料結構=邏輯結構+儲存結構+(在儲存結構上的)運算/操作 資料結構型別一個簡單語句的時間複雜度為O(1)。int count=0;100個簡單語句的時間複雜度也為O(1)。(100是常數,不是趨向無窮大的n)int count=0;一個迴圈的時間複雜度為O(n)。int n=8, count=0;for (int i=1; i<=n; i++)count++;時間複雜度為O(log2n)的迴圈語句。int n=8, count=0;for (int i=1; i<=n; i*=2) count++;時間複雜度為O(n2)的二重迴圈。int n=8, count=0;for (int i=1; i<=100n; i++) for (int j=1; j<=10n; j++) count++;時間複雜度為O(nlog2n)的二重迴圈。int n=8, count=0;for (int i=1; i<=n; i*=2) for (int j=1; j<=n; j++) count++;時間複雜度為O(n2)的二重迴圈。int n=8, count=0;for (int i=1; i<=n; i++) for (int j=1; j<=i; j++) count++;1+2+3+4....+n=(1+n)*n/2時間複雜度是O(n2)
⑦ 常用的時間複雜度級別:
從上到下執行效率越來越低
常數階O(1)
對數階O(log2n)
線性階O(n)
線性對數階O(n*log2n)
平方階O(n2)
立方階O(n3)
k次方階O(nk)
指數階O(2n)
階乘階O(n!)
空間複雜度
1、演算法的儲存量包括:
① 程式本身所佔空間
② 輸入資料所佔空間
③ 輔助變數所佔空間
2、輸入資料所佔空間只取決於問題本身,和演算法無關,則只需要分析除輸入和程式之外的輔助變數所佔額外空間。
3、空間複雜度是對一個演算法在執行過程中臨時佔用的儲存空間大小的量度,一般也作為問題規模n的函式,以數量級形式給出,記作:
S(n) = O(g(n))
空間複雜度分析:int fun(int n){ int i,j,k,s; s=0; for (i=0;i<=n;i++) for (j=0;j<=i;j++) for (k=0;k<=j;k++) s++; return(s);}由於演算法中臨時變數的個數與問題規模n無關,所以空間複雜度均為S(n)=O(1)。空間複雜度分析2:void fun(int a[],int n,int k) //陣列a共有n個元素{ int i; if (k==n-1) for (i=0;i printf("%d\n",a[i]); //執行n次 else { for (i=k;ia[i]=a[i]+i*i;//執行n-k次 fun(a,n,k+1); }}此屬於遞迴演算法,每次呼叫本身都要分配空間,fun(a,n,0)的空間複雜度為O(n)。
4、空間複雜度相比時間複雜度分析要少;
5、對於遞迴演算法來說,程式碼一般都比較簡短,演算法本身所佔用的儲存空間較少,但執行時需要佔用較多的臨時工作單元,若寫成非遞迴演算法,程式碼一般可能比較長,演算法本身佔用的儲存空間較多,但執行時將可能需要較少的儲存單元。
今天總結了一下資料結構和演算法的基本知識,如果大家發現有什麼不妥之處或分析不到位的地方,非常歡迎留言討論交流哦
歡迎關注ITSK,每天進步一點點,我們追求在交流中收穫成長和快樂