编写函数RemoveDuplication()的最有效实现

时间:2015-05-30 14:14:16

标签: c++ performance memory-efficient

所以我正在学习,我有这个问题,编写函数RemoveDuplication()的最有效的实现,它删除列表中的任何重复。假设列表已排序但可能有重复。因此,如果列表最初为< 2,2,5,6,6,9,9>,则您的函数应使其为< 2,5,6,9&gt ;.

我想要删除重复的代码就在这里,我想知道,如果有更有效的方法来删除列表中的重复

template <class T>
void DLList<T>:: RemoveDuplication()
{
    for(DLLNode<T>*ptr = head; ptr!=NULL; ptr=ptr->next)
        while (ptr->val == ptr->next->val)
        {
            ptr->next->next->prev = ptr;
            ptr->next = ptr->next->next;
        }
}

2 个答案:

答案 0 :(得分:1)

看起来您的代码将在O(n)中运行,这对算法很有用。它可能不会更有效率,因为您必须访问每个项目才能将其删除。

如果您不想删除重复的对象,但想要返回包含非重复对象的新列表,则可以通过将其设置为O(m)来使其更快一些m是唯一数字的数量,小于或等于n。但我想不出任何办法来做到这一点。

重新开始,可能会稍快一点,但这很难,而且改善可以忽略不计。

PS。当你把它从列表中删除时别忘了删除东西;)

答案 1 :(得分:0)

我认为O(n)没问题。 然而,最重要的是你的程序会崩溃: - )

for(DLLNode<T>*ptr = head; ptr!=NULL; ptr=ptr->next)
    while (ptr->val == ptr->next->val)

代码正在引用ptr->next而不检查它是!= NULL。 因此,算法到达列表的最后一个元素时应该崩溃。

现在给你一个优化问题:如何在没有测试ptr和ptr->的情况下使程序正确?接下来每次迭代?