我正在解决一个面试问题,来自 Glassdoor软件工程师。
问题是:
我同意作者的算法以及作者对此算法的空间复杂度的评估。但我对作者关于插入堆和整体时间的运行时间分析有问题。
对于步骤“取m个元素中的前n个并放入堆中”,这不会在O(nlogn)中运行吗?至少根据我的课堂笔记堆添加,插入将是O(logn),因为您正在插入n个元素,所以整个步骤的运行时间将为O(nlogn)。
考虑到这一点,整个算法的总运行时间不会是从大O求和中使用的吗?
问题是:
给定100万个数字的列表,如何以有效的方式查找列表中的前n个数字以下是同一链接中作者提供的解决方案:
- 创建一个最小堆
- 取m个元素中的前n个并放入堆中 (O(n))
- 对于每个剩余的(m-n)个元素,如果它大于堆的最小值,则将其插入堆中并删除最小值。 (最坏情况下 O((m-n)log n) 如果列表已排序。
我同意作者的算法以及作者对此算法的空间复杂度的评估。但我对作者关于插入堆和整体时间的运行时间分析有问题。
对于步骤“取m个元素中的前n个并放入堆中”,这不会在O(nlogn)中运行吗?至少根据我的课堂笔记堆添加,插入将是O(logn),因为您正在插入n个元素,所以整个步骤的运行时间将为O(nlogn)。
考虑到这一点,整个算法的总运行时间不会是从大O求和中使用的吗?
O(nlogn + (m-n)logn) = O(mlogn)