java - 如何修改我的方法以在 O(N) 或 O(N * log N) 中搜索然后删除重复项?

标签 java arrays duplicates time-complexity

我创建了一个方法来搜索重复项,然后将重复项索引存储到另一个数组中。然后我遍历我的大数组并移动所有条目而不重复。

现在,我的问题是这使用了 O(N*N) 并且我正在使用额外的内存空间,因为我正在添加额外的数组。

这怎么可能? 假设我需要了解如何在不使用其他库或 HashSet 的情况下完成此操作。

感谢任何提示。

   public void dups()
   {
       int[] index = new int[100];

       int k = 0;
       int n = 0;
       int p = 0;

       for (int i = 0; i < elements; i++)
           for (int j = i + 1; j < elements; j++)
               if(a[j].equals(a[i]))
                   index[k++] = i;

       for (int m = 0; m < elements; m++)
           if (m != index[p])
               a[n++] = (T) a[m];
           else
               p++;

       elements -= k;
   }

最佳答案

您无法在 O(n) 中找到重复项(通常)。

但是在 O(n*log n) 中是可能的。只需对数组进行排序 (O(n*log n)),然后可以在 O(n) 中扫描重复项。

另一方面,如果您可以使用哈希表(如果您不想使用任何额外的库,您可能不想这样做),您可以扫描数组并计算每个元素出现的频率在数组中。之后,您可以遍历哈希表中的每个元素,找到那些出现不止一次的元素。这将花费 O(n)预期 运行时间,但不是确定性的 O(n)

最后,为什么我写的是一般在 O(n) 中找不到重复项?
可以想象几种特殊情况,其中可以在 O(n) 中找到重复项。 例如,您的数组只能包含 0 到 99 之间的数字。 在这种情况下,您可以使用另一个数组(大小为 100)来计算每个元素在数组中出现的频率。这与哈希表的工作方式相同,但它的运行时间是确定性的 O(n)

另一个可以在 O(n) 中找到重复项的示例当然是,如果数组已经排序。

关于java - 如何修改我的方法以在 O(N) 或 O(N * log N) 中搜索然后删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806186/

相关文章:

java - 在 Mac 应用程序中嵌入 Java (.jar) 文件

java - 防止当前选择的选择通知 JComboBox 中的监听器

javascript - React-Router - 显示特定 ID 的详细信息

java - 删除 ArrayList 中的重复数组?

python - 如何从 n 元组中每个元素相同的列表中删除 n 元组?

c++ - 如何通过全名从双向链表中删除重复项

java - 为什么动画不会将按钮的文本更改为下一次单击?

java - 控制台类java

java - 迭代所有不为空的槽,二维数组?

c - 函数参数指针数组 (C)