我尝试用谷歌搜索和维基搜索这些问题,但似乎找不到具体的答案。我发现的大部分内容都涉及使用主定理的证明,但我希望用简单的英语能更直观地记住一些东西。另外我不在学校,这些问题是为了面试。
记忆:
在内存使用方面确定 big-o 到底意味着什么?例如,当您必须存储所有 n 个项目时,为什么认为堆排序使用 O(1) 内存运行?是因为您只为堆创建一个结构吗?或者是因为你知道它的大小,所以你可以在堆栈上创建它,这始终是恒定的内存使用?
速度:
如果在 O(1) 中完成添加元素但在 O(logn) 中完成渗透,如何在 O(n) 时间内完成堆的创建?这是否意味着您在 O(1) 处进行 n 次插入,使其成为 O(n) 并在每次插入后渗透为 O(logn)。所以总共 O(n) * O(logn) = O(nlogn)。我还注意到堆排序的大多数实现都使用 heapify 函数而不是渗透来创建堆?由于 heapify 在 O(logn) 处进行 n 次比较,这将是 O(nlogn),并且在 O(1) 处进行 n 次插入,我们将得到 O(n) + O(nlogn) = O(nlogn)?第一种方法在 n 较小的情况下不会比第二种方法产生更好的性能吗?
我在上面假设了这一点,但是执行 O(1) 操作 n 次是否会导致 O(n) 时间?还是 n * O(1) = O(1)?