演算法設計策略
Ⅰ 如何設計演算法
設計一個正確的演算法是一件困難的工作,因為它需要創新,從以太真空中發掘出一個解方案來解決問題。演算法設計比對現有的方案進行改良要難得多,因為演算法設計的可選擇空間太,過多的自由反而成了一種約束。 This book is designed to make you a better algorithm designer. The techniques presented in Part I of this book provide the basic ideas underlying all combinatorial algorithms. The problem catalog of Part II will help you with modeling your application and point you in the right direction of an algorithm or implementation. However, being a successful algorithm designer requires more than book knowledge; it requires a certain attitude, the right problem-solving approach. It is difficult to teach this mindset in a book; yet getting it is essential to become a successful designer. 本書的設計目標是讓你成為一個更好的演算法設計者。本書第一部分展示有關組合演算法的基本原理和基本思想;第二部分的問題清單幫助你為你的問題建模,並且為你指明實現正確演算法的方向。盡管如此,要成為一個成功的演算法設計者光有書本知識是不夠的,面對問題的態度(attitude)和選擇正確的方法更重要。書本容易傳授知識,很難傳授人的心態(mindset)和思考方式;而這種心態和思考卻是成為成功的演算法設計者的根本條件。 The key to algorithm design (or any other problem-solving task) is to proceed by asking yourself a sequence of questions to guide your thought process. What if we do this? What if we do that? Should you get stuck on the problem, the best thing to do is move onto the next question. In any group brainstorming session, the most useful person in the room is the one who keeps asking, ``Why can't we do it this way?'' not the person who later tells them why. Because eventually she will stumble on an approach that can't be shot down. 演算法設計(或其它問題解決任務)的關鍵是一系列持續的自我反問,這些反問引導我們思維的前進。「如果這樣做會怎樣?」,「如果那樣做又會怎樣?」……如果 你被一個問題掐住了,最好的辦法就是先擱一下,換一個問題換一個前進的方向試試。在每組頭腦風暴會議中,最有價值的人是不斷提出為什麼的人,不是爾後解說為什麼的人。因為我們常常被一些習以為常的東西所拌倒,掉進自己設置的陷阱。 kemin:如果問題解決是一種思考過程,那麼思考的形式(過程的嚴謹性、細致性和正確性)很重要,而思考的內容也不容忽視。因為引導我們思考前進的方式 除反問本身外,反問的內容也很重。就比如參加頭腦風暴的材料一樣。人大腦的思維功能是硬編碼的,人與人之間沒有思維規律——質的區別,只是思維的清晰度和 靈敏度——量的差別。人與人之間智力的差別更多體現在思維內容的量上,體現在對外部世界的事實掌握的廣度和深度上。 Towards this end, we provide below a sequence of questions to guide your search for the right algorithm for your problem. To use it effectively, you must not only ask the questions, but answer them. The key is working through the answers carefully, by writing them down in a log. The correct answer to, ``Can I do it this way?'' is never ``no,'' but ``no, because ....'' By clearly articulating(明確有力地表達) your reasoning as to why something doesn't work, you can check if it really holds up or whether you have just glossed(掩蓋) over a possibility that you didn't want to think hard enough about. You will be surprised how often the reason you can't find a convincing(使人信服的) explanation for something is because your conclusion is wrong. 在末尾我們提供一個反問問題的列表,你不但要反問自己這些問題,更重要是仔細回答這些問題,最好把答案寫下來。回答諸如問題「我可以使用這種方式嗎?」的 不是一個「不能」就完了,而是「不能,因為……」。通過仔細明確的回答「為什麼不能」時,你會發現到底是「真的不能「,還是只是你自己不願意去深入思考掩 蓋了」能「。如果你不曾訓練出嚴謹的思考方式,當你這樣做時你會驚訝的發現,為了說明某些東西但卻找不到一個令人信服的解釋的原因常常是因為你的結論本身 是錯的。 An important distinction to keep aware of ring any design process is the difference between strategy and tactics(戰略). Strategy represents the quest for the big picture, the framework around which we construct our path to the goal. Tactics are used to win the minor battles we must fight along the way. In problem solving, it is important to check repeatedly whether you are thinking on the right level. If you do not have a global strategy of how you are going to attack your problem, it is pointless to worry about the tactics. 在設計過程中特別重要區分策略和戰略的概念。策略是對全局的一個探索,一個構築通向目標路徑的指導框架。戰略則是用來解決通向大目標過程的較小的問題。如果你對關於如何對付所面臨的問題沒有一個全局的策略,那關心戰略是不得要領的,予事無補的。在解題領域,不斷修正思維的層次(thinking on the right level)是很重要戰略。(--萊布尼茲曾經將人的解題思考過程比喻成晃篩子,把腦袋裡面的東西都給抖落出來,然後正在搜索的注意力會抓住一切細微的、與問題有關的東西。事實上,要做到能夠令注意力抓住這些有關的東西,就必須時刻將問題放在注意力層面,否則即使關鍵的東西抖落出來了也可能沒注意到。) An example of a strategic question is, ``How best can I model my application as a graph algorithm problem?'' A tactical question might be, ``Should I use an adjacency鄰接 list or adjacency matrix data structure to represent my graph?'' Of course, such tactical decisions are critical to the ultimate quality of the solution, but they can be properly evaluated only in light of a successful strategy. 一個策略問題的例子是:「我如何才能更好地把我的問題建模成圖問題?」。而一個戰略問題可能是這樣:「我是用鄰接列表還是鄰接矩陣來實現我的圖結構?」。當然,這種戰略選擇是對解決方案的最終質量起著重要作用;不過戰略價值的體現還是基於正確的策略的選擇。 When faced with a design problem, too many people freeze up in their thinking. After reading or hearing the problem, they sit down and realize that they don't know what to do next. They stare(凝視) into space, then panic(驚惶), and finally end up settling(沉澱; 決定) for the first thing that comes to mind. Avoid this fate(天數; 運氣; 命運 ). Follow the sequence of questions provided below and in most of the catalog problem sections. We'll tell you what to do next! 初學者在面對問題時常常表現出思維凝滯、手足無措和盲目解題。參考以下的反問問題列表和本書的問題清單,我們告訴你應該怎麼做。 Obviously, the more experience you have with algorithm design techniques such as dynamic programming, graph algorithms, intractability, and data structures, the more successful you will be at working through the list of questions. Part I of this book has been designed to strengthen this technical background. However, it pays to work through these questions regardless of how strong your technical skills are. The earliest and most important questions on the list focus on obtaining a detailed understanding of the problem and do not require specific expertise. 當然本反問問題列表對讀者有背景要求,要求讀者對演算法設計技術(動態規劃、圖演算法、難解性和數據結構)的熟悉程度。本書第一部分的目標就是對這些技術背景進行強化。不過,不管你的技術背景怎樣,通讀這些問題對你解題還是很有裨益的。
Ⅱ 並行演算法有哪三種設計策略
並行數據挖掘技術不同於其它並行演算法的地方在於它需要處理的數據的規模很大。人們知道,對於並行而言,交互之間的消耗(即內存的使用)是比執行時間(計算階段)重要得多的因素。串列數據挖掘演算法對於規模很小的數據也需要大量的運行時間
Ⅲ 各演算法策略中包含了哪些計算機思維的思想方法
演算法策略就是在問題空間中隨機搜索所有可能的解決問題的方法,直至選擇一種有效的方法解決問題。
演算法策略間的關系編輯
1、對問題進行分解的演算法策略——分治法與動態規劃法
共同點:(1)分治法與動態規劃法實際上都是遞歸思想的運用
(2)二者的根本策略都是對問題進行分解,找到大規模與小規模的關系,然後通過解小規模的解,得出大規模的解
不同點: 適用於分治法的問題分解成子問題後,各子問題間無公共子子問題,而動態規劃法相反。
動態規劃法 = 分治演算法思想 + 解決子問題間的冗餘情況
2、多階段逐步解決問題的策略——貪心演算法和動態規劃法
貪心演算法:每一步都根據策略得到一個結果,並傳遞到下一步,自頂向下,一步一步地做出貪心決策。
動態規劃演算法:每一步決策得到的不是一個唯一結果,而是一組中間結果(且這些結果在以後各步可能得到多次引用),只是每一步都使問題的規模逐步縮小,最終得到問題的一個結果。
計算機能夠快速、准確地「計算」的最基本的原因,就是硬體與軟體的分離、程序與數據的分離。這實際上也就是將我們人類自然語言中的思想與方法、方法與對象、思想與對象實行了分離。由於這些分離,使得計算機的程序語言中的命令與數據,都能非常精確地指稱計算機內存裡面的確定區域。
這樣,計算機「計算」的時候,就不會象人類大腦那樣,左半腦中的一個語詞指稱的是一個幾乎難以確切地劃分出「邊界」的右半腦中的圖景,而是一塊有著確定「地址」的內存區域。這樣,計算機就能夠達到快速准確地「計算」了。
Ⅳ 演算法設計的本書特點
以各種演算法設計技術(如貪心法、分治策略、動態規劃、網路流、近似演算法、隨機演算法等)為主線來組織素材,突出了演算法設計的思想和分析的基本原則,為從事實際問題的演算法設計與分析工作提供了清晰的、整體的思路和方法。
本教材內容非常豐富,不但深入系統地闡述了演算法設計與分析的理論,而且給出了大量的典型範例和參考文獻。
本教材以演算法為主線來處理演算法與數據結構的關系。這種安排突出了演算法設計的中心思想,避免了與數據結構課程在內容上的重復,更加適合於國內的教學計劃。
本教材的敘述和選材非常適合教學。內容由淺入深,由具體到抽象,從演算法設計技術與分析方法自然過渡到計算復雜性理論,選配了大量難度適當的練習,並給出求解範例。
Ⅳ 求寫一份演算法設計與分析的課程總結
演算法設計與分析是面向設計的核心課程,主要通過介紹常見的演算法設計策略及復雜性分析方法,培養學生分析問題和解決問題的能力,為開發高效的軟體系統及參加相關領域的研究工作奠定堅實的基礎。
Ⅵ 演算法設計與分析課程總結怎麼寫、急急急!!!!!!
一、演算法分析的基本思路
二、演算法設計的解決方案
三、對過程的綜合總結
Ⅶ 演算法策略設計要解決的問題是啥
理論上,許多問題可以用窮舉搜索的辦法來求解。這種解題策略會直截了當地試遍所有的可能解,直接找到問題的解為止。採用窮舉搜索時,很少需要獨具匠心的設計,因此,如果一個問題確定要用這種策略來求解的話,就很少需要人工計算,而基本上是為計算機准備的。窮舉搜索的最大局限性在於它的效率低下,通常,如果可能解的數量隨著問題規模而呈指數增長或更快的話,那麼這條途徑不僅對人類來說遙不可及,計算機也只能望而興嘆了。
策略模式(Strategy Pattern),定義了一系列的演算法,將每一種演算法封裝起來並可以相互替換使用,策略模式讓演算法獨立於使用它的客戶應用而獨立變化。
策略模式是處理演算法的不同變體的一種行為模式,通過在抽象策略中定義演算法介面或封裝演算法標識,實現該抽象策略的具體子類成為一個單獨的演算法,即具體策略。策略模式使用多個類來區別不同的行為,使用策略模式避免暴露復雜的、與演算法相關的內部數據結構。當一個類中的操作以多個條件分支語句的形式出現的時候,可以使用策略模式將相關的條件分支移入各自的具體策略類中以代替這些條件語句,從而減少系統處理的復雜度。
Ⅷ 演算法設計的步驟不包含什麼
一、學習內容
1. 演算法設計中五大常用演算法
1) 分治法
設計思想:將一個難以直接解決的大問題分解成規模較小的相同問題,以便分而治之。
實際的應用:快速排序、歸並排序
分治法在每一層遞歸上的基本步驟:
①分解:將原問題分解為若干個規模較小、相互獨立、與原問題形式相同的子問題。
②解決:若子問題規模較小就直接解決,不然就遞歸解決各個子問題
③合並:將各個子問題的解合並為原問題的解
以快速排序為例理解分治法:
快速排序代碼:
public static void quickSort(int a[],int low,int high){
if(low < high){
int pivotpos = partition(a,low,high);
quickSort(a,low,pivotpos-1);
quickSort(a,pivotpos+1,high);
}
}
public static int partition(int a[],int low,int high){
int pivot = a[low];
while (low < high){
while (low < high && a[high] >= pivot){
--high;
}
a[low] = a[high];
while (low < high && a[low] <= pivot){
++low;
}
a[high] = a[low];
}
a[low] = pivot;
return low;
}
①分解:選取基準元素,將左右兩側進行劃分
②解決:分別將兩個子序列進行快速排序
③合並:將排好的子序列合並
以兩路合並排序為例理解分治法:(分治法中的合並在歸並排序中體現得更加清楚)
歸並排序代碼:
public static void merge(int a[],int low,int mid,int high){
int[] temp = new int[high-low+1];
int i = low;
int j = mid+1;
int k = 0;
while (i <= mid && j <= high){
if(a[i] < a[j]){
temp[k++] = a[i++];
}else {
temp[k++] = a[j++];
}
}
//把左邊剩下的移到數組中
while (i <= mid){
temp[k++] = a[i++];
}
//把右邊剩下的移到數組中
while (j <= high){
temp[k++] = a[j++];
}
//更新原數組
for (int x = 0;x <temp.length;x++){
a[x+low] = temp[x];
}
}
public static int[] mergeSort(int a[],int low,int high){
int mid = (low+high)/2;
if(low < high){
mergeSort(a,low,mid);
mergeSort(a,mid+1,high);
//左右合並
merge(a,low,mid,high);
}
return a;
}
①分解:將一個數組一刀切兩半,遞歸切,直到切成單個元素
②解決:單個元素合並成有序的小數組
③合並:小數組合並成大數組,最終合並完成
2) 動態規劃法
設計思想:最優化原理,即一個過程的最優決策具有這樣的性質:即無論其初始狀態和初始決策如何,其今後諸策略對以第一個決策所形成的狀態作為初始狀態的過程而言,必須構成最優策略
動態規劃法所要滿足的條件:
①問題中的狀態滿足最優化原理
②問題中的狀態必須滿足無後效性,無後效性指的是下一時刻的狀態只與當前的狀態 有關而與當前狀態的之前狀態無關。
動態規劃三要素:
①問題的階段
②每個階段的狀態
③從前一個階段轉換到後一個階段的遞推關系
實際的應用:0/1背包問題 最長公共子串問題
以最長公共子串問題為例理解動態規劃法:
定義dp[i][j]表示以A中第i個字元結尾的子串和B中第j個字元結尾的子串的最大公共子串,dp 的大小也為 (n + 1) x (m + 1) ,這多出來的一行和一列是第 0 行和第 0 列,初始化為 0,表示空字元串和另一字元串的子串的最長公共子串。
當我們要求dp[i][j]時,我們要先判斷A的第i個元素B的第j個元素是否相同即判斷A[i - 1]和 B[j -1]是否相同,如果相同它就是dp[i - 1][j- 1] + 1,相當於在兩個字元串都去掉一個字元時的最長公共子串再加 1;否則最長公共子串取0。所以整個問題的初始狀態為:
dp[i][0]=0,dp[0][j]=0
相應的狀態轉移方程為:
實現代碼:
public static int findLongest(String A,String B){
int n = A.length();
int m = B.length();
if(m == 0 || n == 0){
return 0;
}
int result = 0;
int[][] dp = new int[n+1][m+1];
//初始狀態
for(int i = 0; i <= n;i++){
dp[i][0] = 0;
}
for(int i = 0; i <= m;i++){
dp[0][i] = 0;
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(A.charAt(i-1) == B.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
result = Math.max(result,dp[i][j]);
}else {
dp[i][j] = 0;
}
}
}
return result;
}
Ⅸ 《演算法設計與分析》。求大神幫幫忙。選擇題
演算法設計與分析》是2009年8月1日國防工業出版社出版的圖書,作者是張德富。本書主要取材於演算法設計與分析領域的經典內容,介紹了演算法設計的發展趨
Ⅹ 《演算法分析與設計》課程講什麼內容
《演算法分析與設計》課程是理論性與應用性並重的專業課程。本課程以演算法設計策略為知識單元,系統地介紹計算機演算法的設計方法和分析技巧。課程教學主要內容包括:第一章,演算法概述;第二章,遞歸與分治策略;第三章,動態規劃;第四章,貪心演算法;第五章,回溯法;第六章,分支限界法。通過介紹經典以及實用演算法讓同學掌握演算法設計的基本方法。結合實例分析,讓同學深入理解演算法設計的技巧,以及分析演算法的能力。