【发布时间】:2019-01-14 22:46:26
【问题描述】:
我对 (log n) 有点困惑。鉴于此代码
public static boolean IsPalindrome(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < (chars.length / 2); i++) {
if (chars[i] != chars[(chars.length - i - 1)])
return false;
}
return true;
}
}
我正在循环 n/2 次。因此,随着 n 长度的增加,我的时间增加了 n 时间的一半。在我看来,我认为这正是 log n 是什么?但是写这段代码的人说这仍然是O(N)。
在什么情况下循环,可以是(log n)吗?例如这段代码:
1. for (int i = 0; i < (n * .8); i++)
这是日志吗?我正在循环 n 长度的 80%。
这个呢?
2. for (int i = 1; i < n; i += (i * 1.2))
那是日志 n 吗?如果是这样,为什么。
【问题讨论】:
-
最后是一个O(log n)。 (1) 只是 O(n).
-
时间复杂度通常是关于输入的大小,这里对于一个大小为 n 的字符串需要 O(n) 操作,所以复杂度是 O(n),你说的是就像不同的增长一样,最后一个是 log(n) 因为它需要 log_1.2(n) 次左右的操作才能通过循环,这(假设循环体没有太多操作)实现了复杂性是 O(log(n))
-
你熟悉对数吗?
-
O(n/2) 与 O(n) 相同,但日志完全不同。例如,以 10 为底的日志告诉您该数字中有多少位: log(1) = 0, log(10) = 1, log(100) = 2, log(10000000000) = 10 所以你看到O(log(n)) 算法,如果你循环 100 次你可以处理一个谷歌项目 (10^100),这与划分非常不同。
-
复杂度只是简单地定义操作变化的数量与条目元素的数量相比。第一个例子是字符数和循环数之间的线性关系(图上的一条线)。在最后一个示例中,
for循环上的步长间隔每步增加 20%,这意味着随着时间的推移,步长会变大,因此步数会以指数方式减少,因此会产生对数复杂度。所以你可以有两种算法 O(n) 但一个循环 n/2 次,第二个循环 n/4 次。
标签: algorithm performance time-complexity big-o