问题:如果所有元素都被最多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吗?任何帮助都会很棒。谢谢!
答案 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)
。