使用堆简化解决方案的Big-O分析

时间:2018-02-26 07:55:38

标签: big-o

问题:如果所有元素都被最多k个位置(相对于真实的排序顺序)错位,则数组是k排序的。及时对k排序的数组进行排序 O(n log k)。

我的解决方案是: 1.创建一个大小为n的新数组(这是O(1)) 2.创建一个大小为k的最小堆,并用数组的前k个元素填充它(这是O(k))。 3.逐个从我们的最小堆中删除min并将其放入新数组中,并从剩余元素中添加下一个元素(这是(n-k)(logk))。

这将导致O(k +(n-k)(logk))。

我的问题是这是否会导致O(nlogk)?我们可以从简化的大O中删除klogk和k吗?任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

是的,确实如此。但是,您的分析并不完全正确 - 第三步的运行时间为n * logk(不是(n-k) * logk),因为您需要从堆中删除所有输入数组元素并将其放入目标数组中(注意所有输入数组元素逐个遍历堆)。由于输入数组具有n个元素,并且每个删除操作都是logk,因此这会给n*logk

除了big-o的定义之外,计算渐近复杂度所需的唯一不等式是k < n(因为每个元素最多可被错误放置n - 1个位置)。因此:

k + n * logk < n + n * logk = n * (1 + logk),即O(n * logk)