一、问题提出:
请编写一段代码,能够在最坏情况下用 O(n)时间找出 n 个元素的带权中位数
二、算法分析:
三个关键词,最坏情况、O(n)的时间复杂度、从n个元素中找出一个数;很显然,这是一个线性时间选择算法的应用。
通过对带权中位数的查询可知:
对于n个数:,其权重依次为,则带权中位数满足:
因此我们可以直接对数据的权重求和,并与W/2进行比较:
void Find(int length,vector<int>num, vector<double>weight,int index)
{
double w1 = 0;
double w2 = 0;
if (index == length) //数组长度为0
{
return;
}
for (int i = 0; i < length; i++)//大于的权重和
{
if (num[i] > num[index])
{
w1+= weight[i];
}
}
for (int i = 0; i < length; i++) //小于的权重和
{
if (num[i] < num[index])
{
w2+= weight[i];
}
}
if (w1 <=0.5 && w2 <=0.5)//带权中位数的定义
{
cout << num[index] << endl;
}
else
{
Find(num, w, index + 1);//继续递归寻找符合条件的值
}
}
因此在最坏的情况下,算法的时间复杂度为.