簡體   English   中英

大O-O(N ^ 2)或O(N ^ 2 +1)嗎?

[英]Big O - O(N^2) or O(N^2 + 1)?

我正在閱讀這篇 Big O文章(以及其他一些參考書),試圖找出哪些變化會影響我的算法。

因此,給出以下O(N ^ 2)代碼:

bool ContainsDuplicates(String[] strings)
{
    for(int i = 0; i < strings.Length; i++)
    {
        for(int j = 0; j < strings.Length; j++)
        {
            if(i == j) // Don't compare with self
            {
                continue;
            }

            if(strings[i] == strings[j])
            {
                return true;
            }
        }
    }
    return false;
}

我進行了以下更改:

bool ContainsDuplicates(String[] strings)
{
    for(int i = 0; i < strings.Length; i++)
    {
        for(int j = 0; j < strings.Length; j++)
        {
            if(i != j) // Don't compare with self
            {                               

                   if(strings[i] == strings[j])
                   {
                      return true;
                   }
            }
        }
    }
    return false;
}

現在,兩個IF都嵌套了,並且刪除了“ continue”。 這個算法真的變成O(N ^ 2 +1)嗎? 為什么? 據我所知,之前無論如何都存在IF檢查,因此最初認為它仍然是O(N ^ 2)。

大O描述的是執行時間如何隨着所選參數變大而增加。

在您的示例中,如果我們想要精確,則公式為:

花費的時間=時間(開始)+時間(外部循環)* N +時間(連續)* N +時間(不繼續)* N ^ 2

可以改寫成

花費的時間= a + b * N + c * N ^ 2

現在,隨着N變得越來越大,很明顯,總體而言,它的形狀將像拋物線。 隨着N增長到無窮大,零階和一階項變得無關緊要。

花費的時間(大N)〜= c * N ^ 2

最后,由於我們對定性討論而不是定量討論感興趣,因此我們將算法簡單地描述為N ^ 2

O(N ^ 2)表示對於大的N值,該算法的行為近似為c * N ^ 2

它與微積分中的o(x)類似(不同之處在於small-o用於參數變為零)。

暫無
暫無

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

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