当我回顾数据结构和算法的大O表示法时,当不同的来源放置O(n)时间复杂度来从链表中删除节点vs O(1)时,我感到困惑。例如,big O cheat sheet在删除节点时将O(1)放在其中,因为我认为删除节点将是O(n),因为您必须先找到该节点然后再将其删除。
所以我的问题是,O(1)的时间复杂度是否只是假设删除操作本身,而没有考虑必须首先找到该节点?让我们假设要删除的节点位于列表中的任何位置,而不仅位于列表的开头或结尾。
我已经审查了以下问题,但它们没有解决我的问题:
big O notation for removing an element from a linked list
Big-O summary for Java Collections Framework implementations
答案 0 :(得分:2)
根据first thread you reviewed,时间复杂度O(1)确实是指删除已经确定的节点。
如果单击所查看的big-O页面上的“单链接列表”链接,则可以获取有关所涉及功能(包括代码)的更多信息-here。这应该可以准确回答您的问题:)
答案 1 :(得分:1)
您的问题的答案是:是的。
通常,当陈述O(1)时间复杂度以便在链表中进行插入或删除时,假定指向所讨论节点的指针是已知的。但是,这并非完全没有用。考虑您要遍历列表并删除与特定描述匹配的元素的情况。使用链表,可以在O(n)时间内完成,并增加O(1)个空间。对于数组,通常需要O(n ^ 2)时间或O(n)额外空间。