数组 - Dupe Scanner和算法运行时

时间:2016-04-26 18:37:12

标签: java algorithm runtime

我有两项任务要做:

1。)创建一个算法,以便检测数组中是否有重复项(=相同的数字)(运行时间越好,得到的点就越多)。

2.)分析算法的运行时间。

这是我的第一个任务的代码(我必须对数组进行排序,以便算法运行得更快/可以工作。为此,我使用import而不是自己编码。):

import java.util.Arrays;

public class Dupescanner
{
    public static void main(String[] args)
    {
        int[] A = {1, 2, 3, 4, 5, 1, 2, 8, 8};
        Arrays.sort(A);
        System.out.println("Following numbers are duplicates:");
        for (int n = 1; n < A.length; n++)
        {
            if (A[n] == A[n - 1])
            {
                System.out.println(A[n]);
            }
        }
    }
}

输出:

Following numbers are duplicates:
1
2
8

这个算法好吗?我想不出任何比这个更快的东西。或者也许我错误地理解了这个任务,如果你只是说: 是的 - 有/有重复。假 - 不是......

对于运行时分析,我不确定,但我也试了一下:

int[] A = {1, 2, 3, 4, 5, 1, 2, 8, 8};

费用1

for循环成本n和if成本n也是如此。 结果将是n ^ 2 + 1.此外,我不确定数组排序是否重要,我将其排除在外。

1 个答案:

答案 0 :(得分:2)

你的算法是O(nlogn),这里的瓶颈就是排序。

你的循环以线性时间运行。

这实际上是element distinctness problem

只有在允许散列和额外空间时,通过填充哈希表(HashSet)并在迭代时将所有元素插入其中,并且如果您允许,它可以更有效地解决(在渐近复杂性方面)迭代时找到一个骗子 - 打印它。

int[] array = {1, 2, 3, 4, 5, 1, 2, 8, 8};
Set<Integer> set = new HashSet<>();
System.out.println("Following numbers are duplicates:");
for (int e : array) { 
  if (!set.add(e)) System.out.println("" + e);
}

This thread讨论了问题的下限。