数据结构:列表中的唯一性

时间:2010-11-01 17:14:15

标签: java data-structures

我有2个列表,一个列表l1包含n1个元素,另一个列表l2包含n2个元素。两个列表长度不同并且包含重复元素。我想创建另一个列表,其中包含l1和l2中的唯一元素。我怎样才能有效地做到这一点以及该解决方案的性能是什么?

P.S:我想要一个不使用任何其他数据结构的解决方案。

4 个答案:

答案 0 :(得分:3)

如果您不能使用Set,我认为最好的解决方案是进行合并排序而不重复。这个问题可能有所帮助:How do I use merge sort to delete duplicates?

答案 1 :(得分:0)

创建一个新的Set并从列表l1和l2添加元素。最终的集合将是不包含重复的集合。但请确保您已正确实现了equals()和hashCode()。

以下是我的样本(不完美)。在此发布它以验证我的逻辑;-)或者看看是否有更好的方法来优化这个

Lit unique=...


if(l1.size==l2.size())
{
    //o(n)
    copyToUnique(l1, l2, unique)
}
else if(l1.size>l2.size())
{
    //o(n) + num of extra elements
    copyToUnique(l1, l2, unique)
    unique.addAll(l1.subList(l2.size(),l1.size());
}
else if(l1.size<l2.size())
{
    //o(n) + num of extra elements
    copyToUnique(l2, l1, unique)
    unique.addAll(l2.subList(l1.size(),l2.size());
}

public void copyToUnique(List l1, List l2, List unique)
{
    for(Object element:l1)
    {
        if(!l2.contains(element))
        {
            unique.add(element);
        }
    }
unique.addAll(l2);
}

答案 2 :(得分:0)

如果你只需要使用列表,并且你有可能在每个列表和列表中重复,那么你需要创建一个新的列表,l3(以保持l1和l2元素的并集)并迭代每个列表,如果对l3.contains(e)的调用返回false,则插入每个元素e项。

正如其他人所提到的,使用Set绝对是删除列表重复项的最简单方法,可以从Set创建List以返回给调用者。

性能是线性的,并且基于l1 + l2中的元素数量。

答案 3 :(得分:0)

O(nlogn)的解决方案是对每个列表进行排序,然后一起浏览两个列表,找到重复项。您可以增加一个列表或另一个列表(或两者)的位置,具体取决于哪个列表具有当前元素的“最小”值(或者它们是否相同)。有一个合理的开销,所以一些O(n ^ 2)算法实际上可能会更快,具体取决于数据的大小/分布。