根据Big-O表示法对不同数据结构的不同操作的复杂性

时间:2016-11-21 10:37:39

标签: data-structures time-complexity big-o

我正在阅读java编程中的大O符号。我发现下表显示了不同数据结构的不同大O.

enter image description here

http://bigocheatsheet.com/

我的问题是:

  1. 如果我要删除数组中的项目,是O(n^2)吗? (搜索和删除)
  2. 如果我想删除堆栈中的项目,是O(n)
  3. 哪一个更有效,是单个链表还是双单列表?
  4. 在什么情况下,哈希表中的插入操作是O(1)还是O(n)
  5. 如果我想删除二元搜索树中的项目,那么它是O(log(n)*log(n))而插入只是O(log(n))吗?
  6. 感谢。

3 个答案:

答案 0 :(得分:3)

  1. 如果要删除数组中的项目,首先必须搜索它(需要O(n)),然后必须移动项目以填补空白(需要O(n))。因此,有效时间复杂度为O(n)
  2. 如果要从堆栈中删除项目,则只能删除最顶层的元素(堆栈数据结构的属性)。因此,可以在O(1)
  3. 中完成
  4. 哪种类型的链表更有效取决于您的要求。例如,如果您想节省内存,那么由于维护额外指针引用的开销,您可能不会使用双向链表。但是,如果您希望能够在两个方向上遍历列表,则必须使用双向链表。双向链表的实现有点冗长,因为你必须执行更多的指针操作,但是,很多操作(比如删除最后一个元素)都可以轻松执行。
  5. 我们更喜欢使用哈希表,因为我们可以实现O(1)插入和搜索时间。几乎所有其他数据结构都需要O(n)插入时间。 (O(n)课程包括O(log n)O(1)等。假设我们在哈希表中使用separate chaining,其中每个链是一个已排序的链表。然后,对于每次插入,我们需要搜索链表以找到要插入的正确位置(就像插入排序一样),这将花费O(n)最坏情况时间。
  6. 如果你必须从BST删除一个元素,首先你必须搜索它(平均情况下需要O(log n)),然后你必须用它的inorder继承者或者前任替换已删除的节点(take {{ 1}})。因此,有效平均案例删除时间为O(log n)

答案 1 :(得分:2)

  1. 当你做一个操作而另一个操作时,你不会增加它们的复杂性 - 最大值获胜。在这种情况下,O(n)+ O(n)= O(n)
  2. 堆栈是否有'删除任意项'API?如果您公开底层数据结构是另一回事,但堆栈通常只有一种方法来“弹出”元素
  3. 用例是什么?
  4. 查看hash collisions期间发生的事情。

答案 2 :(得分:2)

让我回答你的问题:

  1. 不。它是O(n) + O(n) = O(n)
  2. 不,它是O(1),但你只能访问一个非常重要的元素。对于其他元素,它是O(n)。
  3. 双单列表不会更糟,有时可能更快,但需要更多内存以供其他参考。
  4. 最佳时间 - 当没有具有该哈希的元素时,如果所有插入的元素根据某些模数具有相同的哈希值,则最糟糕。例如,如果你比较哈希的模3和你的哈希函数总是返回一个k为3k的数字,你就会O(n)
  5. 根据你的表,没有,最糟糕的情况是O(n)。
  6. 我会在一分钟内解释更多。