一、任務描述
有如下**段(n為正整數):
i=1;
while(i++1;
while(j++1;
while(k++printf("\n");
}}
//問printf語句共執行了幾次?這段**執行完以後i+j+k值為多少?
**
(粗略分析可知,3層迴圈時間複雜度大概在n^2——n^3之間) 設為*式
最開始著手解決,按照經驗應該去打表人工找規律
於是複製貼上上面的**到vs2013並找出規律,然而規律並看不出
printf("%d
%d\n", n1,i+j+k);//並沒什麼卵用
接著
**1.
同學告訴我書上有類似的東西,我看和題目差不多,於是開始著手修改答案的係數
** i+j+k在第一遍打表中發現他的通項顯然為3n-3 接著對比書上和題目中,大概可以發現,書上的n-2差不多就是題目的n,於是把錯誤答案的n換掉,把係數2刪掉(這裡是因為明顯不符合常理)
並由*式得到結果
else
printf("%lld
%lld\n",
(n*(n - 1)*(n - 2) / 6 - (n-1)*(n - 2) / 2), n*3-3);
if (n<=2)
else
printf("%lld
%lld\n",
(n*(n - 1)*(n - 2) / 6 - (n-1)*(n - 2) / 2), n*3-3);
怎麼說呢?這個故事告訴我們,發現任務很難的時候,明顯這樣做時間會超出限值,那麼,公式推導屬於三階等差數列一樣的東西,顯然不是數學大牛還是放棄自己推公式,抓住周邊的機會和靈感,加上以前數學競賽自己抖過的機靈,還是很不錯的。修改係數和不合理的位置,這個決策對於程式設計是很不錯的,不過鑑於通項不同的數列可能前一千項都是相同的(出自我高中數學班主任),最好還是找個數學大牛驗證一下這個東西
完結
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...