演算法高效技巧之打表

2021-08-27 14:11:40 字數 744 閱讀 2977

打表是一種典型的用空間換時間的技巧,一般指將所有可能需要用到的結果事先計算出來,這樣後面需要用到時就可以直接查表獲得。打表常見的用法有如下幾種:

1、在程式中一次性計算出所有需要用到的結果,之後的查詢直接取這些結果

這個是最常用到的用法,例如在乙個需要查詢大量fibonacci數f(n)的問題中,顯然每次從頭開始計算是非常耗時的,對q次查詢會產生o(nq)的時間複雜度;而如果進行預處理,即把所有fibonacci數預先計算並存在陣列中,那麼每次查詢就只需o(1)的時間複雜度,對q次查詢就值需要o(n+q)的時間複雜度(其中o(n)是預處理的時間)。

2、在程式b中分一次或多次計算出所有需要用到的結果,手工把結果寫在程式a的陣列中,然後在程式a中就可以直接使用這些結果

這種用法一般是當程式的一部分過程小號的時間過多,或是沒有想到好的演算法,因此在另乙個程式中使用暴力演算法算出結果,這樣就能直接在源程式中使用這些結果。例如對n皇后問題來說,如果使用的演算法不夠好,就容易超時,而可以在本地用程式計算付出對所有n來說n皇后問題的方案數,然後把算出的結果直接解除安裝陣列中,就可以根據題目輸入的n來直接輸出結果。

3、對一些感覺不會做的題目,先用暴力程式計算小範圍資料的結果,然後找規律,或許就能發現一些「蛛絲馬跡」

這種用法在資料範圍非常大時候容易用到,因為這樣的題目可能不是用直接能想到的演算法來解決的,而需要尋找一些規律才能得到結果。

**:

高效素數打表

大家所知的素數打表時間複雜度幾乎都是n2。就是這種 void init prime j 0 for i 2 i 1000002 i if prime i prime j i 在網上搜到了另一種方法,效率提高了不少。巧妙之處還在研究中,等理解差不多就仔細分析一下。下面是 大家可以發表一下自己的看法,交...

A 高效素數打表

a 高效素數打表 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 哥德 猜想大家都知道一點吧.我們現在不是想證明這個結論,而是想在程式語言內部能夠表示的數集中,任意取出乙...

高效素數打表

大家所知的素數打表時間複雜度幾乎都是n2。就是這種 void init prime j 0 for i 2 i 1000002 i if prime i prime j i 在網上搜到了另一種方法,效率提高了不少。巧妙之處還在研究中,等理解差不多就仔細分析一下。下面是 大家可以發表一下自己的看法,交...