算法设计

csdncannon 2003-06-17 10:06:00
给定一个集合S有n个元素,给定一个正整数k(k<=n),设计一个复杂度为O(n)的算法求出
S中接近中位数的k个数,大家有没有什么好想法?

另:怎么用复杂度为O(n)的算法求第k小元素?
...全文
71 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdncannon 2003-06-20
  • 打赏
  • 举报
回复
我的程序,不过是很简单的情况,大家看行不行?

#include <stdio.h>
#include <stdlib.h>

int a[]={0,3,5,6,9,1,4,7,8,2};

int partition( int low , int high )
{
int l=low ,r=high ,temp;

a[0]=a[low];
while( l < r )
{
while( a[0]<=a[r] && l<r)
r--;
temp=a[l];
a[l]=a[r];
a[r]=temp;

while( a[0]>=a[l] && l<r)
l++;
temp=a[l];
a[l]=a[r];
a[r]=temp;
}


return l;
}

int select( int left , int right , int k)
{
int p;

if( left==right )
return a[left];
else
{
p=partition(left,right);

if( p < k )
return select(p+1,right,k);
else if ( p > k )
return select(left,p-1,k);
else
return a[p];
}

}

void main( )
{
int t1,t2,i;

t1=select(1,9,3);
t2=select(1,9,7);

for(i=1 ; i<=9 ; i++)
if(a[i]<t2 && a[i]>t1)
printf("%d\t",a[i]);
}
zzpdhr 2003-06-20
  • 打赏
  • 举报
回复
通过选取partition的主元素,可以得到最坏情况下复杂度为O(n)的算法?
really?
我想应该是平均复杂度是O(n)
csdncannon 2003-06-19
  • 打赏
  • 举报
回复
就应该那样啊!
dullboy0823 2003-06-19
  • 打赏
  • 举报
回复
我也觉得bluesky2008()的建议可行
csdncannon 2003-06-19
  • 打赏
  • 举报
回复
我在华工的那本算法书上找到了答案,但是那上面的数学推导太难懂了

通过选取partition的主元素,可以得到最坏情况下复杂度为O(n)的算法
csdncannon 2003-06-18
  • 打赏
  • 举报
回复
为什么复杂度师 O(n)呢?
xuezhenlei 2003-06-18
  • 打赏
  • 举报
回复
BlueSky2008()的建议很有价值,我至少知道该从那里入手了
csdncannon该是同路人:)
BlueSky2008 2003-06-18
  • 打赏
  • 举报
回复
以线性时间做选择,算法书中一般都有讲的。
STL中也有这个函数:stl => algorithm => nth_element(),O(n)时间的。
“设计一个复杂度为O(n)的算法求出S中接近中位数的k个数”可以这样:
以O(n)时间选择第[n-k/2]大的数,
以O(n)时间选择第[n+k/2]大的数;
O(n)时间遍历,选择这两数之间的数。边界可能要再考虑一下。总复杂度O(n).
ZhangYv 2003-06-18
  • 打赏
  • 举报
回复
推导难度不小且十分麻烦,我也说不好。知道这是O(n)就可以,最好自己再查阅相关资料,在排序那里一般都会有。
ZhangYv 2003-06-17
  • 打赏
  • 举报
回复
一般在排序部分会讲到如何取第K小的数和取中位数,给出一种改造快速排序的取中位数方法O(n),有点类似于二分查找的。
const k = 第K小的数
keytype Select(int i; int j)
{
int p;
if (i == j)
return A[i].key;
p = Partition(i,j);
if (k <= p)
return Select(i,p);
else
return Select(p+1,j);
}
csdncannon 2003-06-17
  • 打赏
  • 举报
回复
继续啊
zzpdhr 2003-06-17
  • 打赏
  • 举报
回复
用复杂度为O(n)的算法求第k小元素 随便一本算法书上都有 不过O(n)的算法实现起来很难 即使stl中也不用这个算法

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧