Algorithm 选择算法问题
假设您有一个由n个项目组成的数组,并且希望在最近的数组中查找k个项目 例如,如果A包含9个值{7,14,10,12,2,11,29,3,4} k=5,那么答案就是值{7,14,10,12,11},因为中位数 是10,这是A中最接近值10的五个值。给出一个算法 在O(n)时间内解决这个问题Algorithm 选择算法问题,algorithm,selection,Algorithm,Selection,假设您有一个由n个项目组成的数组,并且希望在最近的数组中查找k个项目 例如,如果A包含9个值{7,14,10,12,2,11,29,3,4} k=5,那么答案就是值{7,14,10,12,11},因为中位数 是10,这是A中最接近值10的五个值。给出一个算法 在O(n)时间内解决这个问题 我知道选择算法(深度选择)是解决这个问题的合适算法,但我认为它将在O(n*logn)时间内运行,而不是O(n)。任何帮助都将不胜感激:)您首先需要找到中值,这可以在O(n)中完成(例如使用霍尔算法) 然后需要实
我知道选择算法(深度选择)是解决这个问题的合适算法,但我认为它将在O(n*logn)时间内运行,而不是O(n)。任何帮助都将不胜感激:)您首先需要找到中值,这可以在
O(n)
中完成(例如使用霍尔算法)
然后需要实现一个排序算法,该算法根据元素到中间值的绝对距离(首先是最小距离)对数组中的元素进行排序
如果要以这种方式对整个数组进行排序,通常需要从O(n*logn)
到O(n^2)
,具体取决于所使用的算法。但是,由于您只需要第一个k
值,因此复杂性可以降低到O(k*logn)
到O(k*n)
由于
k
是一个常数,并且不取决于数组的大小,因此最坏情况下的总体复杂性将是:O(n)
(用于查找中值)+O(k*n)
(排序),这是O(n)
总体上的复杂性。我认为可以使用快速排序上的一个变量来实现这一点
您从一组n个项目开始,并寻找“中间”k个项目。您可以将其视为将S划分为大小为n-k/2(“较低”项)、k(“中间”项)和n-k/2(“较高”项)的三部分
这给了我们一个策略:首先从S中删除较低的n-k/2项,留下S’。然后从S'中删除上面的n-k/2项,留下S',这是S的中间k项
您可以使用“半快速排序”以这种方式轻松地对集合进行分区:选择一个轴,将集合划分为L和U(下部和上部元素w.r.t.轴),然后您知道分区中要丢弃的项目必须是全部L和部分U,反之亦然:相应地递归
[进一步思考,如果您以其他方式定义“最接近中位数”,这可能不是您想要的,但这只是一个开始。]假设:我们关心a中最接近中位数的k值。如果我们有A={1,2,2,2,2,2,2,2,2,2,2,3}和k=3,答案是{2,2,2}。同样,如果我们有A={0,1,2,3,3,4,5,6}和k=3,那么答案{2,3,3}和{3,3,4}同样有效。此外,我们对这些值来自的索引不感兴趣,尽管我认为对算法进行一些小的调整是可行的
对于(int i=0;iIMO),您必须对列表进行排序,排序值始终大于O(n)。您的问题相当于能够在O(n)时间内找到任意百分位。仅在O(n)时间内找到中位数(即解决k=1的问题)是可能的,但不是微不足道的。该算法可能会被扩展以找到百分位数。你为什么需要它?这是家庭作业吗?Dup:?你如何找到O(n)中的中值?寻找霍尔的快速选择算法:我尝试了4-5次向上投票,但也阻止了我向上投票。