如何从未排序的数组中删除重复的数字

时间:2015-08-07 17:16:04

标签: arrays algorithm hashmap big-o

我在技术访谈中得到了以下问题:

如何从未排序的数组中删除重复项?

我想到的一个选择:

  1. 使用数组中每个数字的频率创建哈希映射
  2. 浏览数组并在哈希映射中执行O(1)查找。如果频率> 0,从数组中删除数字。
  3. 有更有效的方法吗?

    另一个选择

    1. 使用快速排序或合并排序
    2. 对数组O(nlog n)进行排序
    3. 然后遍历数组并删除重复项
    4. 为什么选项1优于选项2?

      我不能使用已经完成像array_unique那样工作的任何函数。

3 个答案:

答案 0 :(得分:1)

如果哈希映射表明存在重复,而不是从数组中删除对象,为什么不为哈希映射中的每个项构建一个新数组,如果没有,则只将它添加到数组中重复?我们的想法是节省额外的步骤,即在开始时拥有2个具有相同开销的阵列。 PHP糟糕的垃圾收集,所以如果你从一个庞大的数组开始,即使你取消它的值,它仍然可能在内存中徘徊。

答案 1 :(得分:0)

对于第一种选择,时间复杂度为O(n);因为创建哈希映射O(n)并迭代数组O(n),所以总共为O(n)。

对于第二种选择,时间复杂度为O(log(n));因为排序O(log(n))并迭代O(n),所以总O(log(n))。

显然,第一种选择更好。希望这会有所帮助:)

答案 2 :(得分:0)

如果您没有限制创建另一个数据结构来跟踪状态,但必须就地改变数组并且只删除重复项而不进行排序,那么您的第一个选项的变体可能是最好的。

我建议你在迭代数组时创建一个hashmap,使用数组值作为键,并使用任何垃圾(布尔值设置为TRUE)作为值。当您遇到数组中的每个项目(即O(n))时,请检查地图。如果存在,则从数组中删除该项,如果不添加它们的键值对。无需跟踪计数,您只需跟踪遇到的情况。

许多语言都有内置的set抽象数据类型,它基本上在构造或add all操作上执行此操作。如果您可以提供单独的数据结构并删除重复项,只需使用数组的项创建一个新集,并让该数据结构删除重复项。