① 請大俠給我推薦幾個演算法的書.因為我沒讀過,所以請在回答的時候告訴我推薦的理由,最好有內容.
《演算法導論》
本書深入淺出,全面地介紹了計算機演算法。對每一個演算法的分析既易於理解又十分有趣,並保持了數學嚴謹性。本書的設計目標全面,適用於多種用途。涵蓋的內容有:演算法在計算中的作用,概率分析和隨機演算法的介紹。本書專門討論了線性規劃,介紹了動態規劃的兩個應用,隨機化和線性規劃技術的近似演算法等,還有有關遞歸求解、快速排序中用到的劃分方法與期望線性時間順序統計演算法,以及對貪心演算法元素的討論。本書還介紹了對強連通子圖演算法正確性的證明,對哈密頓迴路和子集求和問題的NP完全性的證明等內容。全書提供了900多個練習題和思考題以及敘述較為詳細的實例研究。
目錄(Table of Contents)
前言(Preface)
第一部分(Part I) 基礎(Foundations)
第一章 計算中演算法的角色(The Role of Algorithms in Computing)
第二章 開始(Getting Started)
第三章 函數的增長率(Growth of Functions)
第四章 遞歸(Recurrences)
第五章 概率分析與隨機化演算法(Probabilistic Analysis and Randomized Algorithms)
第二部分(Part II) 排序與順序統計(Sorting and Order Statistics)
第六章 堆排序(Heapsort)
第七章快速排序(Quicksort)
第八章 線性時間中的排序(Sorting in Linear Time)
第九章 中值與順序統計(Medians and Order Statistics)
第三部分(Part III) 數據結構(Data Structures)
第十章 基本的數據結構(Elementary Data Structures)
第十一章 散列表(Hash Tables)
第十二章 二叉查找樹(Binary Search Trees)
第十三章 紅-黑樹(Red-Black Trees)
第十四章 擴充的數據結構(Augmenting Data Structures)
第四部分(Part IV) 高級的設計與分析技術(Advanced Design and Analysis Techniques)
第十五章 動態規劃(Dynamic Programming)
第十六章 貪婪演算法(Greedy Algorithms)
第十七章 分攤分析(Amortized Analysis)
第五部分(Part V) 高級的數據結構(Advanced Data Structures)
第十八章 B-樹(B-Trees)
第十九章 二項式堆(Binomial Heaps)
第二十章 斐波納契堆(Fibonacci Heaps)
第二十一章 不相交集的數據結構(Data Structures for Disjoint Sets)
第六部分(Part VI) 圖演算法(Graph Algorithms)
第二十二章 基本的圖演算法(Elementary Graph Algorithms)
第二十三章 最小生成樹(Minimum Spanning Trees)
第二十四章單源最短路徑(Single-Source Shortest Paths)
第二十五章 全對的最短路徑(All-Pairs Shortest Paths)
第二十六章 最大流(Maximum Flow)
第七部分(Part VII) 精選的主題(Selected Topics)
第二十七章 排序網路(Sorting Networks)
第二十八章矩陣運算(Matrix Operations)
第二十九章 線性規劃(Linear Programming)
第三十章 多項式與快速傅里葉變換(Polynomials and the FFT)
第三十一章 數論演算法(Number-Theoretic Algorithms)
第三十二章 字元串匹配(String Matching)
第三十三章 計算幾何學(Computational Geometry)
第三十四章 NP-完備性(NP-Completeness)
第三十五章 近似演算法(Approximation Algorithms)
第八部分(Part VIII) 附錄:數學背景(Mathematical Background)
附錄A 求和(Summations)
附錄B 集合,等等。(Sets, Etc.)
附錄C 計數與概率(Counting and Probability)
參考文獻(Bibliography)
索引(Index)
② fft源程序
這個是我上個星期才交的課程設計裡面的源代碼,絕對可以運行的。本人也覺得應該比較容易看懂吧。
#include<iostream>
#include<math.h>
using namespace std;
#define PI 3.1415927
#define MAX 20000
////////////////////////////////
//以指數形式表示的復數
/////////////////////////////////
struct CompExp
{
float AbValue;
float Angle;
};
//////////////////////////////////////
//以一般形式表示的復數
///////////////////////////////////////
struct Complex
{
float Re;
float Im;
}A[MAX];
int n;
float a[MAX] ;
//////////////////////////////////////////
//將一個數的二進制數反轉之後的新數返回
//例如6->110->011->3
//////////////////////////////////////////
int Rev(int i)
{
int index,s; //index為要返回的數
s=(int)log2(n);
index=0;
while(s>0)
{
s--;
index+=(i%2)*(int)pow(2,s);
i=i/2;
}
return index;
}
////////////////////////////////////////////
//將輸入的離散數據進行位反置轉換,並復制在復數數組A中
////////////////////////////////////////////
void bit(float* a, Complex* A)
{
for(int i=0;i<n;i++)
{
A[Rev(i)].Re=a[i];
A[Rev(i)].Im=0;
}
}
/////////////////////////////////////////////
//復數的加法a+b=c
/////////////////////////////////////////////
void Add(Complex* a, Complex* b, Complex* c)
{
c->Re = a->Re + b->Re;
c->Im = a->Im + b->Im;
}
/////////////////////////////////////////////
//復數的減法a-b=c
/////////////////////////////////////////////
void Sub(Complex* a, Complex* b, Complex* c)
{
c->Re = a->Re - b->Re;
c->Im = a->Im - b->Im;
}
////////////////////////////////////////////
//復數的乘法a*b=c
////////////////////////////////////////////
void Mul(Complex* a, Complex* b, Complex* c)
{
float tempRe,tempIm;
tempRe = a->Re * b->Re - a->Im * b->Im;
tempIm = a->Re * b->Im + a->Im * b->Re;
c->Re = tempRe;
c->Im = tempIm;
}
/////////////////////////////////////////
//將復數從指數形式轉化為一般形式
/////////////////////////////////////////
void CompTrans(CompExp* a, Complex* b)
{
b->Re = a->AbValue * cos(a->Angle);
b->Im = a->AbValue * sin(a->Angle);
}
///////////////////////////////////////
//基於迭代的快速傅里葉演算法
///////////////////////////////////////
void FFT()
{
Complex Wm,W,u,t;
CompExp wm,w;
bit(a,A);
for(int i=1;i<=(int)log2(n);i++)
{
int m=(int)pow(2,i);
wm.AbValue = 1;
wm.Angle = -2*PI/m;
CompTrans(&wm,&Wm);
for(int k=0;k<n;k+=m)
{
w.AbValue = 1;
w.Angle = 0;
CompTrans(&w,&W);
for(int j=0;j<m/2;j++)
{
Mul(&W,&A[k+j+m/2],&t);
u=A[k+j]; //蝴蝶操作
Add(&u,&t,&A[k+j]);
Sub(&u,&t,&A[k+j+m/2]);
Mul(&W,&Wm,&W);
}
}
}
}
///////////////////////////////////
//測試輸入的離散點個數n是否是二的冪
///////////////////////////////////
int test(int i)
{
while(1)
{
if(i==2)break;
if(i/2*2!=i)return 0;
i=i/2;
}
return 1;
}
//////////////////////////////////
//管理輸入的函數
//////////////////////////////////
void Input()
{
cout<<"請輸入離散數據的個數,合法的輸入為2的正整數冪:"<<endl;
cin>>n;
while(!test(n))
{
cout<<"序列長度不合法,請重新輸入:"<<endl;
cin>>n;
}
for(int i=0;i<n;i++)
{
cout<<"x["<<i<<"]= ";
cin>>a[i];
}
}
//////////////////////////////////
//管理輸出的函數
//////////////////////////////////
void Output()
{
for(int i=0;i<n;i++)
cout<<"X["<<i<<"]= ("<<A[i].Re<<") + j("<<A[i].Im<<")"<<endl;
cout<<endl;
}
///////////////////////////////////
//程序入口
///////////////////////////////////
int main()
{
while(1)
{
Input();
FFT();
Output();
}
}
③ 計算機科學與技術相關書籍
就計算機科學與技術而言,我知道的《演算法導論》這本書挺合適的,這裡面涵蓋了計算機的幾乎所有的演算法,對於學習計算機編程的人而言十分重要。學懂了這本書,就可以應付很多的考試和比賽。
附:
目錄(Table of Contents)
前言(Preface)
第一部分(Part I) 基礎(Foundations)
第一章 計算中演算法的角色(The Role of Algorithms in Computing)
第二章 開始(Getting Started)
第三章 函數的增長率(Growth of Functions)
第四章 遞歸(Recurrences)
第五章 概率分析與隨機化演算法(Probabilistic Analysis and Randomized Algorithms)
第二部分(Part II) 排序與順序統計(Sorting and Order Statistics)
第六章 堆排序(Heapsort)
第七章 快速排序(Quicksort)
第八章 線性時間中的排序(Sorting in Linear Time)
第九章 中值與順序統計(Medians and Order Statistics)
第三部分(Part III) 數據結構(Data Structures)
第十章 基本的數據結構(Elementary Data Structures)
第十一章 散列表(Hash Tables)
第十二章 二叉查找樹(Binary Search Trees)
第十三章 紅-黑樹(Red-Black Trees)
第十四章 擴充的數據結構(Augmenting Data Structures)
第四部分(Part IV) 高級的設計與分析技術(Advanced Design and Analysis Techniques)
第十五章 動態規劃(Dynamic Programming)
第十六章 貪婪演算法(Greedy Algorithms)
第十七章 分攤分析(Amortized Analysis)
第五部分(Part V) 高級的數據結構(Advanced Data Structures)
第十八章 B-樹(B-Trees)
第十九章 二項式堆(Binomial Heaps)
第二十章 斐波納契堆(Fibonacci Heaps)
第二十一章 不相交集的數據結構(Data Structures for Disjoint Sets)
第六部分(Part VI) 圖演算法(Graph Algorithms)
第二十二章 基本的圖演算法(Elementary Graph Algorithms)
第二十三章 最小生成樹(Minimum Spanning Trees)
第二十四章 單源最短路徑(Single-Source Shortest Paths)
第二十五章 全對的最短路徑(All-Pairs Shortest Paths)
第二十六章 最大流(Maximum Flow)
第七部分(Part VII) 精選的主題(Selected Topics)
第二十七章 排序網路(Sorting Networks)
第二十八章 矩陣運算(Matrix Operations)
第二十九章 線性規劃(Linear Programming)
第三十章 多項式與快速傅里葉變換(Polynomials and the FFT)
第三十一章 數論演算法(Number-Theoretic Algorithms)
第三十二章 字元串匹配(String Matching)
第三十三章 計算幾何學(Computational Geometry)
第三十四章 NP-完備性(NP-Completeness)
第三十五章 近似演算法(Approximation Algorithms)
第八部分(Part VIII) 附錄:數學背景(Mathematical Background)
附錄A 求和(Summations)
附錄B 集合,等等。(Sets, Etc.)
附錄C 計數與概率(Counting and Probability)
參考文獻(Bibliography)
索引(Index)
④ 演算法導論的作品目錄
目錄(Table of Contents)
前言(Preface)
第一部分(Part I) 基礎(Foundations)
第一章 計算中演算法的角色(The Role of Algorithms in Computing)
第二章 開始(Getting Started)
第三章 函數的增長率(Growth of Functions)
第四章 遞歸(Recurrences)
第五章 概率分析與隨機化演算法(Probabilistic Analysis and Randomized Algorithms)
第二部分(Part II) 排序與順序統計(Sorting and Order Statistics)
第六章 堆排序(Heapsort)
第七章快速排序(Quicksort)
第八章 線性時間中的排序(Sorting in Linear Time)
第九章 中值與順序統計(Medians and Order Statistics)
第三部分(Part III) 數據結構(Data Structures)
第十章 基本的數據結構(Elementary Data Structures)
第十一章 散列表(Hash Tables)
第十二章 二叉查找樹(Binary Search Trees)
第十三章 紅-黑樹(Red-Black Trees)
第十四章 擴充的數據結構(Augmenting Data Structures)
第四部分(Part IV) 高級的設計與分析技術(Advanced Design and Analysis Techniques)
第十五章 動態規劃(Dynamic Programming)
第十六章 貪婪演算法(Greedy Algorithms)
第十七章 分攤分析(Amortized Analysis)
第五部分(Part V) 高級的數據結構(Advanced Data Structures)
第十八章 B-樹(B-Trees)
第十九章 二項式堆(Binomial Heaps)
第二十章 斐波納契堆(Fibonacci Heaps)
第二十一章 不相交集的數據結構(Data Structures for Disjoint Sets)
第六部分(Part VI) 圖演算法(Graph Algorithms)
第二十二章 基本的圖演算法(Elementary Graph Algorithms)
第二十三章 最小生成樹(Minimum Spanning Trees)
第二十四章單源最短路徑(Single-Source Shortest Paths)
第二十五章 全對的最短路徑(All-Pairs Shortest Paths)
第二十六章 最大流(Maximum Flow)
第七部分(Part VII) 精選的主題(Selected Topics)
第二十七章 排序網路(Sorting Networks)
第二十八章矩陣運算(Matrix Operations)
第二十九章 線性規劃(Linear Programming)
第三十章 多項式與快速傅里葉變換(Polynomials and the FFT)
第三十一章 數論演算法(Number-Theoretic Algorithms)
第三十二章 字元串匹配(String Matching)
第三十三章 計算幾何學(Computational Geometry)
第三十四章 NP-完備性(NP-Completeness)
第三十五章 近似演算法(Approximation Algorithms)
第八部分(Part VIII) 附錄:數學背景(Mathematical Background)
附錄A 求和(Summations)
附錄B 集合,等等。(Sets, Etc.)
附錄C 計數與概率(Counting and Probability)
參考文獻(Bibliography)
索引(Index)
⑤ 為什麼《演算法導論》中的數組序號是從1開始的
c語言下標從零開始是個錯誤,並且 index 也是一個有誤導性的名詞,它表示的是偏移量,明明應該用 offset。
然後 c 的徒子徒孫都學了它,導致現在很多人都誤以為下標應該從 0 開始。
早期蠻荒時代,很多東西都不科學,演算法導論作者致力於與落後文明作斗爭,然而卻遭到了樓主你的不理解,實乃編程屆一大憾事。
我再說一遍,C 是結構化的匯編,下標基 0 是受到了 PDP-11 指令集的影響,更老的語言(比如 Fortran)都是基 1 的。
另外用 0/非 0 代表 false/true 也是 PDP-11 中 TST 指令和 Z 位的行為。
可能是這本書強調演算法的求學思想,所以從一更加符合數學的數組規定。
但是編程的時候,指針這個東西會經常用到,如果用a(o)作為第一個元素 那麼*a+n就等同於a(n) 比較方便
演算法導論上的這個問題呢,我覺得我比較同意樓上的看法,這個書上面的很多的程序並不是可以敲上去直接運行的,他只是偽代碼,思想而已,給人看的,人類的普遍思維是從1開始,那麼書頁就是從1開始了
說編程語言是給機器看而偽代碼是給人看的簡直是逗大家笑吧...編程語言設計出來就是給人看的....
另外從0開始在很多方便都極好....我覺得寫多代碼都能體會到吧..
幫算導洗地:
演算法導論通篇用的是偽代碼 是給人類閱讀理解的 不是設計給機器去運行的
而絕大多數情況下, index 從 1 開始更符合人類直覺(如果你對這點有異議請參考的答案 )
但少數情況下, index 從 0 開始更符合人類直覺。例如書中 hashing 還有 FFT 那塊內容, index 是從 0 開始的。
其實寫幾天 Pascal 你就適應啦。。
⑥ 計算機專業學演算法的都學些什麼演算法,有什麼書可以看的學的話需要些什麼基礎的
計算機演算法非常多的
A*搜尋演算法
俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於游戲中的NPC的移動計算,或線上游戲的BOT的移動計算上。該演算法像Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
Beam Search
束搜索(beam search)方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜索,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。束搜索於20 世紀70年代中期首先被應用於人工智慧領域,1976 年Lowerre在其稱為HARPY的語音識別系統中第一次使用了束搜索方法。他的目標是並行地搜索幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。
二分取中查找演算法
一種在有序數組中查找某一特定元素的搜索演算法。搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。這種搜索演算法每一次比較都使搜索范圍縮小一半。
Branch and bound
分支定界(branch and bound)演算法是一種在問題的解空間樹上搜索問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界演算法中,每一個活結點只有一次機會成為擴展結點。
數據壓縮
數據壓縮是通過減少計算機中所存儲數據或者通信傳播中數據的冗餘度,達到增大數據密度,最終使數據的存儲空間減少的技術。數據壓縮在文件存儲和分布式系統領域有著十分廣泛的應用。數據壓縮也代表著尺寸媒介容量的增大和網路帶寬的擴展。
Diffie–Hellman密鑰協商
Diffie–Hellman key exchange,簡稱「D–H」,是一種安全協議。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。
Dijkstra』s 演算法
迪科斯徹演算法(Dijkstra)是由荷蘭計算機科學家艾茲格·迪科斯徹(Edsger Wybe Dijkstra)發明的。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹演算法可以用來找到兩個城市之間的最短路徑。
動態規劃
動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。比較著名的應用實例有:求解最短路徑問題,背包問題,項目管理,網路流優化等。這里也有一篇文章說得比較詳細。
歐幾里得演算法
在數學中,輾轉相除法,又稱歐幾里得演算法,是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。
最大期望(EM)演算法
在統計計算中,最大期望(EM)演算法是在概率(probabilistic)模型中尋找參數最大似然估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variable)。最大期望經常用在機器學習和計算機視覺的數據聚類(Data Clustering)領域。最大期望演算法經過兩個步驟交替進行計算,第一步是計算期望(E),利用對隱藏變數的現有估計值,計算其最大似然估計值;第二步是最大化(M),最大化在 E 步上求得的最大似然值來計算參數的值。M 步上找到的參數估計值被用於下一個 E 步計算中,這個過程不斷交替進行。
快速傅里葉變換(FFT)
快速傅里葉變換(Fast Fourier Transform,FFT),是離散傅里葉變換的快速演算法,也可用於計算離散傅里葉變換的逆變換。快速傅里葉變換有廣泛的應用,如數字信號處理、計算大整數乘法、求解偏微分方程等等。
哈希函數
HashFunction是一種從任何一種數據中創建小的數字「指紋」的方法。該函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列函數在輸入域中很少出現散列沖突。在散列表和數據處理中,不抑制沖突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。
歸並排序
Merge sort是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
RANSAC 演算法
RANSAC 是」RANdom SAmpleConsensus」的縮寫。該演算法是用於從一組觀測數據中估計數學模型參數的迭代方法,由Fischler and Bolles在1981提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。該演算法的基本假設是觀測數據集中存在」inliers」(那些對模型參數估計起到支持作用的點)和」outliers」(不符合模型的點),並且這組觀測數據受到雜訊影響。RANSAC 假設給定一組」inliers」數據就能夠得到最優的符合這組點的模型。
RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經專利失效,其被廣泛地用於電子商務加密,大家都相信,只要密鑰足夠長,這個演算法就會是安全的。
並查集Union-find
並查集是一種樹型的數據結構,用於處理一些不相交集合(Disjoint Sets)的合並及查詢問題。常常在使用中以森林來表示。
Viterbi algorithm
尋找最可能的隱藏狀態序列(Finding most probable sequence of hidden states)。
⑦ C和C++演算法
離散數學比較多,工程數學中涉及到的矩陣啊,多元數等。。
看了你的補充,也來補充一下吧,這下要從1樓掉到幾十樓了,說說我的體驗,每個人的情況都有所不同,不必完全看我的哈。
我個人是搞游戲開發的,在游戲中我們不斷的用到一個概念就是矩陣,這個屬於線性代數的內容,向量,這個是高宗數學的內容。
數值分析:說實話吧,對鍛煉編程能力有幫助,在實際應用中感覺並不多,至少我並沒有遇到很多次。
高等代數:說石化,這個用得更少了,真的,個人覺得高等數學並不是讓你學數學了,學的是一種數學理念,是對數學的抽象能力,這對於計算機的學生來說,是很重要的。
高等幾何,沒怎麼聽說過,或許有用吧。
我是計算機專業的大學生,演算法分析我也學過了,其實感覺就是用到的數學知識真的不是非常多,也不需要非常高深的數學知識,或者是我的接觸面不夠吧。。。但是數學好對計算機編程水平是很有幫助的
特別注意一點,離散數學是相當有用的,感覺是整個計算機數學的基礎。。。
累了一天了,好累,希望對你有幫助!
⑧ 如何用C語言實現FFT演算法(比如窗函數演算法),求高手指點一二
參見 數字信號處理第三版 程佩清 著,演算法導論里也有講FFT的
英飛凌單片機又不是DSP 應該沒有內嵌的演算法,所以應該可以直接套用通用的C語言程序
⑨ 除了《演算法導論》 還有什麼地方可以看到不錯的FFT的講解
數字信號處理。
⑩ 高中生能看懂演算法導論嗎
演算法導論不是一本noi參賽選手應該看的書。理論性太強,學得慢、而且演算法不夠深刻。如果你只學習了語言,那麼ls推薦的《演算法藝術》也不適用,你想參加的應該是noip,noi是在noip上一個層次的全國比賽,到了noi水平應該看的是演算法藝術而不是演算法導論,《演算法藝術》在當當網上有買
不過現在關於noip的書幾乎都是用pascal語言寫的,我當時學的時候也是用pascal,現在轉了c++。所以我推薦的書都是pascal寫的。。。《奧賽經典》和《全國青少年信息學奧林匹克教程》,如果你不習慣,可以選擇買大學的acm教程來看(acm是大學生的全球性信息學競賽,大學生幾乎都用c、c++或者java,書多用c和c++寫),配套做poj(1l推薦的那個網站~)
另外你可以關注一下noi、noip競賽官網 http://www.noi.cn
還有oier經常去的網站 www.oibh.org/bbs 可以上去問題、找資料
ps,數學知識也很重要,其他文化科可以放,數學已經要跟上~
祝成功~