在不使用临时内存的情况下从列表中删除重复项

本文关键字:列表 删除 情况下 内存 | 更新日期: 2023-09-27 17:49:47

我想写一个函数,它接受一个整数集合,并从集合中删除重复的整数。我不能应用任何排序算法。同样,我不能复制集合。我需要节省内存,并提供一个有效的解决方案,可以处理数百万个项目,而不会明显过度使用电池。

在不使用临时内存的情况下从列表中删除重复项

如果内存非常短,最好的解决方案是不包含冗余列表中的整数放在首位。为此,您可以使用数组[0..]65536]的布尔值(你可以将8乘8打包以使它更小),哪个记录已经被使用过。

另一个解决方案是对列表进行排序,通过在正确的位置插入项,但如果它们已经在这里,则不插入它们。每个条目的插入时间是log(到目前为止唯一条目的数量),所以对于你的列表来说应该是n*log(n)的时间。

如果你不能控制源,你仍然可以使用一个布尔数组,也许更大,如果你需要,然后初始化它(设置所有为false,然后:isUsed[itemList[i]] = true;),然后你可以处理列表,这样你就有内存了,然后从数组中构建一个新的列表。因此输出将是有序的。
如果你的整数是32位,数组将是500mb大,所以可能太大了…,但是取决于整数分布(可能的数字范围很广吗??),你也许可以降低这个尺寸……

请注意,如果内存非常有限,可以使用对象池来重用对象。
(您甚至可以重用刚刚从列表中删除的对象。)