我在技术访谈中得到了以下问题:
如何从未排序的数组中删除重复项?
我想到的一个选择:
有更有效的方法吗?
另一个选择
为什么选项1优于选项2?
我不能使用已经完成像array_unique那样工作的任何函数。
答案 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
操作上执行此操作。如果您可以提供单独的数据结构并删除重复项,只需使用数组的项创建一个新集,并让该数据结构删除重复项。