[英]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.