iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0

通常我們在評估一個演算法好壞,最常下手的時間複雜度Time complexity。

簡單來說,就是整個程式需要執行多久,我們一般會用大O符號來表示。

以我們之前寫過的題目來做範例好了。

  • 堆疊的範例題目:括號匹配
import java.util.Stack

fun main(){
    var s = Stack<Char>()
    var inp = readln()
    var match = true;
    for(i in 0 .. inp.length-1){
        if(inp[i]=='('){
            s.push(inp[i])
        }
        if(inp[i]==')'){
            if(s.empty()!=true){
                s.pop()
            }
            else{
                match = false;
            }
        }
    }
    if(match){
        println("Yes")
    }
    else{
        println("NO")
    }
}

我們可以把所有的運算比如變數宣告、輸入、輸出、判斷……當成一次基本運算,所以我們來算一下總共有多少基本運算。


    1
    1
    1
     (inp.length-1) * (
        1
        1
        
        1
            1
               1
            
            
                1
            
        
    )
    1
        1
    
    
        1
    

總共是 6 + 6*(輸入長度-1) 次基本運算 ,這裡的輸入長度我們用N代替,也就是6N-6+6,大約是6N次基本運算。(因為後面會忽略低冪次跟係數,所以其實大概估算就好,不需要真的算的很清楚)

接下來我們只保留最高冪次,也忽略他的係數,所以比如說6N的結果就是N,我們記做「O(N)」。

我們就可以說這個程式碼是O(N)時間複雜度的,大家就可以很快知道大概會執行多久。(差不多8~12萬基本運算會是一秒喔,不過每個運算的時間都不一樣,所以不一定保證就是這麼剛好,但這是一個很好的估算方法。)

課堂練習

這裡有兩段程式碼,請你預估他的時間複雜度。

fun main(){
    var n = readln().toInt()
    var a = 1
    var b = 1
    for(i in 1..n){
        var temp = a + b
        a = b
        b = temp
    }
    println("$b")
}
fun main(){
    var n = readln().toInt()
    for(i in 1..n){
        for(j in 1..n){
            println("${i} * ${j} = ${i*j}")
        }
    }
}

上一篇
[Day21] [演算法]什麼是演算法?
下一篇
[Day23][演算法]貪婪
系列文
櫛風風的「完全不會寫程式,從零開始的 Kotlin 教學」30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言