何时是算法O(n + m)时间?

时间:2017-08-08 00:56:04

标签: algorithm time-complexity big-o asymptotic-complexity

我在黑客等级上解决this problem问题。我解决问题的算法是:

  
      
  1. 获取所有玩家分数的数组。迭代所有玩家得分并创建一个新阵列。总共有n个玩家。
      它不包含任何重复的玩家分数。让我们称之为新的   array,playerScores。
  2.   
  3. 让Alice的总水平为m。
  4.   
  5. 让Alice在第一轮比赛后得分为S。
  6.   
  7. 让Alice的初始等级R为0。
  8.   
  9. 从后端开始迭代playerScores数组,直到获得分数低于S的玩家得分。
  10.   
  11. 将R设置为在步骤5中找到的玩家的等级。
  12.   
  13. 将m减少1。
  14.   
  15. 打印R。
  16.   
  17. 现在开始在循环内的所有后续m-1级别中处理Alice的得分      
        
    1. 将S设置为Alice的下一级别分数。
    2.   
    3. 开始从排名为R-1的玩家向前端迭代playerScores数组。
    4.   
    5. 继续迭代,直到你得到一个得分低于S的球员。
    6.   
    7. 将R设置为上一步中找到的玩家的等级。
    8.   
    9. 将m减少1。
    10.   
    11. 打印R。
    12.   
    13. 如果还有更多级别要播放(例如,m> 0),请转到步骤9.1。
    14.   
  18.   

现在当我开始计算上述算法的Big O时间复杂度时,我意识到它应该是O(n)如下:

  1. 需要进行一次扫描才能获得非重复的分数。这有助于因子n。所有分数都可能是唯一的。
  2. 需要从尾部到前部进行另一次扫描,以确定每个级别后Alice的等级。这再次导致因子n。在最坏的情况下,等级数(m)可以等于玩家数量(n)。
  3. 加上上述两个因素,时间复杂度为O(n + n)= O(2n)= O(n)。虽然我的朋友声称它是O(n + m)虽然他不能解释它。如果我的O(n + n)复杂度的公式无论如何都有缺陷,那么有人能帮我理解吗?

2 个答案:

答案 0 :(得分:5)

当您不知道O(n+m)O(n+n)之间的关系时,

O(n)mn不同。可能有时候n可能会大于m而其他时间m可能会更大但是没有明确的方法可以说明。但是,如果您始终知道n>=m无论如何,您可以说O(n+m)实际上是O(n)。在这种情况下,适用相同的规则。

答案 1 :(得分:0)

我能够从有关人员处获取回复。引用Ryan Fehr:

  

对于这个问题,O(n + n)和O(n + m)基本相同,   因为它们都有相同的上限。我决定去参加   O(n + m)表示,因为它确保显而易见   我的解决方案取决于爱丽丝击败的等级数量   在这种情况下由m代表。

     

这种差异化很重要的一个例子是我们有一个   n为10的小值,m为10 ^ 5的大值。在这   对m的依赖对于复杂性非常重要   问题。这也是将其表示为O(n + m)的问题,因为   如果在这种情况下m很小而n很大,那么我们将再次看到a   用我提供的方式歪曲问题的复杂性   符号

     

然而,关于Big-O符号的好处在于它代表了   最糟糕的情况,所以O(n + n)的最坏情况与O(n + m)相同   因此它们非常相同。在这一点上它只是一个   关于如何表示依赖关系的偏好问题   m作为输入变量(如果你有这样的依赖)。

     

当然,如果你不依赖m作为输入,那么我   认为O(n + n)=> O(n)是一个更好的代表   问题然后我给了什么。