輸入輸出
確定性有窮性
np類問題是非確定性計算模型下的易驗證問題類。
所有可以在多項式時間內求解的判定問題構成p類問題
1、二分搜尋技術
二分搜尋演算法的基本思路是對給定已排好序的n個元素a[0:n-1]在這n個元素中找出乙個特定元素x。
運用分治的思想,將n個元素以n/2為中心對半分。if(x==a[n/2])如果成立則n/2的位置就是x元素在a中的位置。x//二分搜尋,需要數字a先從低到高排序
static
int binarysearch(int a,int x,int n)
return -1;
}2、合併排序演算法
合併演算法的基本思想是將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成要求的排好序的集合。
基本演算法描述如下:
void mergesort(type a,int
left,int
right)
}
中merge()是將a[left:i]與a[i+1:right]中的元素從小到大排序到b中
copy是將b[left:right]複製到a[left:right]
//歸併排序
static
void mergesort(int a,int left,int right)
else
}if(m>i)
}else
if(n>right)
}//把b複製給a
for(int j=left;j<=right;j++)
a[j]=b[j];
}}
3、快速排序
快速排序演算法的思想是對於輸入的子陣列a[p:r]按以下三個步驟進行排序:
1. 分解
2. 遞迴求解
3. 合併
基於這個思想演算法思路為:
void quicksort(type a,int p,int r)
}
其中partition()是對於a[p:r]
取x=a[p]對於a[p:r]分成乙個位置j,a[j]=x,a[p:j-1]是小於a[j] (即x),a[j+1:r]是大於a[j].
演算法思路如下:
int partition(type a,int p,int r)
a[p]=a[j];
a[j]=x;
return j;
}
我是將partition()融入在quicksort()中,**如下:
//快速排序
static void quicksort(int a,int p,int r)
else
}a[p]=a[j];
a[j]=x;
quicksort(a,p,j-1);
quicksort(a,j+1,r);
}}
4、線性時間選擇
該演算法是模仿快速排序演算法設計出來的。實際是對陣列a[p:r]進行劃分,分成a[p:i-1]和a[i+1:r].其中a[p:i-1]的元素全部小於a[i],a[i+1:r]的元素全部大於a[i];如果x>i則,查詢的位置在i的右邊,反之在i的左邊。直到p等於r確定了要查詢位置的元素值就是a[p].
static int randomizedselect(int a,int p,int r,int k)
else
}a[p]=a[j];
a[j]=x;//p-j 小於j+1-r
if(k<=(j-p+1))
else
}}
演算法分析與設計
分析,此題可以用動態規劃來做。子問題為 max i max i 1 0 max i 1 nums i nums i max i 表示以nums i 結尾的子串的最大和,最後返回最大的那個即為所求,複雜度為o n class solution return max 另一種實現方法,更加簡潔,即從前往後...
演算法設計與分析
ylbtech miscellaneos 演算法設計與分析 a,返回頂部1,演算法設計與分析 是2009年國防工業出版社出版的圖書,作者是張德富。書主要取材於演算法設計與分析領域的經典內容,並介紹了演算法設計的發展趨勢。內容主要包括非常經典的演算法設計技術,例如遞迴與分治 動態規劃 貪心 回溯 分支...
演算法設計與分析
貪心演算法 單位權值價值大的優先。演算法設計 問題建模,選擇什麼演算法?如何描述這個方法?這個方法是否對所有例項都得到最優解?如何證明?如果不是,能否找到反例?例2 投資問題 蠻力演算法 窮舉法 演算法效率c m n 1,m m n 1 m n 1 問題求解的關鍵 建模 對輸入引數和解給出形式化或半...