演算法基礎知識

2021-08-17 09:50:15 字數 3013 閱讀 1001

一、插入排序(撲克牌原理)  n^2  原址

a[1,...,n-1]是排好序的,把第n個往前

二、分治法(歸併)  nlgn  非原址

//先分解

sort(a,p,r)

if pa++;//or b++;

三、分治法--最大子陣列問題

描述:尋找a的和最大的非空連續子陣列

解決:按中點分成兩段,遞迴找左右段各自的最大段,再找跨越中點的最大段,三個結果進行比較

find(a,low,high)

if high==low

return(low,high,a[low])

else mid=[(low+high)/2]

(l-low,l-high,l-sum)=find(a,low,mid)

(r-low,r-high,r-sum)=find(a,mid+1,high)

(c-low,c-high,c-sum)=cross-find(a,low,mid,high)

choose the max one to return

cross-find(a,low,mid,high)//這是跨中點段

left_sum=max

sum=0

for i=mid:low

sum+=a[i]

if(sum>left_sum)

left_sum=sum

max_left=i

right_sum=max

sum=0

for i=mid+1:high

sum+=a[i]

if(sum>right_sum)

right_sum=sum

max_right=i

return(max_left,max_right,left_sum+right_sum)

四、矩陣乘法的strassen演算法

描述:axb按照原始的乘法需要遞迴三層,現在:

把矩陣分解成n/2 x n/2 的形式:a11,a12,a21,a22,b11,b12,b21,b22;

再將其兩兩加or減 得10個矩陣s1,s2,...,s10:

s1=b12-b22      s2=a11+a12    s3=a21+a22    s4=b21-b11     s5=a11+a22

s6=b11+b22     s7=a12-a22     s8=b21+b22     s9=a11-a21     s10=b11+b12

再遞迴的計算7次乘法。。。。。。

五、隨機演算法(優先順序 原址)

1. a[1...n],給每乙個數分配乙個優先順序,p[i]=random(1,n^3);使用p各個數的大小對a進行排序//問:若產生的優先數相等怎麼辦?--對其再進行隨機數賦值

2. 原址排列給定數列;a[i]是從i--n數中隨機選取乙個j,swap(i,j),然後不再改變

六、堆排序  nlgn 非原址

二叉堆--被近似地看成完全二叉樹;分為最大堆、最小堆;;建堆,維護堆,由堆對乙個陣列進行原址排序。

//對left[i],right[i]滿足最大堆,而a[i]不一定大於孩子的維護

max_heapify(a,i)

//建堆

build_max_heap(a)

//用堆排序

heapsort(a)

//取出最大的元素 並維護堆

heap_extract_max(a)

//在建好的堆中位置i插入key

heap_increase_key(a,i,key)

九、基數排序

描述:按最低有效位排序,合併後再按次低有效位排序,......;一位數排序演算法最好是選取穩定的(計數常用)

十、桶排序

描述:把乙個區間劃分成幾等分,各用乙個list,然後落在各區間裡的數分別排序,再把他們合併。

要求:元素服從均勻分布,平均情況下的時間代價為o(n)

十一、遺忘比較交換演算法--列排序演算法

描述:不依賴待排序元素的值,也不依賴之前比較的結果(0,1排序引理可證之);

包含n個元素的矩形陣列的排序,有r行xs列,滿足:

r必須是偶數;s|r;r>=2*s^2;

得到的結果是列優先有序的,從上到下,從左到右 單增。

十二、中位數和統計量

1.同時求最大/最小值--最多3[n/2]次

描述:總數為奇則把最大最小值的初始值設為first元素,為偶則取前兩個比較後設為最大最小初值;剩餘的數每兩個相互比較,較小的再與min比,較大的再與max比。

2.同時求最大數和次大數

描述:把所有數兩兩配對取較大值,再次兩兩配對取較大值,...,最後得出的數為最大數;而次大數再從最大數開始回過去找,取最大值公升上來的每個線路結點的孩子一一比較,最後得出次大值。

3.用快排找第i大的元素--期望為線性時間的選擇演算法

描述:只處理單邊的快排

randomized_select(a,p,r,i)
4.最壞情況為線性時間的選擇演算法

描述:返回n>1時的第i小的元素;n=1時返回唯一值;

select(a,p,r,i)

1.將n個元素劃分為[n/5]組,每組5個,剩餘元素為一組

2.尋找每一組的中位數;先用插入排序,然後取中位數;得b[k]

3.對得到的中位數們遞迴呼叫select(b,0,k,k/2),返回值為x,它記錄了中位數的中位數;

4.利用快排修改過的partition(a,p,r,x),以x為主元對整個陣列進行劃分,然後得出x的位置在q標處

5.若i=q,則返回x;若iq,則遞迴呼叫select(a,q+1,r,i-q)。

演算法 基礎知識

插入排序法示例 將想要插入的值搜尋找到合適的位置,之前的數值一一向後移動乙個位置,騰出乙個空位置給想要插入的數值。偽 instert sort a for j 2 to a.length key a j i j 1 while i 0 and a i key a i 1 a i i i 1 a i ...

演算法基礎知識

o 1 稱為不變複雜性 1項 1秒 10項 1秒 100個專案 1秒 專案的數量仍然增加10倍,但o 1 的比例因子總是1。o log n 稱為對數複雜度 1項 1秒 10項 2秒 100項 3秒 1000項 4秒 10000項 5秒 計算次數只會增加輸入值的對數。因此,在這種情況下,假定每個計算需...

演算法筆記 演算法基礎知識

演算法是一種解決某類問題 具體的 明確無歧義的計算過程。十進位制的指數。例如 1500 1.5 10 3 數量級是3,也可以是 千 kilo 150萬 1.5 10 6 數量級是6,也可以是 百萬 million 150萬比1500大3個數量級 執行環境資源有限,需要根據輸入規模 數量級 準備資源,...