簡體   English   中英

以下程序的時間復雜度是多少? O(log n)是否正確?

[英]What is the time complexity of the following program? Is O(log n) correct?

查找數組中所有偶數之和。 一個求和的遞歸程序。 該程序的時間復雜度如何?我該如何分析?

def sumEven(arr):
    if len(arr) == 0:
        return 0
    if len(arr) == 1:
        if arr[0]%2 == 0:
            return arr[0]
        else:
            return 0
    else:
        mp = len(arr)//2
        return sumEven(arr[0:mp]) + sumEven(arr[mp:])

它仍然是O(n) (如果要更精確,則為n/2 )。 您需要在每個步驟中將工作分成兩半,但是在上鏈時必須重新組合。 您必須先執行#even個值-最少要進行1個加法運算,才能添加所有偶數值。 這恰好提高了任何給定加法運算符具有大致相等大小的操作數的幾率,其中直接循環將使一個累加器操作數隨着源操作數保持相同大小而持續增長。

忽略均勻性元素,可以考慮以這種方式將數組中的所有數字相加。 如果有八個元素,則將偶數元素添加到奇數(四個操作,保留四個元素),然后將偶數結果添加到奇數結果(兩個操作,保留兩個元素),然后將其余兩個值相加(一項操作,留下答案)。 您執行了4 + 2 + 1 == 7操作以添加8個值。 您只需使用以下方法即可完成相同的操作:

 elems = [1,2,3,4,5,6,7,8]

 accumulator = elems[0]
 # Loop runs seven times, for all but first element, so seven additions performed
 for operand in elems[1:]:  # Ignore the slice cost here; avoidable, but irrelevant
     accumulator += operand

暫無
暫無

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

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