簡體   English   中英

如何計算算法的精確復雜度?

[英]How to compute exact complexity of an algorithm?

如果不采用漸近符號,計算獲得算法時間復雜度的唯一方法是乏味的步驟嗎? 如果沒有每行代碼的步數,我們可以得到任何程序的大O表示嗎?

細節:試圖找出幾種數值分析算法的復雜性,以確定哪種算法最適合解決特定問題。 例如 - 從用於求解方程的Regula-Falsi或Newton-Rhapson方法中,意圖是評估每個方法的確切復雜性,然后決定(設置'n'或其他任何參數的值)哪個方法不那么復雜。

唯一的方法 - 不是“簡單”或艱難的方式,而是唯一合理的方法 - 找到復雜算法的確切復雜性就是對其進行分析。 算法的現代實現具有與數字庫以及CPU及其浮點單元的復雜交互。 例如,高速緩存內存訪問比高速緩存內存訪問快得多,最重要的是可能有多個級別的高速緩存。 計數步驟實際上更適合漸近的復雜性,你說這對於你的目的是不夠的。

但是,如果你確實想要自動計算步數,那么也有辦法做到這一點。 您可以在每行代碼中添加一個計數器增量命令(如“C中的”bloof ++;“),然后在結尾處顯示該值。

您還應該了解更精細的時間復雜度表達式f(n)*(1 + o(1)),這對分析計算也很有用。 例如,n ^ 2 + 2 * n + 7簡化為n ^ 2 *(1 + o(1))。 如果恆定因子是通常的漸近符號O(f(n))困擾你的話,這種改進是一種跟蹤它並仍然拋出可忽略的術語的方法。

“簡單方法”就是模擬它。 嘗試使用大量n值和大量不同數據的算法,繪制結果,然后將圖表上的曲線與方程式匹配。

您的結果可能不是嚴格正確的,它們只有您生成良好測試數據的能力有效,但在大多數情況下,這將起作用。

例如 - 從用於求解方程的Regula-Falsi或Newton-Rhapson方法中,意圖是評估每個方法的確切復雜性,然后決定(設置'n'或其他任何參數的值)哪個方法不那么復雜。

對於非線性求解器,我認為不可能回答這個問題。 您可以在每次迭代時進行一定數量的計算,但是您通常不會知道每個求解器收斂需要多少次迭代。 還有其他一些復雜問題,例如需要Jacobian for Newton's,這可能會使計算復雜性變得更加困難。

總而言之,最有效的非線性求解器始終取決於您正在解決的問題。 如果您解決的各種問題非常有限,那么使用不同的求解器進行一系列實驗並測量迭代次數和CPU時間可能會為您提供更多有用的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM