我正在观看有关Hackerrank的有关Big O符号的视频,在阅读职业生涯杯的材料时,我总是听到“丢弃常数”一词。如果我根据以下算法正确理解,请告诉我:
function whyWouldIDoThis(array){
max = NULL
for each a in array {
max = MAX(a, max)
}
print max
for each a in array {
for each b in array {
print a,b
}
}
}
已解释,由于这是两个单独的for循环,因此第一个for循环为O(n),第二个for循环为O(n ^ 2),并且由于其所有算法最终将其变为O(n ^ 2)。有道理的是,由于术语“ n”相同,因此它们被抵消了。这是按照Big O表示法“删除内容”的意思吗?
答案 0 :(得分:1)
max = NULL ----------------- c_1
for each a in array {
max = MAX(a, max) -------- c_2
}
print max ------------------ c_3
for each a in array {
for each b in array {
print a, b ------------- c_4
}
}
逐行分析代码,我们总花费时间为
c_1 + c_2 * n + c_3 + c_4 * n * n = c_4 n ^ 2 + c_2 * n + c_1 + c_3
现在我们只需要一个主导项,即c_4 n ^ 2,也不需要系数c_4。所以我们有O(n ^ 2)。
从这个意义上说,“丢弃常数”是丢弃系数。也就是说,即使您的代码可能比O(n ^ 2)快一点,也许比O(n ^ 2/2)快一点,但是就Big-Oh而言,这无关紧要;都是O(n ^ 2)。