了解从链表中删除重复项的复杂性

时间:2017-05-25 17:23:10

标签: c++ algorithm set time-complexity

我编写了这个程序来删除未排序链表中的重复节点:

#include<bits/stdc++.h>
using namespace std;

/* A linked list node */
struct Node
{
    int data;
    struct Node *next;
};

// Utility function to create a new Node
struct Node *newNode(int data)
{
   Node *temp = new Node;
   temp->data = data;
   temp->next = NULL;
   return temp;
}

/* Function to remove duplicates from a
   unsorted linked list */
void removeDuplicates(struct Node *start)
{
    // Hash to store seen values
    unordered_set<int> seen;

    /* Pick elements one by one */
    struct Node *curr = start;
    struct Node *prev = NULL;
    while (curr != NULL)
    {
        // If current value is seen before
        if (seen.find(curr->data) != seen.end())
        {
           prev->next = curr->next;
           delete (curr);
        }
        else
        {
           seen.insert(curr->data);
           prev = curr;
        }
        curr = prev->next;
    }
}

/* Function to print nodes in a given linked list */
void printList(struct Node *node)
{
    while (node != NULL)
    {
        printf("%d ", node->data);
        node = node->next;
    }
}

/* Driver program to test above function */
int main()
{
    /* The constructed linked list is:
     10->12->11->11->12->11->10*/
    struct Node *start = newNode(10);
    start->next = newNode(12);
    start->next->next = newNode(11);
    start->next->next->next = newNode(11);
    start->next->next->next->next = newNode(12);
    start->next->next->next->next->next =
                                    newNode(11);
    start->next->next->next->next->next->next =
                                    newNode(10);

    printf("Linked list before removing duplicates : \n");
    printList(start);

    removeDuplicates(start);

    printf("\nLinked list after removing duplicates : \n");
    printList(start);

    return 0;
}

查找哈希表中的每个元素是否会影响复杂性?如果是,则该算法的时间复杂度应该是考虑到该集合被实现为二进制搜索树,其中在最坏的情况下搜索元素的成本是O(logn)。 根据我T(n)= T(n-1)+ log(n-1)即。第n个元素将执行log(n-1)比较(即树的高度为n-1个元素) 请进行数学分析。

1 个答案:

答案 0 :(得分:2)

  

查找哈希表中的每个元素是否会影响复杂性?

好吧,在您的代码中,您使用的unordered_set平均复杂度为O(1),因此简单的答案是 - 否。

  

...考虑到该集合被实现为二进制搜索树,其中在最坏的情况下搜索元素的成本是O(logn)。

同样,您选择的unordered_set不是二进制搜索。我相信set的一些实现使用红/黑树,你会看到O(logN),但是unordered_set它应该是恒定的时间。所以现在唯一的问题是遍历链表。其中,因为您在访问每个节点时只是朝一个方向走,所以是O(N)操作。