【问题标题】:Summing an Array and Big O Notation对数组和大 O 表示法求和
【发布时间】:2009-05-24 16:44:08
【问题描述】:

如何找到计算数组总和值的算法??

是这样的吗?

Algorithm Array Sum
Input: nonnegative integer N, and array A[1],A[2],...,A[N]
Output: sum of the N integers in array A
Algorith Body:
j:=1
sum:=0
while j<N
      sum := sum + a[J]
      j:=j+1
  end while
end Algorithm Array Sum

以及如何使用 O-Notation 将其与算法的运行时间联系起来

这是去年的考试,我需要为我的考试做修改。

问题
给出了一个包含 n 个整数值的数组 A[]
1.给出计算数组中所有值之和的算法
2.为算法的运行时间找到最简单和最好的O-notation。

【问题讨论】:

    标签: algorithm sum big-o


    【解决方案1】:

    问题是找到所有值的总和,因此遍历数组中的每个元素并将每个元素添加到临时总和值。

    temp_sum = 0
    for i in 1 ...array.length
        temp_sum = temp_sum + array[i]
    

    由于您需要遍历数组中的所有元素,因此此程序与元素数量呈线性关系。如果您有 10 个元素,则迭代 10 个元素,如果您有 100 万个元素,您别无选择,只能遍历所有百万个元素并添加每个元素。因此,时间复杂度为 Θ(n)

    如果您要查找所有元素的总和,并且您对数据一无所知,那么您需要至少查看所有元素一次。因此 n 是下限。您也不必多次查看该元素。 n 也是上界。因此复杂度为 Θ(n)。

    但是,如果您对元素有所了解..假设您获得了 n 个自然数的序列,您可以使用 n(n+1)/2 在常数时间内完成。如果你得到的数据是随机的,那么你别无选择,只能做上面的线性时间算法。

    【讨论】:

    • +1 用于实际读取输入为 1 而不是基于 0 的问题。
    • n 个自然数的序列...with n(n+1)/2 我相信您的意思是说“n 个连续自然数的序列”(尽管其他模式也可以在恒定时间内完成)
    【解决方案2】:

    由于 n 是数组的大小,您所要做的就是从开始迭代到结束大 O 表示法是 O[n]

    integer N= Size_array;
    array a[N]
    j=1 
    sum=0
    while j<=N 
     sum += a[j]  
     j++
    end while
    

    【讨论】:

    • -1 : 输入:非负整数 N,数组 A[1],A[2],...,A[N] A[ 0 ] 未定义。
    • 显然,我不明白非负数会如何解释数组不是从索引 0 开始的?
    【解决方案3】:

    我认为您的意思是“当 j

    我认为运行时间应该是 O(n),因为你只有一个循环。

    【讨论】:

    • 你必须从
    • 不,问题是它的索引是从 1 到 N。不是C。输入:非负整数N,数组A[1],A[2],...,A[N]
    【解决方案4】:

    要计算此算法的 O,您需要计算每行代码执行的次数。稍后您将只计算基本操作,但会从全部计算开始。

    那么 j := 1 行会运行多少次? sum := 0 会运行多少次? while 循环的条件将执行多少次? while 循环内的语句?

    总结这些。你会注意到你得到的值类似于 1 + 1 + n + n + n = 2 + 3n。因此您可以得出结论,它是 n 上的线性函数。

    【讨论】: