復列演算法
Ⅰ 求歸並排序演算法!
歸並排序。
1.這里,在把數組暫時復制到臨時數組時,將第二個子數組中的順序顛倒了一下。這樣,兩個子數組從兩端開始處理,使得他們互相成為另一個數組的「檢查哨」。 這個方法是由R.Sedgewick發明的歸並排序的優化。
2.在數組小於某一閥值時,不繼續歸並,而直接使用插入排序,提高效率。這里根據Record的結構,將閥值定位 16。
#define THRESHOLD 16
typedef struct _Record{
int data; //數據
int key; //鍵值
}Record;
//供用戶調用的排序 函數
void Sort(Record Array[], Record TempArray, int left, int right){
TwoWayMergeSort(Array, TempArray, left, right);
}
//歸並排序
void TwoWayMergeSort(Record Array[], Record TempArray[],
int left, int right)
{
if(right <= left) return; //如果只含一個元素,直接返回
if( right-left+1 ){ //如果序列長度大於閥值,繼續遞歸
int middle = (left + right)/2;
Sort(Array, TempArray, left, middle); //對左面進行遞歸
Sort(Array, TempArray, left, right, middle); //對右面進行遞歸
Merge(Array, TempArray, left, right, middle); //合並
}
else{
//如果序列長度小於閥值,採用直接插入排序,達到最佳效果
ImproveInsertSorter(&Array[left], right-left+1);
}
}
//歸並過程
void Merge(Record Array[], Record TempArray[],
int left, int right, int middle)
{
int index1, index2; //兩個子序列的起始位置
int k;
復制左邊的子序列
for(int i=1; i<=middle; i++){
TempArray[i] = Array[i];
}
//復制右邊的子序列,但順序顛倒過來
for(int j=1; j<=right-middle; j++){
TempArray[right-j+1] = Array[j+middle];
}
//開始歸並
for(index1=left, index2=right, k=left; k<=right; k++){
if(TempArray[index1].key<TempArray[index2].key){
Array[k] = TempArray[index++];
}
else{
Array[k] = TempArray[index2--];
}
}
}
//當長度小於閥值時 使用的直接插入排序的代碼
void ImproveInsertSorter(Record Array[], int size){
Record TempRecord; //臨時變數
for(int i=1; i<size; i++){
TempRecord = Array[i];
int j = i-1;
//從i開始往前尋找記錄i的正確位置
while(j>=0 && TempRecord.key<Array[j].key){
Array[j+1] = Array[j];
j = j-1;
}
Array[j+1] = TempRecord;
}
}
終於敲完了。。。 第一次回答問題, 只是覺得好玩`
Ⅱ java雙色球排列組合演算法 - 根據復式列出所有單式號碼
//C ( n , k )
public class SelectK {
public static int[] nums = {1, 2, 3,4,5,6,7};
public static ArrayList<ArrayList<Integer>> result = new ArrayList<>();
public static void select(ArrayList<Integer> inner, int start, int k) {
for(int i=start; i<nums.length; i++) {
inner.add(nums[i]);
if (inner.size() == k) {
result.add(new ArrayList<>(inner));
inner.remove(inner.size()-1);
continue;
}
select(inner, i+1, k);
inner.remove(inner.size()-1);
}
}
public static void main(String[] args) {
ArrayList<Integer> inner = new ArrayList<>();
int k = 6;
select(inner, 0, k);
for(ArrayList<Integer> each: result) {
System.out.println(StringUtils.join(each, ","));
}
}
}
Ⅲ 重復排序演算法,5個1,6個2,7個3,求最快全排列的演算法
求全排列非遞歸演算法(生成演算法):
1。求出第一個排列111112222223333333並輸出
2。從後向前找到第一個升序s[i]<s[i+1]
3。從後向前找到第一個大於s[i]的s[j]
4。將s[i]與s[j]交換
5。將s[i]以後的部分逆置,輸出這個排列;
6。如已是最後一個排列333333322222211111,演算法結束;否則轉2。
共有排列總數為:
18!/(5!*6!*7!)=14702688 種方案
Ⅳ 實序列的FFT演算法
在以上討論FFT演算法中,均假定序列x(l)為復的,但實際問題中的序列大多為實的。當然,我們可以把實序列處理成虛部為零的復序列。因此,就要引進許多零參加運算。這樣一來,在機器運算時間和存儲單元方面都將造成很大的浪費。在本段中,我們介紹對實序列x(l)應用FFT演算法的一個有效方法。
1.同時計算兩個實序列的FFT演算法
設有N=4的兩個實序列x1(l)與x2(l)。為了求得它們的譜X1(m)與X2(m),我們用此二實序列構造成如下復序列
物探數字信號分析與處理技術
利用上一段的方法,可以求得復序列x(l)的譜X(m)。根據(7-3-1)得到
物探數字信號分析與處理技術
上式中的m用N-m代替,則得
物探數字信號分析與處理技術
將上式兩端取共軛,根據對稱性有
物探數字信號分析與處理技術
根據DFT的復共軛性質,對於實序列x1(l)與x2(l),有
物探數字信號分析與處理技術
於是從(7-3-4)得到
物探數字信號分析與處理技術
聯立求解(7-3-2)和(7-3-6)便得到
物探數字信號分析與處理技術
例如設有兩個N=4點的實序列,
物探數字信號分析與處理技術
我們用它們構造一個N=4點的復序列
物探數字信號分析與處理技術
利用FFT演算法求X(m),m=0,1,2,3(圖7-3-1),
圖7-3-1 N=4點的FFT演算法流程圖
於是得到
物探數字信號分析與處理技術
因此從式(7-3-7)得到
物探數字信號分析與處理技術
物探數字信號分析與處理技術
2.實序列的FFT演算法
設有N點的實序列x(l),l=0,1,2,…,N-1。按照點的奇偶編號,將它們分成N/2個點的兩個子序列
物探數字信號分析與處理技術
設x1(l)的譜與x2(l)的譜分別為X1(m)與X2(m)
物探數字信號分析與處理技術
其中
於是可以將實序列x(l)的譜X(m),用兩個子序列x1(l),x2(l)的譜X1(m),X2(m)來表示
物探數字信號分析與處理技術
其中
物探數字信號分析與處理技術
注意,x1(l),x2(l)與X1(m),X2(m)均以N/2為周期,
利用x1(l)、x2(l)構成如下復序列
物探數字信號分析與處理技術
利用FFT演算法可以求得復序列 的譜 。根據(7-3-7)就求得兩個實子序列的譜X1(m)與X2(m)
物探數字信號分析與處理技術
有了X1(m),X2(m),根據(7-3-10)就可求得X(m)。以上就是用FFT演算法求實序列x(l)的譜X(m)的方法。必須指出,用公式(7-3-10)求X(m)時,第一,兩個實子序列的譜X1(m),X2(m)及復序列x珓(l)的譜珘X(m)均是以N/2為周期的周期序列;第二,由於x
(l)是實序列,根據DFT的復共軛性質有X(m)=X*(N-m),m=0,1,…,N/2,故只需求得前(N/2)+1個點的X(m),就得到全部N個點的X(m)了
例如,有N=8點的實序列,
物探數字信號分析與處理技術
首先,按點的奇偶編號分成兩個實子序列,
物探數字信號分析與處理技術
其次用它們構造如下復序列,
物探數字信號分析與處理技術
用FFT演算法求此復序列的譜 (圖7-3-2)
圖7-3-2 N=4點的FFT演算法流程圖
於是得到:
根據周期性,有
物探數字信號分析與處理技術
根據(7-3-12)式,
物探數字信號分析與處理技術
根據周期性,有
物探數字信號分析與處理技術
故最終由(7-3-10)得到
物探數字信號分析與處理技術
Ⅳ (2)非數值計算常用經典演算法
1、交換(兩量交換藉助第三者) 不藉助第三個變數
參考:
http://blog.csdn.net/hackbuteer1/article/details/6531775
2、累加
累加演算法的要領是形如「s=s+A」的累加式,此式必須出現在循環中才能被反復執行,從而實現累加功能。「A」通常是有規律變化的表達式,s在進入循環前必須獲得合適的初值,通常為0。
例如:求1+2+3+……+100的和。
sum=0;i=1;
sum=sum+i;
i++;
3、累乘
累乘演算法的要領是形如「s=s*A」的累乘式,此式必須出現在循環中才能被反復執行,從而實現累乘功能。「A」通常是有規律變化的表達式,s在進入循環前必須獲得合適的初值,通常為1。
例如:求10!
n=10;sum=1;
n>0
sum=sum*n;
n--;
也稱為「枚舉法」,即將可能出現的每一種情況一一測試,判斷是否滿足條件,一般採用循環來實現。
例如:用窮舉法輸出所有的水仙花數(即這樣的三位正整數:其每位數位上的數字的立方和與該數相等,比如:13+53+33=153)。
參考:
http://www.cnblogs.com/fanyong/archive/2012/03/23/2413559.html
http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html
冒泡排序
假設要對含有n個數的序列進行升序排列,冒泡排序演算法步驟是:
1、從存放序列的數組中的第一個元素開始到最後一個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;
2、第一趟結束後,最大數就存放到數組的最後一個元素里了,然後從第一個元素開始到倒數第二個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;
3、重復步驟1 n-1趟,每趟比前一趟少比較一次,即可完成所求。
(2)選擇法排序
選擇法排序是相對好理解的排序演算法。假設要對含有n個數的序列進行升序排列,演算法步驟是:
1、從數組存放的n個數中找出最小數的下標(演算法見下面的「求最值」),然後將最小數與第1個數交換位置;
2、除第1個數以外,再從其餘n-1個數中找出最小數(即n個數中的次小數)的下標,將此數與第2個數交換位置;
3、重復步驟1 n-1趟,即可完成所求。
(3)插入法排序
要想很好地掌握此演算法,先請了解「有序序列的插入演算法」,就是將某數據插入到一個有序序列後,該序列仍然有序。插入法排序的要領就是每讀入一個數立即插入到最終存放的數組中,每次插入都使得該數組有序。
參考:
http://www.cnblogs.com/fanyong/archive/2012/03/23/2413553.html
**(4)歸並排序 **
即將兩個都升序(或降序)排列的數據序列合並成一個仍按原序排列的序列。
例如:有一個含有6個數據的升序序列和一個含有4個數據的升序序列,將二者合並成一個含有10個數據的升序序列。
參考: http://blog.csdn.net/cwj649956781/article/details/7409635
(1)順序查找(即線性查找)
順序查找的思路是:將待查找的量與數組中的每一個元素進行比較,若有一個元素與之相等則找到;若沒有一個元素與之相等則找不到。
例如:任意讀入10個數存放到數組a中,然後讀入待查找數值,存放到x中,判斷a中有無與x等值的數。
(2)折半查找(即二分法)
順序查找的效率較低,當數據很多時,用二分法查找可以提高效率。使用二分法查找的前提是數列必須有序。
二分法查找的思路是:要查找的關鍵值同數組的中間一個元素比較,若相同則查找成功,結束;否則判別關鍵值落在數組的哪半部分,就在這半部分中按上述方法繼續比較,直到找到或數組中沒有這樣的元素值為止。
例如:任意讀入一個整數x,在升序數組a中查找是否有與x等值的元素。
參考: http://blog.csdn.net/shuilan0066/article/details/7608096
Ⅵ RAFT與PBFT
【一.raft演算法】
因為網上已經有大量文章對raft演算法進行過詳細的介紹,因此這部分只會簡單的闡述演算法的基本原理和流程。raft演算法包含三種角色,分別是:跟隨者(follower),候選人(candidate)和領導者(leader)。集群中的一個節點在某一時刻只能是這三種狀態的其中一種,這三種角色是可以隨著時間和條件的變化而互相轉換的。
raft演算法主要有兩個過程:一個過程是領導者選舉,另一個過程是日誌復制,其中日誌復制過程會分記錄日誌和提交數據兩個階段。raft演算法支持最大的容錯故障節點是(N-1)/2,其中N為 集群中總的節點數量。
國外有一個動畫介紹raft演算法介紹的很透徹,鏈接地址在這里[1]。這個動畫主要包含三部分內容,第一部分介紹簡單版的領導者選舉和日誌復制的過程,第二部分內容介紹詳細版的領導者選舉和日誌復制的過程,第三部分內容介紹的是如果遇到網路分區(腦裂),raft演算法是如何恢復網路一致的。有興趣的朋友可以結合這個動畫來更好的理解raft演算法。
【二.pbft演算法】
pbft演算法的提出主要是為了解決拜占庭將軍問題。什麼是拜占庭將軍問題呢?拜占庭位於如今的土耳其的伊斯坦布爾,是古代東羅馬帝國的首都。拜占庭羅馬帝國國土遼闊,為了達到防禦目的,每塊封地都駐扎一支由將軍統領的軍隊,每個軍隊都分隔很遠,將軍與將軍之間只能靠信差傳遞消息。 在戰爭的時候,拜占庭軍隊內所有將軍必需達成一致的共識,決定是否有贏的機會才去攻打敵人的陣營。但是,在軍隊內有可能存有叛徒和敵軍的間諜,左右將軍們的決定影響將軍們達成一致共識。在已知有將軍是叛徒的情況下,其餘忠誠的將軍如何達成一致協議的問題,這就是拜占庭將軍問題。
下圖列出了raft演算法和pbft演算法在適用環境,通信復雜度,最大容錯節點數和流程上的對比。
關於兩個演算法的適用環境和最大容錯節點數,前文已經做過闡述,這里不再細說。而對於演算法通信復雜度,為什麼raft是o(n),而pbft是o(n^2)呢?這里主要考慮演算法的共識過程。
對於raft演算法,核心共識過程是日誌復制這個過程,這個過程分兩個階段,一個是日誌記錄,一個是提交數據。兩個過程都只需要領導者發送消息給跟隨者節點,跟隨者節點返回消息給領導者節點即可完成,跟隨者節點之間是無需溝通的。所以如果集群總節點數為 n,對於日誌記錄階段,通信次數為n-1,對於提交數據階段,通信次數也為n-1,總通信次數為2n-2,因此raft演算法復雜度為O(n)。
對於pbft演算法,核心過程有三個階段,分別是pre-prepare(預准備)階段,prepare(准備)階段和commit(提交)階段。對於pre-prepare階段,主節點廣播pre-prepare消息給其它節點即可,因此通信次數為n-1;對於prepare階段,每個節點如果同意請求後,都需要向其它節點再 廣播parepare消息,所以總的通信次數為n (n-1),即n^2-n;對於commit階段,每個節點如果達到prepared狀態後,都需要向其它節點廣播commit消息,所以總的通信次數也為n (n-1),即n 2-n。所以總通信次數為(n-1)+(n 2-n)+(n 2-n),即2n 2-n-1,因此pbft演算法復雜度為O(n^2)。
流程的對比上,對於leader選舉這塊,raft演算法本質是誰快誰當選,而pbft演算法是按編號依次輪流做主節點。對於共識過程和重選leader機制這塊,為了更形象的描述這兩個演算法,接下來會把raft和pbft的共識過程比喻成一個團隊是如何執行命令的過程,從這個角度去理解raft演算法和pbft的區別。
一個團隊一定會有一個老大和普通成員。對於raft演算法,共識過程就是:只要老大還沒掛,老大說什麼,我們(團隊普通成員)就做什麼,堅決執行。那什麼時候重新老大呢?只有當老大掛了才重選老大,不然生是老大的人,死是老大的鬼。
對於pbft演算法,共識過程就是:老大向我發送命令時,當我認為老大的命令是有問題時,我會拒絕執行。就算我認為老大的命令是對的,我還會問下團隊的其它成員老大的命令是否是對的,只有大多數人(2f+1)都認為老大的命令是對的時候,我才會去執行命令。那什麼時候重選老大呢?老大掛了當然要重選,如果大多數人都認為老大不稱職或者有問題時,我們也會重新選擇老大。
Ⅶ 幾種常用的演算法簡介
1、窮舉法窮舉法是最基本的演算法設計策略,其思想是列舉出問題所有的可能解,逐一進行判別,找出滿足條件的解。
窮舉法的運用關鍵在於解決兩個問題:
在運用窮舉法時,容易出現的問題是可能解過多,導致演算法效率很低,這就需要對列舉可能解的方法進行優化。
以題1041--純素數問題為例,從1000到9999都可以看作是可能解,可以通過對所有這些可能解逐一進行判別,找出其中的純素數,但只要稍作分析,就會發現其實可以大幅度地降低可能解的范圍。根據題意易知,個位只可能是3、5、7,再根據題意可知,可以在3、5、7的基礎上,先找出所有的二位純素數,再在二位純素數基礎上找出三位純素數,最後在三位純素數的基礎上找出所有的四位純素數。
2、分治法分治法也是應用非常廣泛的一種演算法設計策略,其思想是將問題分解為若乾子問題,從而可以遞歸地求解各子問題,再綜合出問題的解。
分治法的運用關鍵在於解決三個問題:
我們熟知的如漢諾塔問題、折半查找演算法、快速排序演算法等都是分治法運用的典型案例。
以題1045--Square
Coins為例,先對題意進行分析,可設一個函數f(m,
n)等於用面值不超過n2的貨幣構成總值為m的方案數,則容易推導出:
f(m,
n)
=
f(m-0*n*n,
n-1)+f(m-1*n*n,
n-1)+f(m-2*n*n,
n-1)+...+f(m-k*n*n,
n-1)
這里的k是幣值為n2的貨幣最多可以用多少枚,即k=m/(n*n)。
也很容易分析出,f(m,
1)
=
f(1,
n)
=
1
對於這樣的題目,一旦分析出了遞推公式,程序就非常好寫了。所以在動手開始寫程序之前,分析工作做得越徹底,邏輯描述越准確、簡潔,寫起程序來就會越容易。
3、動態規劃法
動態規劃法多用來計算最優問題,動態規劃法與分治法的基本思想是一致的,但處理的手法不同。動態規劃法在運用時,要先對問題的分治規律進行分析,找出終結子問題,以及子問題向父問題歸納的規則,而演算法則直接從終結子問題開始求解,逐層向上歸納,直到歸納出原問題的解。
動態規劃法多用於在分治過程中,子問題可能重復出現的情況,在這種情況下,如果按照常規的分治法,自上向下分治求解,則重復出現的子問題就會被重復地求解,從而增大了冗餘計算量,降低了求解效率。而採用動態規劃法,自底向上求解,每個子問題只計算一次,就可以避免這種重復的求解了。
動態規劃法還有另外一種實現形式,即備忘錄法。備忘錄的基本思想是設立一個稱為備忘錄的容器,記錄已經求得解的子問題及其解。仍然採用與分治法相同的自上向下分治求解的策略,只是對每一個分解出的子問題,先在備忘錄中查找該子問題,如果備忘錄中已經存在該子問題,則不須再求解,可以從備忘錄中直接得到解,否則,對子問題遞歸求解,且每求得一個子問題的解,都將子問題及解存入備忘錄中。
例如,在題1045--Square
Coins中,可以採用分治法求解,也可以採用動態規劃法求解,即從f(m,
1)和f(1,
n)出發,逐層向上計算,直到求得f(m,
n)。
在競賽中,動態規劃和備忘錄的思想還可以有另一種用法。有些題目中的可能問題數是有限的,而在一次運行中可能需要計算多個測試用例,可以採用備忘錄的方法,預先將所有的問題的解記錄下來,然後輸入一個測試用例,就查備忘錄,直接找到答案輸出。這在各問題之間存在父子關系的情況下,會更有效。例如,在題1045--Square
Coins中,題目中已經指出了最大的目標幣值不超過300,也就是說問題數只有300個,而且各問題的計算中存在重疊的子問題,可以採用動態規劃法,將所有問題的解先全部計算出來,再依次輸入測試用例數據,並直接輸出答案。
4、回溯法回溯法是基於問題狀態樹搜索的求解法,其可適用范圍很廣。從某種角度上說,可以把回溯法看作是優化了的窮舉法。回溯法的基本思想是逐步構造問題的可能解,一邊構造,一邊用約束條件進行判別,一旦發現已經不可能構造出滿足條件的解了,則退回上一步構造過程,重新進行構造。這個退回的過程,就稱之為回溯。
回溯法在運用時,要解決的關鍵問題在於:
回溯法的經典案例也很多,例如全排列問題、N後問題等。
5、貪心法貪心法也是求解最優問題的常用演算法策略,利用貪心法策略所設計的演算法,通常效率較高,演算法簡單。貪心法的基本思想是對問題做出目前看來最好的選擇,即貪心選擇,並使問題轉化為規模更小的子問題。如此迭代,直到子問題可以直接求解。
基於貪心法的經典演算法例如:哈夫曼演算法、最小生成樹演算法、最短路徑演算法等。
Ⅷ 一維實序列的快速傅里葉變換(FFT)
通過前面的分析,我們認識到傅里葉變換本身是復數運算,地球物理獲取的數據大多數是實數,對於實數的變換原則上可直接套用復序列的FFT演算法,但那樣是把實數序列當作虛部為零的復數對待,顯然需要存儲虛部的零並進行無功的運算,既浪費了一倍的計算內存,又降低了約一半的運算速度。
為了不浪費不可不設的虛部內存和必然出現的復數運算,可否將一個實序列分為兩個子實序列,分別作為實部與虛部構成一個復數序列,然後用復序列的FFT演算法求其頻譜,對合成的復序列頻譜進行分離和加工得到原實序列的頻譜呢?答案是肯定的,實現這一過程思路就是實序列FFT演算法的基本思想。
1.實序列的傅里葉變換性質
對於一個N個樣本的實序列x(k),其頻譜為X(j),用Xr(j)和Xi(j)表示X(j)的實部和虛部, 表示X(j)的共軛,則
證明:已知 則
地球物理數據處理基礎
上式兩端取共軛,並注意到x(k)是實序列,則
地球物理數據處理基礎
這就是實序列的傅里葉變換具有復共軛性。
其同樣具有周期性,即
地球物理數據處理基礎
2.一維實序列的FFT演算法
(1)同時計算兩個實序列的FFT演算法
已知兩個實序列h(k),g(k)(k=0,1,…,N-1),例如重磁異常平面數據中的兩條剖面,或地震勘探中的兩道地震記錄,可以人為地構成一個復序列:
地球物理數據處理基礎
設h(k)的頻譜為H(j)=Hr(j)+iHi(j)
g(k)的頻譜為G(j)=Gr(j)+iGi(j)
y(k)的頻譜為Y(j)=Yr(j)+i Yi(j)
利用上節的復序列FFT演算法,求得Y(j),即Yr(j)和Yi(j)已知,來尋找Hr(j),Hi(j),Gr(j),Gi(j)與Yr(j),Yi(j)之間的關系。
對式(8-22)作傅里葉變換:
地球物理數據處理基礎
由於H(j),G(j)本身是復序列,所以不能僅從上式分離出H(j)和G(j)。應用Y(j)的周期性,容易得到
Y(N-j)=H(-j)+iG(-j)
上式取共軛:
地球物理數據處理基礎
由於h(k),g(k)為實序列,對上式右端應用復共軛定理,得
地球物理數據處理基礎
對式(8-23)展開,得
地球物理數據處理基礎
對式(8-24)展開,並應用共軛關系,得
地球物理數據處理基礎
把式(8-25)和式(8-26)與Y(j)=Yr(j)+iYi(j)進行對比,有
地球物理數據處理基礎
整理得
地球物理數據處理基礎
因此,對於兩個實序列,通過構造一個復序列,應用復序列的FFT演算法和式(8-28)的分離加工,即可得到兩個實序列的頻譜。
(2)計算2 N個數據點的實序列FFT演算法
設有2N點的實序列u(k)(k=0,1,…,2N-1),首先按k的偶、奇分成兩個子實序列,並構成復序列,即
地球物理數據處理基礎
通過調用復序列FFT演算法,求得y(k)的頻譜為Y(j)。另記h(k),g(k)的頻譜為H(j)和G(j)。
利用前面式(8-23)和式(8-24),容易求得
地球物理數據處理基礎
下面分析用H(j),G(j)形成u(k)頻譜的問題。記u(k)(k=0,1,…,2 N-1)的頻譜為V(j),分析V(j),H(j),G(j)之間的關系,根據定義
地球物理數據處理基礎
利用式(8-31)和式(8-34)可換算出u(k)的前N個頻譜V(j)(j=0,1,…,N-1),還要設法求u(k)的後N個頻譜V(N+j)(j=0,1,…,N-1)。利用實序列其頻譜的復共軛和周期性:
(1)H(N)=H(0),G(N)=G(0),WN1=-1,得
地球物理數據處理基礎
(2)由於u(k)(k=0,1,…,2N-1)是實序列,同樣利用實序列其頻譜的復共軛和周期性,用已求出的前N個頻譜V(j)表示出後面的N-1個頻譜V(N+j):
地球物理數據處理基礎
由於0<2N-j<N,所以可從V(j)(j=0,1,…,N-1)中選出V(2N-j)(j=N+1,N+2,…,2 N-1),並直接取其共軛 即可得到V(N+1)~V(2 N-1),從而完成整個實序列頻譜的計算。
總結以上敘述,一維實序列u(k)(k=0,1,…,2N-1)的FFT計算編程步驟如下:
(1)按偶、奇拆分實序列u(k),並構造復序列:
地球物理數據處理基礎
(2)調用復序列的FFT計算y(k)的頻譜Y(j)(j=0,1,…,N-1);
(3)用下式計算形成h(k),g(k)的頻譜H(j)和G(j);
地球物理數據處理基礎
(4)用下式換算實序列u(k)的頻譜V(j)(j=0,1,…,2 N-1):
地球物理數據處理基礎
[例3]求實序列樣本u(k)={1,2,1,1,3,2,1,2}(k=0,1,…,7)的頻譜。
解:按偶、奇拆分實序列u(k),按式(8-37)構造復序列c(j)(j=0,1,2,3),即
c(0)=1+2i; c(1)=1+i; c(2)=3+2i; c(3)=1+2i。
(1)調用復序列FFT求c(j)(j=0,1,2,3)的頻譜Z(k)(k=0,1,2,3),得
Z(0)=6+7i; Z(1)=-3; Z(2)=2+i; Z(3)=-1。
地球物理數據處理基礎
(3)運用公式(8-38)計算H(j),G(j):
地球物理數據處理基礎
(4)根據式(8-39)求出u(k)(k=0,1,…,7)的8個頻譜V(j)(j=0,1,…,7):
地球物理數據處理基礎
地球物理數據處理基礎
由上例可見,完成全部2 N個實序列頻譜的計算只需做N次FFT計算,相比直接用復序列的FFT演算法節省了約一半的計算量。
Ⅸ 風靡全球的十大演算法
作者 | George Dvorsky
編譯 | 深度學習這件小事
1 排序演算法
所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量數據的處理方面。一個優秀的演算法可以節省大量的資源。
穩定的
冒泡排序(bubble sort) — O(n^2) 雞尾酒排序(Cocktail sort,雙向的冒泡排序) — O(n^2) 插入排序(insertion sort)— O(n^2) 桶排序(bucket sort)— O(n); 需要 O(k) 額外空間 計數排序(counting sort) — O(n+k); 需要 O(n+k) 額外空間 合並排序(merge sort)— O(nlog n);需要 O(n) 額外空間 原地合並排序— O(n^2) 二叉排序樹排序 (Binary tree sort) — O(nlog n)期望時間; O(n^2)最壞時間;需要 O(n) 額外空間 鴿巢排序(Pigeonhole sort)— O(n+k); 需要 O(k) 額外空間 基數排序(radix sort)— O(n·k); 需要 O(n) 額外空間 Gnome 排序— O(n^2) 圖書館排序— O(nlog n) withhigh probability,需要(1+ε)n額外空間不穩定的
選擇排序(selection sort)— O(n^2) 希爾排序(shell sort)— O(nlog n) 如果使用最佳的現在版本 組合排序— O(nlog n) 堆排序(heapsort)— O(nlog n) 平滑排序— O(nlog n) 快速排序(quicksort)— O(nlog n) 期望時間,O(n^2) 最壞情況;對於大的、亂數列表一般相信是最快的已知排序 Introsort—O(nlog n) Patience sorting— O(nlog n+k) 最壞情況時間,需要額外的 O(n+ k) 空間,也需要找到最長的遞增子串列(longest increasing subsequence)不實用的
Bogo排序— O(n× n!) 期望時間,無窮的最壞情況。 Stupid sort— O(n^3); 遞歸版本需要 O(n^2)額外存儲器 珠排序(Bead sort) — O(n) or O(√n),但需要特別的硬體 Pancake sorting— O(n),但需要特別的硬體 stooge sort——O(n^2.7)很漂亮但是很耗時2 傅立葉變換與快速傅立葉變換
傅立葉是一位法國數學家和物理學家,原名是JeanBaptiste Joseph Fourier(1768-1830), Fourier於1807年在法國科學學會上發表了一篇論文,論文里描述運用正弦曲線來描述溫度分布,論文里有個在當時具有爭議性的決斷:任何連續周期信號都可以由一組適當的正弦曲線組合而成。當時審查這個論文拉格朗日堅決反對此論文的發表,而後在近50年的時間里,拉格朗日堅持認為傅立葉的方法無法表示帶有稜角的信號,如在方波中出現非連續變化斜率。直到拉格朗日死後15年這個論文才被發表出來。誰是對的呢?拉格朗日是對的:正弦曲線無法組合成一個帶有稜角的信號。但是,我們可以用正弦曲線來非常逼近地表示它,逼近到兩種表示方法不存在能量差別,基於此,傅立葉是對的。為什麼我們要用正弦曲線來代替原來的曲線呢?如我們也還可以用方波或三角波來代替呀,分解信號的方法是無窮多的,但分解信號的目的是為了更加簡單地處理原來的信號。用正餘弦來表示原信號會更加簡單,因為正餘弦擁有原信號所不具有的性質:正弦曲線保真度。一個正餘弦曲線信號輸入後,輸出的仍是正餘弦曲線,只有幅度和相位可能發生變化,但是頻率和波的形狀仍是一樣的。且只有正餘弦曲線才擁有這樣的性質,正因如此我們才不用方波或三角波來表示。
3 Dijkstra 演算法
Dijkstra演算法是典型的演算法。Dijkstra演算法是很有代表性的演算法。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表的方式,這里均採用永久和臨時標號的方式。注意該演算法要求圖中不存在負權邊。
4 RSA演算法變換
RSA是目前最有影響力的公鑰加密演算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標准。今天只有短的RSA鑰匙才可能被強力方式解破。到2008年為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。但在分布式計算和量子計算機理論日趨成熟的今天,RSA加密安全性受到了挑戰。
5 安全哈希演算法
一種對輸入信息(例如消息)進行摘要的演算法。摘要過程能夠完成下列特點:不同的輸入信息絕對不會具有相同的指紋:相近輸入信息經過摘要之後的輸出信息具有較大的差異,同時計算上很難生產一個與給定輸入具有相同指紋的輸入。(即不可逆)。
6 整數因式分解
這是在計算機領域被大量使用的數學演算法,沒有這個演算法,信息加密會更不安全。該演算法定義了一系列步驟,得到將一合數分解為更小因子的質數分解式。這被認為是一種FNP問題,它是NP分類問題的延伸,極其難以解決。許多加密協議(如RSA演算法)都基於這樣一個原理:對大的合數作因式分解是非常困難的。如果一個演算法能夠快速地對任意整數進行因式分解,RSA的公鑰加密體系就會失去其安全性。量子計算的誕生使我們能夠更容易地解決這類問題,同時它也打開了一個全新的領域,使得我們能夠利用量子世界中的特性來保證系統安全。
7 鏈接分析
鏈接分析,源於對Web結構中超鏈接的多維分析。當前其應用主要體現在網路信息檢索、網路計量學、數據挖掘、Web結構建模等方山。作為Google的核心技術之一,鏈接分析演算法應用已經顯現出j驚人的商業價值。
8 比例積分微分演算法
你是否曾經用過飛機、汽車、衛星服務或手機網路?你是否曾經在工廠工作或是看見過機器人?如果回答是肯定的,那麼你應該已經見識過這個演算法了。大體上,這個演算法使用一種控制迴路反饋機制,將期望輸出信號和實際輸出信號之間的錯誤最小化。無論何處,只要你需要進行信號處理,或者你需要一套電子系統,用來自動化控制機械、液壓或熱力系統,這個演算法都會有用武之地。可以這樣說,如果沒有這個演算法,現代文明將不復存在。
9 數據壓縮演算法
在現今的電子信息技術領域,正發生著一場有長遠影響的數字化革命。由於數字化的多媒體信息尤其是數字視頻、音頻信號的數據量特別龐大,如果不對其進行有效的壓縮就難以得到實際的應用。因此,數據壓縮技術已成為當今數字通信、廣播、存儲和多媒體娛樂中的一項關鍵的共性技術。
10 隨機數生成
在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中,或者在進行蒙特卡羅模擬法計算的時候等等。
Ⅹ excel同一個演算法的公式在表格里多次運用,不想在每一個表格里重復列公式,怎麼弄
1、拖動復制即可,對於公式中應用的不會根據行或者列增加怎變化的單元格可在前面加$,比如$A1、A$2、$A$3。
2、設置了函數的單元格復制,粘貼是默認的粘貼公式的,你也可以在復制後,在目標單元格點擊右鍵選擇「選擇性粘貼」,有諸多粘貼方式。