2016-04-09 27 views
3

上週,我正在參加一個關於計算機科學的具體MOOC,以及教授。用一種低效率的方式來計算一個數的平方根(他後來展示了其他方法)。爲什麼此函數具有對數時間複雜度(計算數字的第n個根)?

下面是在C++實現的功能:

double sqrt(double num) 
{ 
    double eps = 0.001; 
    double step = 0.001; 

    double result = 0.0; 

    while (num - (result * result) > eps) 
    { 
     result += step; 
    } 

    return result; 
} 

我知道while循環將執行(平方根的num/step)次。

而且我已經決定使用matplotlib繪製從1此功能發展爲一系列數字的陰謀199(含),和這裏的結果:

result

然後,我相比它(日誌(X)/ step)的情節,並再次這裏的結果:

result

所以,我有以下問題:

  • 爲什麼它是對數?爲什麼這適用於任何數字的第n個根(使用上述方法)不僅平方根?
  • sqrt增長和log(x)之間的差距是什麼?

我知道有更高效的方法來實現相同的數字平方根結果,但是我需要有人對此進行說明。

+0

相信與否,你的'函數'sqrt'growth'正好是'f(x)= sqrt(x)/ step'圖。 – deniss

回答

3

當你說循環執行了sqrt(num)次,並且這使得它的複雜度爲√num時,你是正確的。然而,與後面的假設相反,平方根不是對數的:它僅僅是num^(1/2),這使得它在事物的宏觀方案中是多項式的。

一個明顯的標誌和視覺的幫助是,它不是一個對數圖一條直線:

enter image description here

左邊的線是一個平方根和右邊的線是基礎10對數。

顯然,差距是因爲它不是對數。

+0

我字面上需要一些睡眠。我誤認爲它是對數..謝謝你清理的東西。 – Eekan

+0

沒關係,我還需要一些睡眠:) – zneak

相關問題