F#函数的最坏情形渐近时间复杂度

cod*_*lyf 2 big-o f# time-complexity asymptotic-complexity

我试图弄清楚以下函数的最坏情况渐近时间复杂度:

let rec min = function
| [k] -> k
| k::ks -> if k <= min ks then k else min ks 
Run Code Online (Sandbox Code Playgroud)

我知道它效率不高,因为在第二次模式匹配中调用min两次.但是你怎么能找到这个功能更糟糕的情况呢?

Jak*_*rtz 6

正如您所注意到的,min功能是

在第二次模式匹配中调用min两次

在最坏的情况下(列表末尾的最小值),对列表的每个元素进行2次调用,每个元素再次为列表的尾部调用两次,...

因此复杂度为O(2 ^ n).

如果您评估min ks一次并使用该值,则复杂度将为O(n).

let rec min = function
    | [k] -> k
    | k::ks -> 
        let minTail = min ks
        if k <= minTail then k else minTail
Run Code Online (Sandbox Code Playgroud)