我正在阅读关于java中的Big O符号,我发现了以下问题,我不理解它们的答案。
(a)在使用排序数组实现的字典中查找内容的最佳算法的最坏情况渐近运行时间是多少? O(log n)
(b)在使用排序数组实现的字典中查找内容的最佳算法的最佳情况渐近运行时间是多少? O(1)
(c)在使用排序链表实现的字典中查找内容的最佳算法的最坏情况渐近运行时间是多少? 为O(n)
(d)在使用排序链表实现的字典中查找内容的最佳算法的最佳情况渐近运行时间是多少? O(1)
(e)给定二叉搜索树,找出哪个值是最小值并删除它。 O(n)
(f)给定二叉搜索树,找出哪个值是中值,并删除它 值。 O(n)
你能否向我解释一下这些答案,以及前四个问题中该特定算法的含义是什么?
由于
答案 0 :(得分:2)
Big O是最糟糕的情况。当你想要计算大O时,你需要假设所有东西都会在最后一个项目中找到,天空是黑色的等等。
(a)最好的算法是二分搜索,它在排序数组的中间猜测,如果针更大,则猜测后者元素的中间点,否则是前者元素。重复这一过程,直到找到元素或子集是微不足道的。由于你总是有两个可能的决定,并且在每个决定上,集合的大小减半,步骤的数量将重复你的集合减半的次数,这是2的幂将产生的数量。集的大小。这是log(n)。最糟糕的情况是需要执行所有步骤,即O(log(n))。
(b)最好的情况是项目正好恰好位于集合的中间,这恰好是第一个猜测,因此结果是O(1)。
(c)在链表中,即使对它进行排序,也不能进行二进制搜索,因为您只能从给定元素中获取下一个元素。最糟糕的情况是针头恰好是最后一针。为O(n)
(d)情况与上述情况相同,但最好的情况是第一个项目恰好是搜索项目。 O(1)
(e)在平衡的BST中,搜索时间为O(logn),删除将为O(1)。但是如果我们假设最坏的情况,即BST是不平衡的并且根是最大值,则搜索将遍历所有项目,直到它到达唯一的叶子,最小的O(n)并将其移除O(1)。 / p>
(f)要查找BST中的中位数,您可能需要遍历所有节点,想象一下当根有两个孩子并且最左边的孩子只有正确的孩子并且最右边的孩子只留下孩子并且树有共有两片叶子。在这种情况下,最糟糕的情况是当你选择了错误的方向并且越过了错误的一侧然后必须遍历到良好的方向时,他最后一个元素就是你要搜索的那个元素。为O(n)