社区
数据结构与算法
帖子详情
算法设计
csdncannon
2003-06-17 10:06:00
给定一个集合S有n个元素,给定一个正整数k(k<=n),设计一个复杂度为O(n)的算法求出
S中接近中位数的k个数,大家有没有什么好想法?
另:怎么用复杂度为O(n)的算法求第k小元素?
...全文
119
12
打赏
收藏
算法设计
给定一个集合S有n个元素,给定一个正整数k(k<=n),设计一个复杂度为O(n)的算法求出 S中接近中位数的k个数,大家有没有什么好想法? 另:怎么用复杂度为O(n)的算法求第k小元素?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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中也不用这个算法
算法设计
——五大算法总结
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
算法设计
总结一、【分治法】二、【动态规划法】三、【贪心算法】四、【回溯法】1、回溯法的一般描述五、【分支限界法】 一、【分治法】 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)
算法工程师如何设计算法,优化算法,研发新的算法的
明确目标:确定算法要解决的问题和达到的目标。需求分析:了解需求的具体细节,如输入输出格式、性能要求等。首先,需要识别和定义问题。这一步至关重要,因为算法是为了解决具体问题而设计的。识别问题:明确现有方法不能解决的问题或其局限性。定义目标:明确新算法的目标和预期效果。
算法设计
之五大常用
算法设计
方法总结
算法设计
之五大常用
算法设计
方法总结 一、【分治法】 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个
算法的设计要求
一个优秀的算法应该具备的设计要求主要有以下几点: 正确性 算法的正确性是指算法至少具有输入,输出和加工处理无歧义,并且可以正确反映问题的需求,以及正确得到问题的答案。 关于“正确”的理解一共有四个层次: 算法程序没有语法错误。算法程序能够根据正确的输入的值得到满足要求的输出结果。算法程序能够根据错误的输入的值得到满足规格说明的输出结果。算法程序对于精心设计的,极其刁难的测试
数据结构与算法
33,025
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章