我在黑客等级上解决this problem问题。我解决问题的算法是:
- 获取所有玩家分数的数组。迭代所有玩家得分并创建一个新阵列。总共有n个玩家。
它不包含任何重复的玩家分数。让我们称之为新的 array,playerScores。- 让Alice的总水平为m。
- 让Alice在第一轮比赛后得分为S。
- 让Alice的初始等级R为0。
- 从后端开始迭代playerScores数组,直到获得分数低于S的玩家得分。
- 将R设置为在步骤5中找到的玩家的等级。
- 将m减少1。
- 打印R。
- 现在开始在循环内的所有后续m-1级别中处理Alice的得分
醇>
- 将S设置为Alice的下一级别分数。
- 开始从排名为R-1的玩家向前端迭代playerScores数组。
- 继续迭代,直到你得到一个得分低于S的球员。
- 将R设置为上一步中找到的玩家的等级。
- 将m减少1。
- 打印R。
- 如果还有更多级别要播放(例如,m> 0),请转到步骤9.1。
现在当我开始计算上述算法的Big O时间复杂度时,我意识到它应该是O(n)如下:
加上上述两个因素,时间复杂度为O(n + n)= O(2n)= O(n)。虽然我的朋友声称它是O(n + m)虽然他不能解释它。如果我的O(n + n)复杂度的公式无论如何都有缺陷,那么有人能帮我理解吗?
答案 0 :(得分:5)
O(n+m)
和O(n+n)
之间的关系时, O(n)
与m
或n
不同。可能有时候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)是一个更好的代表 问题然后我给了什么。