2016-01-13 79 views
4

我已經實現了使用兩種其他算法來計算圖中最短路徑的算法:Dijkstra和Bellman-Ford。基於這些算法的時間複雜度,我可以計算出我的實現的運行時間,這很容易給出代碼。確定具有兩個參數的算法的運行時間

現在,我想通過實驗驗證我的計算。具體來說,我想繪製運行時間作爲輸入大小的函數(我遵循here所述的方法)。問題是我有兩個參數 - 邊數和頂點數。

我試圖修復一個參數並改變另一個參數,但是這種方法導致了兩個圖 - 一個用於變化數量的邊,另一個用於變化的頂點數。

這引出我的問題 - 我如何根據兩個圖確定增長的順序?一般來說,如何通過實驗確定具有多個參數的算法的運行時間複雜度?

回答

2

這是非常困難的一般。

你會實驗評估在單變量情況下的運行時間,插入遞增,當你的數據結構做了基本的(推定O(1))操作,然後拿數據爲許多不同的輸入大小計數器的常用方法,和劇情它在一個log-log情節。那就是,log T與​​。如果運行時間的形式爲n^k,則應該看到一條直線斜率爲k,或者接近此值。如果運行時間如T(n) = n^{k log n}或其他什麼,那麼你應該看到一個拋物線。如果Tn處於指數狀態,您仍然應該看到指數增長。

你只能希望得到有關最高階項的信息,當你做到這一點 - 低位條款得到過濾掉,在具有越來越少的影響,因爲n變大的感覺。

在這兩個變量的情況下,你可以嘗試做一個類似的方法 - 本質上,採取3維數據,做一個log-log-log情節,並嘗試適應飛機。

但是,如果真的只有一個主導詞在大多數政權中占主導地位,那麼這隻會真正起作用。

假設我的實際功能是T(n, m) = n^4 + n^3 * m^3 + m^4

當時m = O(1),然後T(n) = O(n^4)。 當時n = O(1),然後T(n) = O(m^4)。 當時n = m,然後T(n) = O(n^6)

在這些方案的每一箇中,沿着可能的平面的「切片」值,不同的術語之一是主導術語。

所以沒有辦法確定功能,只是從固定的m和固定的n獲得一些點。如果你這樣做了,你不會得到n = m的正確答案 - 你將無法發現像這樣的「中等」主要條款。

我建議,最好的辦法預測漸近增長,當你有很多的變量/複雜的數據結構,是用鉛筆和一張紙,並做傳統算法分析。或者可能是一種混合方法。試圖打破效率的問題,爲不同的部分 - 如果你可以分裂的問題分成幾個不同的功能和或產品,也許他們中的一些你可以在抽象的決定,以及一些你可以實驗估算。

0

我要寫我自己的解釋,但它不會比this好。

1

幸運的是,兩個輸入參數在3D散點圖中仍易於可視化(第三維是測量的運行時間),您可以檢查它是否看起來像平面(以對數對數對數標度)或者它是否是彎曲的。測量中的自然隨機變化也在這裏起作用。

在Matlab中我通常計算最小二乘解到雙變量函數是這樣的(只是串接不同的功率和的x組合和y水平,.*是一個元素之積):

x = log(parameter_x); 
y = log(parameter_y); 

% Find a least-squares fit 
p = [x.^2, x.*y, y.^2, x, y, ones(length(x),1)] \ log(time) 

然後,這可用於估算較大問題實例的運行時間,理想情況下,這些將通過實驗確認,以確定擬合模型的工作原理。

這種方法也適用於更高的層面,但得到乏味的產生,也許是實現一個更一般的方式,這只是一個變通爲我的知識的缺乏。