这个算法在做什么?

时间:2016-04-26 21:28:15

标签: java algorithm

我有一个伪代码:

Input: Array A with n (= length) >= 2
Output: x
x = 0;
for i = 1 to n do
  for j = i+1 to n do
    if x < |A[i] - A[j]| then
       x = |A[i] - A[j]|;
    end if
  end for
end for
return x;

我已将其转换为真实代码,以便更好地了解它的作用:

public class Test
{
    public static void main (String[] args)
    {
        int A[] = {1,2,3,4,5,6,7,8,9};
        int x = 0;

        for (int i = 1; i < A.length; i++)
        {
            for (int j = i + 1; j < A.length; j++)
            {
                if (x < Math.abs(A[i] - A[j]))
                {
                    x = Math.abs(A[i] - A[j]);
                }
            }
        }
        System.out.println(x);
    }
}

代码中的数组输出为7。 我使用了另一个数组(1到20),putput是18。 阵列1-30,输出为28。 模式似乎很清楚,算法为您提供了倒数第二个/最后一个数组值的第三个。或者我错了吗?

4 个答案:

答案 0 :(得分:5)

我认为伪代码试图找到数组中任何2个元素之间的差异。

但是,您的真实代码从1而不是0开始,因此排除了此数组中的第一个元素。

答案 1 :(得分:4)

我认为伪代码试图找到数组中两个数字之间的最大差异。它应该是数组的最小值和最大值之间的差异。

我个人认为这是一个非常差的算法,因为它在O(n ^ 2)中执行此任务。您可以在O(n)中找到数组的最小值和最大值。并取这些数字之间的差异,结果将是相同的。检查伪代码

Input: Array A with n (= length) >= 2
min=A[0];max = A[0];
for i = 1 to n do
      if min > A[i] then
         min = A[i];
      end if
      if max < A[i] then
         max = A[i]
      end if
end for
return (max-min);

答案 2 :(得分:2)

代码给出了数组中任何两个元素之间的最大差异。

有两个嵌套循环,每个循环遍历数组的每个元素。第二个循环从第一个循环元素之后的元素开始,因此每个可能的对只被考虑一次。

变量x是当前最大值,初始化为0。如果x小于当前对的差值的绝对值,那么我们有一个新的最大值并存储它。

但是,因为您直接复制了伪代码的1起始索引,所以无意中跳过了数组的第一个元素,索引为0。因此,您的Java代码在不考虑第一个元素的情况下为您提供了最大的差异。

如果您有1n之间的值数组,则跳过1(在索引0中),返回的值为{{1} },恰好是数组中倒数第三的值。如果您将数组中的值作为不同的测试用例进行了混洗,那么您会看到返回的值已更改为n - 2,因为现在将考虑n - 11(只要n本身不在第一个位置)。

在任何情况下,您都需要将第一个元素的索引设置为n,以便考虑第一个元素。然后0会产生{1,2,3,4,5,6,7,8,9}(或这些相同元素的任何其他顺序)。

答案 3 :(得分:0)

假设所有正整数,算法简而言之找到数组中最大值和最小值之间的差异。但是,除非在for循环中将i初始化为0,否则它将无法正常工作。

for (int i = 0; i < A.length; i++)