我有两项任务要做:
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.此外,我不确定数组排序是否重要,我将其排除在外。
答案 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讨论了问题的下限。