簡體   English   中英

帶有 if 語句的嵌套循環的時間復雜度

[英]Time complexity of nested loops with if statement

我在高級 C++ 上使用 class 但我很難找到鎖定在 if 語句后面的嵌套 for 循環的 Big-Θ。 不幸的是,我的教授(出於某種奇怪的原因)只是希望我們從 pre-req class 中知道這一點(即使我在不同的大學學習了不同的課程內容)並且不會花時間教我。

我不希望任何人為我解決我的作業,我真的很想學習這些概念,所以我在下面創建了自己獨特的 function。 鑒於第二個循環只運行了幾次,我只是無法理解這種類型的 function 是 Θ(n) 還是 Θ(n^2)。 任何一般性的解釋或關於我如何解決這些類型的問題的正確方向的指示將不勝感激:)

注意:假設變量 n 是任意大小的正 integer。

int count = 20;
for (int i = 0; i < n; i ++) {
    if (i == count) {
        for (int j = 0; j < count; j++) {
            // Some O(1) code
            // Maybe a print to console or something
        }
        count *= 2;
    }
}

你需要問的第一個問題是,你在數什么? 通常你可以找到一些體面的東西來計算,而不僅僅是“說明”,以獲得一個好的猜測。 一旦你有了你的大 O 值,你可以仔細檢查這個值是否正確。

int count = 20;
for (int i = 0; i < n; i ++) {

好的,這顯然會運行 O(n) 次。

    if (i == count) {

在第一次通過時,輸入 O(n/20) 次。 這可能會改變。

        for (int j = 0; j < count; j++) {

這運行 O(count) 次。

            // Some O(1) code
            // Maybe a print to console or something
        }

        count *= 2;

現在這變得有趣了。 每次計數加倍。

所以第一個內部循環在 20 個外部循環之后運行,然后執行 20 個 O(1) 工作。

計數雙打。 第二個內循環在 40 個外循環之后運行,並且完成了 40 O(1) 的工作。

計數雙打。 第三個內循環在 80 個外循環之后運行,並且完成了 80 O(1) 的工作。

計數雙打。 第四個內循環在 160 個外循環之后運行,在內循環中執行 160 O(1) 次。

現在你必須把它變成數學。 你可以猜測,然后檢查。 但假設你猜不到?

嗯,畫圖吧!

 n   |    inner steps
------+----------------
  20  |    20
  40  |    20+40 = 60
  80  |    20+40+80 = 140
 160  |    20+40+80+160 = 300
 320  |    20+40+80+160+320 = 620

把它扔到一個繪圖程序上。 圖表是什么樣的? 如果它彎曲,取對數可能會給你一個斜率,你可以從中找到多項式的指數。

請記住使用散點圖 plot。 你不在乎在 60、100 或 240 時會發生什么。 你關心峰值,它發生在 20 和每翻一番。 散點圖 plot 將您的圖形點向下放置。

還要計算外部循環步驟和與 count 的比較,以確保它們不是很大。

一旦你有了一個假設,就想辦法證明你的答案是正確的。

暫無
暫無

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

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