我编写了这个程序来删除未排序链表中的重复节点:
#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个元素) 请进行数学分析。
答案 0 :(得分:2)
查找哈希表中的每个元素是否会影响复杂性?
好吧,在您的代码中,您使用的unordered_set平均复杂度为O(1),因此简单的答案是 - 否。
...考虑到该集合被实现为二进制搜索树,其中在最坏的情况下搜索元素的成本是O(logn)。
同样,您选择的unordered_set
不是二进制搜索。我相信set
的一些实现使用红/黑树,你会看到O(logN),但是unordered_set
它应该是恒定的时间。所以现在唯一的问题是遍历链表。其中,因为您在访问每个节点时只是朝一个方向走,所以是O(N)操作。