Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编写函数RemoveDuplication()的最有效实现_C++_Performance_Memory Efficient - Fatal编程技术网

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

C++ 编写函数RemoveDuplication()的最有效实现,c++,performance,memory-efficient,C++,Performance,Memory Efficient,所以我正在研究这个问题,写函数RemoveDuplication()的最有效实现,它可以删除列表中的任何重复。假设列表已排序,但可能存在重复。因此,如果列表最初是
, 你的功能应该可以做到 我想到的删除重复项的代码就在这里,我想知道,是否有更有效的方法删除列表中的重复项 template <class T> void DLList<T>:: RemoveDuplication() { for(DLLNode<T>*ptr = head; ptr!=NU

所以我正在研究这个问题,写函数RemoveDuplication()的最有效实现,它可以删除列表中的任何重复。假设列表已排序,但可能存在重复。因此,如果列表最初是
, 你的功能应该可以做到

我想到的删除重复项的代码就在这里,我想知道,是否有更有效的方法删除列表中的重复项

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;
        }
}
模板
void DLList::RemoveDuplication()
{
用于(DLLNode*ptr=head;ptr!=NULL;ptr=ptr->next)
同时(ptr->val==ptr->next->val)
{
ptr->next->next->prev=ptr;
ptr->next=ptr->next->next;
}
}

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

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

总而言之,可能会稍微快一点,但这很难做到,而且改进可以忽略不计

另外,当你把东西从清单中拿出来时,别忘了把它删除;)

我认为O(n)是可以的。 然而,最重要的是您的程序将崩溃:-)

for(DLLNode*ptr=head;ptr!=NULL;ptr=ptr->next)
同时(ptr->val==ptr->next->val)
代码正在延迟
ptr->next
,但未检查它是否为
!=空
。 因此,当算法到达列表的最后一个元素时,它应该崩溃


现在给您一个优化问题:如何使程序正确无需在每次迭代时测试ptr和ptr->next?

请定义高效。此外,您的代码仅删除相邻的重复值,此时列表是否已排序?为什么不使用?@πάνταῥεῖ 是的,问题假设列表已经排序,但可能有重复,如示例iprovided@Abdarahman这是一个完全错误的代码。至于效率,除了按顺序遍历列表之外,没有什么比这更好的了。@VladfromMoscow嗯,我没有跟着你,我的代码不是按顺序遍历列表吗,我从头部开始,一直移动到尾部之后的点,我的ptr->下一个值将在达到重复值时更改?对于删除,我是否应添加另一个指针,如DLLNode*ptr2=ptr;然后在我编辑完ptr->while循环中的下一个值后删除它。我所说的删除内容是指现在你的程序有内存泄漏。从列表中删除
DLList
项,但不调用
delete item
。所以它将在内存中浮动。因此,您应该创建一个指向已删除项目的指针,然后在其上调用
delete ptr
。嗯,我想我有些理解您所说的,因此如果我按照我的建议执行,这意味着我将只删除指向该项目的指针,而不删除项目本身?是的。也就是说,我假设您确实调用了类似于
newdllist
的东西,根据经验,对于每个
new
,都必须有一个
delete
。(除了一些例外)我的想法是在我的main中创建一个列表,然后填充我在示例中提供的值,然后我想调用我创建的RemovedUpplication()函数,并且列表应该没有重复,假设是这样,这是否仅仅意味着我必须删除ptr,因为我没有使用“new”?是的,我已经注意到这个问题并修改了prt=空,进入ptr->下一步=NULL,我认为这将解决问题,因为这种方式ptr将在到达最后一次迭代之前停止,但它仍将检查最后一个元素,我不知道tbh,我仍在忙于研究atm,这是我目前想到的唯一方法,但我想看看是否有比O(n)更有效的方法我可能错过了对
ptr->next的测试=空的
很好,但是程序不会在空列表上崩溃吗?是的,我忘了编辑假设列表不为空的问题,或者我可以添加额外的代码来测试它是否为空,也可以进一步测试如果它只有一个或两个节点,我还应该添加案例
for(DLLNode<T>*ptr = head; ptr!=NULL; ptr=ptr->next)
    while (ptr->val == ptr->next->val)