演算法優化的神奇效果

2021-07-31 23:38:07 字數 2653 閱讀 7538

增長數量級的分類

2-sum問題(熱身)

3-sum問題(快速演算法)

它是3-sum的簡化問題:即找出乙個陣列中所有的和為0的整數對的數量。一般的解決方案如下:

/**

* 2-sum問題:統計和為0的整數對的數目(平方級別)

* 時間複雜度:n²

*@param arr

*@return

*/public

static

intcount(int arr) }}

return ans;

}

接下來我們將這個平方級別的演算法,優化線性對數級別的演算法。並沒有線性級別的演算法。

我們要用到遞迴排序二分查詢來實現這個優化。

優化之後的思想:當且僅當 -arr[i] 存在於陣列中(且arr[i] 非零)時,arr[i] 存在於某個和為 0 的整數對之中。

/**

* 2-sum問題的線性對數級別的解法

* 時間複雜度:nlogn

*@param arr

*@return

*/public

static

intcountfast(int arr)

}return ans;

}

測試**:

public

static

void

main(string args)

long start = system.currenttimemillis();

count(arr);

long end = system.currenttimemillis(); //單位毫秒

system.out.println("優化之前,count:"+(end - start)); //優化之前,count:24057

long startfast = system.currenttimemillis();

countfast(arr);

long endfast = system.currenttimemillis(); //單位毫秒

system.out.println("優化之後,countfast:"+(endfast - startfast)); //優化之後,countfast:103

}

優化之前和優化之後的執行時間對比(十萬級別的資料量),非常明顯!!!

問題描述:統計和為0的元組的數目(即統計 arr[i] + arr[j] + arr[k] == 0 的數目),一般的解決方案如下:

/**

* 3-sum:統計和為0的元組的數目(立方級別)

* 時間複雜度:n³

*@param arr

*@return

*/public

static

intcount(int arr) }}

}return ans;

}

接下來我們繼續優化以上演算法。可能會存在比這個級別更加優化的演算法,即可能存在最優演算法—平方級別。

/**

* 3-sum問題的n²lgn級別的解法

* 時間複雜度:n²lgn

*@param arr

*@return

*/public

static

intcountfast(int arr) }}

return ans;

}

測試**:

public

static

void

main(string args)

long start = system.currenttimemillis();

count(arr);

long end = system.currenttimemillis();//單位毫秒

system.out.println("優化之前,count:"+(end - start)); //優化之前,count:638519

long startfast = system.currenttimemillis();

countfast(arr);

long endfast = system.currenttimemillis();//單位毫秒

system.out.println("優化之後,countfast:"+(endfast - startfast)); //優化之後,countfast:3780

}

優化之前和優化之後的執行時間對比(萬級別的資料量),還是非常明顯!!!

神奇的常數優化

話說noip不開優化,那我們來看看開優化後會發生什麼 乙個簡單的累加 include include 計時看看差別 includeusing namespace std int main 按理來說,上面的兩種方法差不多 在devc 5.7.1中,xp系統 學校機房的那種 不開任何優化 大約前一種是8...

神奇的常數優化

話說noip不開優化,那我們來看看開優化後會發生什麼 乙個簡單的累加 include include 計時看看差別 includeusing namespace std intmain 按理來說,上面的兩種方法差不多 在devc 5.7.1中,xp系統 學校機房的那種 不開任何優化 大約前一種是85...

神奇的暴雪雜湊演算法

暴雪公司的魔獸 星際等遊戲都一樣乙個非常大的mpq檔案,該檔案儲存了遊戲中的大部分資料,想要把這些文字找出來,簡單的辦法是從陣列頭開始,乙個個字串讀過去,比較每乙個,直到找到對應的內容。blizzard的天才和牛人們當然不會這樣做,他們用了更聰明的方法 用某種演算法,把乙個字串壓縮成乙個整數,即ha...