因此,有一种算法可以接收一个char数组,例如" Alice喜欢Bob"并且反转它所以我们有" Bob喜欢Alice"。以下是算法的代码:
public static void reverseWords(char[] input) {
int n = input.length;
//First, reverse the whole string.
reverse(input, 0, n - 1);
//Second, Reverses each word in the string.
int start = 0, end = 0;
while (start < n) {
while (start < end || start < n && input[start] == ' ') {
++start; // Skip spaces chars.
}
while (end < start || end < n && input[end] != ' ') {
++end; // Skip non-spaces chars.
}
reverse(input, start, end - 1);
}
}
public static void reverse(char[] array, int start, int end){
while(start<end){
char tmp = array[start];
array[start++] = array[end];
array[end--] = tmp;
}
}
public static int find(char[] array, char c, int start) {
for (int i = start; i < array.length; i++) {
if (array[i] == c) {
return i;
}
}
return -1;
}
有人可以解释这段代码在0(n)时间运行吗?功能查找的目的是什么?我没有看到被发现在任何地方。
答案 0 :(得分:1)
显然你正在学习......但你需要学习如何使术语正确。
这种反向字符串算法的运行时间是多少?
运行时间是算法运行所需的时间。显然,这取决于您运行它的硬件,编译器,您提供的输入......等等。基本上,这不是一个有意义的问题要问我们。如果你真的需要知道运行时间....你测量它。
有人可以解释这段代码在O(n)时间运行吗?
现在这个 是一个有意义的问题。您不再询问运行时间:测量或估计。您现在要询问算法的计算复杂度度量。这是关于分析代码以确定运行时间 1 如何根据问题的大小而变化;即输入。
是的,O(N)
。
弄清楚为什么(非正式地)将代码的各个部分分解成更小的块,并弄清楚每个块正在做什么,以及它要去多少次&#34;触摸&#34; (读或写)输入中的每个字符。然后累积它们以给出代数公式&#34;。
该公式f(n)
看起来像C1 * n + C2
吗?或者,您可以证明f(n)
小于某些C1 * n
,因为n
变得非常大吗?
(我很确定我可以......但我会把细节留给你!)
函数
find
的目的是什么?我没有看到find
在任何地方被召唤。
这看起来像书中的错误。
find
方法的 ostensible 目的是在数组中找到给定字符出现的位置。但正如你所说,它没有被使用。
归咎于写作/编辑/出版质量控制不佳。它发生了。
1 - 嗯......实际上并不是真正的运行时间。我们通常做的是计算一些理论上代表运行时间的东西;例如原始操作,如读写变量。这不会也不能为您提供真实时间的衡量标准。但由于复杂性分析的主要目的是在算法之间进行选择,因此这通常并不重要。如果确实如此,那么您需要求助于测量和比较运行时间。