演算法初學(第一天)

2021-10-01 12:12:19 字數 2376 閱讀 3587

1.時間複雜度:  

時間複雜度為乙個(預設最差情況下)演算法流程中, 常數運算元量的指標。 常用o(讀作big o) 來表示。 具體來說, 在常數運算元量的表示式中,

只要高階項, 不要低階項, 也不要高階項的係數, 剩下的部分 如果記為f(n), 那麼時間複雜度為o(f(n))。

先看時間複雜度的指標, 然後再分析不同資料樣本下的實際執行時間

2.氣泡排序:時間複雜度 o(n^2)

2.1 每個數和它後面的乙個數進行比較,這個數比後面的數大則進行交換。

2.2 這樣最後乙個數會是最大的。

2.3 每次都這樣,但是最後乙個數不需要再進行比較了

2.4 **:

int a = new int;

int end = a.length-1;

for(int i=end;i>0;i--)

for(int j=0;ja[j+1])

3.選擇排序:時間複雜度 o(n^2)

3.1 遍歷一次陣列,將最小的索引儲存下來

3.2 讓第乙個數和這個索引數進行交換

3.3 每次少遍歷乙個數

3.4 **:o(n*n)

int a = new int;

for(int i=0;ia[j])

}int temp = a[minindex];

a[minindex] = a[i];

a[i] = temp;

}

4.插入排序:

4.1 第乙個數和第二個數比較,比第二個數大的話,進行交換

4.2 第二個數和第三個數進行比較,大的話進行交換,交換後再比較。

4.3 如果這個數已經比前乙個數大了,那就不需要再進行比較了,因為前面已經比較好了

4.3 **:

int a = new int;

for(int i=1;i=0&&a[j]>a[j+1];j--)

5.對數器:

5.1 實現乙個絕對正確的方法

5.2 實現乙個隨機樣本數

5.3 實現乙個對比的方法

5.4 將想測的方法和絕對正確的方法的結果進行比較。

5.5 將錯的陣列,還有不同方法的結果列印出來進行對比

6. 遞迴的複雜度分析

t(n) = a*t(n/b) + o(n^d)

a表示子過程發生多少次

n/b 表示子過程的樣本量

o(n的d次方)  表示除了子過程剩下的內容 

1) log(b,a) > d -> 複雜度為o(n^log(b,a))   以b為底

2) log(b,a) = d -> 複雜度為o(n^d * logn)

3) log(b,a) < d -> 複雜度為o(n^d)

7. 歸併排序

7.1 先將陣列二分排序

7.2 現在我們有乙個陣列,但是前面和後面部分都已經排好序,設定兩個變數a,b,分別儲存陣列的索引

7.3 新建乙個陣列,將兩部分的元素進行比較,誰大,儲存到陣列中,並使a或者b,自加

7.4 當a或者b達到了各自的末尾時,將剩餘部分copy到陣列中

7.5 再講此陣列copy到原陣列。

public static void mergesort(int arr)

mergesort(arr, 0, arr.length - 1);

}public static void mergesort(int arr, int l, int r)

int mid = (l+r)/2;

mergesort(arr,l,mid);

mergesort(arr,mid+1,r);

merge(arr,l,mid,r);

}public static void merge(int arr, int l, int m, int r) {

int p1 = l;

int p2 = m + 1;

int help = new int[r-l+1];

int i = 0;

while (p1<=m&&p2<=r){

if(arr[p1]8. 小和問題:

在乙個陣列中, 每乙個數左邊比當前數小的數累加起來, 叫做這個陣列的小和。 求乙個陣列的小和

8.1 利用歸併排序。把資料一塊一塊處理。

8.2 有兩塊資料,前面的陣列起始下標為a,後面的陣列起始下標為b。

8.3 判斷大小,小的話,後面的數量乘以a下標的值,因為後面的每乙個數都比b大。

8.4 用歸併排序能夠降低時間複雜度。

9. 位運算

mid = (r+l)/2    r+l可能會導致溢位。

mid = l + (r-l)>>1  此式與上式效果一致,但能節省時間,並防止溢位。

matlab初學 第一天

matlab學習第一天 1.1 陣列的建立 所有的元素必須置於 之中 陣列元素必須由,或者空格分隔。陣列的行與行之間必須用 標誌,或者用回車鍵enter換行 演示省去,這一部分很簡單。2 標準陣列 ones 產生全1陣列 zeros 產生全零陣列 eye 產生單位陣列 magic產生幻方陣列,這個厲...

初學Linux第一天

linux是以網路為核心的設計思想,是效能穩定的多使用者網路作業系統。目前還不太懂為什麼菜鳥教程上說可以用雲伺服器這裡留作後續解答,linux的安裝是在vmware虛擬機器中,為了提供乙個完整的pc機環境,置於安裝教程有很多就不在一一贅述。有個博主 超級努力的小白,學習日記做的挺詳細的我現在也是向他...

初學OC第一天整理

面向過程的程式設計 procedure oriented programming,pop 以事件為中心,關心完成事件的詳細步驟,一步一步如何實現 物件導向的程式設計 object oriented programming,oop,以事物為中心,也就是參與事件的參與者,設計事物的功能,而完成事件只是所...