尋找第二小元素

《算法導論》第三版9.1-1
把n個元素分成一對對,每一對進行一次比較得出一個較小值,這是第一輪篩選,以此類推,一共進行 lgn 輪篩選,n-1次比較。第二小的元素一定在某一輪篩選中與最小的進行比較被PK掉了,但是不能確定是哪一輪,所以要所有與最小的進行比較的元素進行再一次挑選最小。與最小的進行比較的元素個數等於篩選輪數,也就是 lgn ,那麼又要進行 lgn1 次比較,所以最終結果就是(n - 1) +( lgn -1 ),即n + lgn - 2。
具體實行起來,要構造一個二叉樹,第一輪篩選作爲底層結點,以此類推,那麼根就是最小元素。構造完數之後,再沿着有最小元素的脈絡,挑選第二小元素。

問題是,我在stack overflow上看到一段python代碼,可以在Θ(n) 內完成,代碼如下:

def second_smallest(numbers):
    m1, m2 = float('inf'), float('inf')
    for x in numbers:
        if x <= m1:
            m1, m2 = x, m1
        elif x < m2:
            m2 = x
    return m2

So,這是什麼鬼?

代碼鏈接http://stackoverflow.com/questions/26779618/python-find-second-smallest-number

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章