社区
数据结构与算法
帖子详情
算法设计
csdncannon
2003-06-17 10:06:00
给定一个集合S有n个元素,给定一个正整数k(k<=n),设计一个复杂度为O(n)的算法求出
S中接近中位数的k个数,大家有没有什么好想法?
另:怎么用复杂度为O(n)的算法求第k小元素?
...全文
76
12
打赏
收藏
算法设计
给定一个集合S有n个元素,给定一个正整数k(k<=n),设计一个复杂度为O(n)的算法求出 S中接近中位数的k个数,大家有没有什么好想法? 另:怎么用复杂度为O(n)的算法求第k小元素?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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中也不用这个算法
计算机
算法设计
与分析(第2版)
本书为大学计算机专业核心课程
算法设计
与分析教材。全书以
算法设计
策略为知识单元,系统介绍
算法设计
方法与分析技巧。主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、概率算法、线性规划与网络流、NP完全性理论与近似算法等。书中既涉及经典与实用算法及实例分析,又包括算法领域热点追踪。
C++ 算法大全 PDF
C++ 经典算法大全。内容详细,算法经典。很值得一看。
Algorithms.算法概论.习题答案
Algorithms.算法概论.习题试解
算法竞赛入门经典(第二版) UVa原题 PDF版
算法竞赛入门经典(第二版)的习题都是UVa上的, 但是UVa太慢了太慢了太慢了太慢了太慢了, 于是我把各章习题的pdf一次性打包下载到本地, 和大家分享:)
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章