close

標題:

c語言 求所有解和複雜度

發問:

170*v3 + 217*v4 + 264*v5 + 311*v6 + 358*v7 +405*v8 +452*v9 + 499*v10 + 546*v11 + 593*v12 = 15608求v3~v12的所有解和複雜度(總共的計算次數)用巢狀for迴圈寫的似乎是計算量過大 執行後等了20分鐘都沒跑出甚麼請高手幫忙看一下#include #include int main(int argc, char *argv[]){ int a=15608; int... 顯示更多 170*v3 + 217*v4 + 264*v5 + 311*v6 + 358*v7 +405*v8 +452*v9 + 499*v10 + 546*v11 + 593*v12 = 15608 求v3~v12的所有解和複雜度(總共的計算次數) 用巢狀for迴圈寫的 似乎是計算量過大 執行後等了20分鐘都沒跑出甚麼 請高手幫忙看一下 #include #include int main(int argc, char *argv[]){ int a=15608; int v3,v4,v5,v6,v7,v8,v9,v10,v11,v12; int count=0; int num=0,um=0; for(v3=0 ; v3
最佳解答:

 

此文章來自奇摩知識+如有不便請留言告知

這程式的時間複雜度不難求,就 53 * 53 * 53 * 51 * 43 * 38 * 34 * 31 * 28 * 26 = 9519668542072416 = O(1) 啥?O(1) 不是最快的嗎?怎麼這麼久? Big-O 不管常數! 所以,最高項的系數都被歸成 1! 當 Hidden Constant 不小時,就會很驚人! 你的 HC 高達 9千5百兆!怎快? 或者,你其實有數據,這 53, 53, ... 26 只是目前寫成這樣! 那,這程式是 O(n^10)! 會快嗎? 根據估計,這程式在我的機器上跑,要 251天 15小時 19分 10秒! 你要等? 2011-05-09 07:03:11 補充: 因為你的 vx 都是 >= 0 的數,有個辦法可以讓它快一點! 宣告一組 int a3, a4, a5, ... a11; 在每個 for 裡加上 a3 = 170 * v3 if (a #include int main(void) { int v3, v4, v5, v6, v7, v8, v9, v10, v11, v12; int a3, a4, a5, a6, a7, a8, a9, a10, a11; int count = 0, num = 0, um = 0, a = 15608; for (v3=0; v3
其他解答:

我有個疑問... 我用 gcc 在 -O1 以上, 他就自動會做 Jacob 的程式碼裡面的事情 (用暫存變數來儲存運算結果, 這應該是 CSE 範疇). 所以我在原 po 的程式也加上了類似 if (v3 * 170 = 14 2*v5+3*v6+4*v7+5*v8+6*v9+7*v10+8*v11+9*v12 = 14)*-1 就-v5-2*v6-3*v7-4*v8-5*v9-6*v10-7*v11-8*v12 27/2=13.5 =13 027/3=9 027/4=6 027/5=5 027/6=4 027/7=3 , 027/8=3 ,027/9=3 ,0= 0 v4 = 0?這樣和其他變數的值域比較一致? ====== 假定 v4 >= 0,那麼 2*v5+3*v6+4*v7+5*v8+6*v9+7*v10+8*v11+9*v12 = -27 但這樣推演下去, v5+v6+v7+v8+v9+v10+v11+v12 >= -41 顯然又有點矛盾? 2011-05-11 12:11:38 補充: 綜合林林總總的意見, 你這個問題是否該界定各個變數的值域,才不會空忙一場? 2011-05-11 13:01:21 補充: 若 v3~v12皆為正整數,那麼依所列出的初始式: v3 = -14+(v5+2*v6+3*v7+4*v8+5*v9+6*v10+7*v11+8*v12) ----(1) v4 = 27+(2*v5+3*v6+4*v7+5*v8+6*v9+7*v10+8*v11+9*v12) ----(2) 應界定 v4 >= 27 建議你重新檢視你在推演的過程中是否有 BUG? 2011-05-11 17:06:25 補充: 以意見039的程式數據為本, 程式修改後的執行結果如下: total: 114106 match: 1498 unmatch: 112608 這樣是否正確?是否有降低複雜度? 2011-05-11 18:18:27 補充: v4 = 27+(2*v5+3*v6+4*v7+5*v8+6*v9+7*v10+8*v11+9*v12) 因 v3~v12皆 >=0, 故 v4必>=27 但你程式運算結果 match的數據中,v4絕大多數未>=27。 因此,程式邏輯與數學式明顯無法密合,應重新檢討程式邏輯。 ====== 此外,意見014提及: 4個鐘頭後終於跑完..... 複雜度2106785854 答案也是27318619 複雜度的數據實際已超過 UINT的極限,已失真不可用。 有必要把程式裡的計數變數改用 long long 才行。 2011-05-11 19:08:10 補充: b - (2*v5 + 3*v6 + 4*v7 + 5*v8 + 6*v9 + 7*v10 + 8*v11 + 9*v12) b=27 若是這樣,便與你程式的邏輯相符了。 ====== 我剛以 a=92, b=144 去跑, 結果是: total: 2225869700 match: 27318619 unmatch: 2198551081 spend 1780.156 seconds 程式計數是用unsigned long long ,因此,數據是可信的。 2011-05-11 19:25:14 補充: v3 = a + (1*v5 + 2*v6 + 3*v7 + 4*v8 + 5*v9 + 6*v10 + 7*v11 + 8*v12) >= 0 v4 = b - (2*v5 + 3*v6 + 4*v7 + 5*v8 + 6*v9 + 7*v10 + 8*v11 + 9*v12) >= 0 令 k1 = v5 + v6 + v7 + v8 + v9 + v10 + v11 + v12) 令 k2 = v5 + 2*v6 + 3*v7 + 4*v8 + 5*v9 + 6*v10 + 7*v11 + 8*v12 2011-05-11 19:25:34 補充: 則 a + k2 >= 0 ---(1) b - (k2 + k1) >= 0 ---(2) (1)+(2)得 a+b >= k1 ---(3) (3)在程式演算中,對縮短複雜度占舉足輕重的角色。 2011-05-11 19:25:50 補充: 你的程式中, a 明明是負數,卻改用正數, 雖在配套上並無不可,但與數學式違逆,略失人性的順勢。 我將它改成直接套用原值,並以稍前導出的(3)佐助, a=-92, b=144 total: 2225869700 match: 27318619 unmatch: 2198551081 spend 1780.156 seconds 2011-05-11 19:38:23 補充: 若非你給的數學式有誤, 早在意見023 已指引出縮減複雜度的方向, 而現在,也以實作證明這個方向是正確的。6524A8F25B63629D

arrow
arrow
    創作者介紹
    創作者 fksnlix 的頭像
    fksnlix

    fksnlix的部落格

    fksnlix 發表在 痞客邦 留言(0) 人氣()