请教一个关于线性时间选择算法的题目

javiwater 2013-09-17 11:15:53
有一个集合, 里面有n个无序实数. 设最小数是a,最大数是b. 他们的平均距离定义为d = (b-a)/(n-1)

1)证明集合里面至少有一对数x和y, 使得|x-y|<=d.

2)设计一个算法,在O(n)时间内找到这样一对x和y
(注:只需要找到一对满足条件的x和y即可,不需要找到所有满足条件的x和y)

提示:可以把线性时间选择算法作为你的算法的子程序,
即寻找一个size为n的无序集合中第K大的数仅需O(n)时间, 1<=K<=n, 详情见算法导论


第一问很简单 请略过

第二问不太会
...全文
402 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2013-09-18
  • 打赏
  • 举报
回复
引用 9 楼 cfvmario 的回复:
[quote=引用 7 楼 FancyMouse 的回复:] [quote=引用 6 楼 cfvmario 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 既然有第一个结论,那么我如果设置n个桶,桶i放置值在a+i*d, a+(i+1)*d之间的元素。通过比较桶内元素或者相邻桶的最值,就能做出来了。 要套线性选择也行,选到pivot以后,每次往平均距离小的那一半递归下去就是。
呵呵,貌似这又是钻了没要求空间复杂度的空子?基数排序(桶排序也是基数的思想)这种思想是很好,只是万一数据分布恶心就恶心了[/quote] 不,这个做法没有钻空子。即使值域再大,这也只有n个桶,桶的数量和值域大小没有关系。桶排序里的桶数量是和值域大小有关系的。这点是本质不同。[/quote] 但桶的容量是和值的分布有关的。。比如1,2,3,4,5,10000这种极端情况,一个桶集中了几乎所有元素,要是每个桶都要N的空间,最坏情况复杂度就变成平方了[/quote] 1. 这个题的办法,每个桶最多只要放2个东西。 2. 即使是桶排序,它的空间复杂度也不是平方。稍微用个动态内存分配,因为所有桶总共就放n个元素,复杂度上就足以弄回线性。你坚持是平方那是因为你写扯了。
cfvmario 2013-09-18
  • 打赏
  • 举报
回复
引用 7 楼 FancyMouse 的回复:
[quote=引用 6 楼 cfvmario 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 既然有第一个结论,那么我如果设置n个桶,桶i放置值在a+i*d, a+(i+1)*d之间的元素。通过比较桶内元素或者相邻桶的最值,就能做出来了。 要套线性选择也行,选到pivot以后,每次往平均距离小的那一半递归下去就是。
呵呵,貌似这又是钻了没要求空间复杂度的空子?基数排序(桶排序也是基数的思想)这种思想是很好,只是万一数据分布恶心就恶心了[/quote] 不,这个做法没有钻空子。即使值域再大,这也只有n个桶,桶的数量和值域大小没有关系。桶排序里的桶数量是和值域大小有关系的。这点是本质不同。[/quote] 但桶的容量是和值的分布有关的。。比如1,2,3,4,5,10000这种极端情况,一个桶集中了几乎所有元素,要是每个桶都要N的空间,最坏情况复杂度就变成平方了
FancyMouse 2013-09-18
  • 打赏
  • 举报
回复
引用 6 楼 cfvmario 的回复:
[quote=引用 1 楼 FancyMouse 的回复:] 既然有第一个结论,那么我如果设置n个桶,桶i放置值在a+i*d, a+(i+1)*d之间的元素。通过比较桶内元素或者相邻桶的最值,就能做出来了。 要套线性选择也行,选到pivot以后,每次往平均距离小的那一半递归下去就是。
呵呵,貌似这又是钻了没要求空间复杂度的空子?基数排序(桶排序也是基数的思想)这种思想是很好,只是万一数据分布恶心就恶心了[/quote] 不,这个做法没有钻空子。即使值域再大,这也只有n个桶,桶的数量和值域大小没有关系。桶排序里的桶数量是和值域大小有关系的。这点是本质不同。
cfvmario 2013-09-18
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
既然有第一个结论,那么我如果设置n个桶,桶i放置值在a+i*d, a+(i+1)*d之间的元素。通过比较桶内元素或者相邻桶的最值,就能做出来了。 要套线性选择也行,选到pivot以后,每次往平均距离小的那一半递归下去就是。
呵呵,貌似这又是钻了没要求空间复杂度的空子?基数排序(桶排序也是基数的思想)这种思想是很好,只是万一数据分布恶心就恶心了
javiwater 2013-09-17
  • 打赏
  • 举报
回复
明白了 多谢
FancyMouse 2013-09-17
  • 打赏
  • 举报
回复
既然有第一个结论,那么我如果设置n个桶,桶i放置值在a+i*d, a+(i+1)*d之间的元素。通过比较桶内元素或者相邻桶的最值,就能做出来了。 要套线性选择也行,选到pivot以后,每次往平均距离小的那一半递归下去就是。
hqw19881118 2013-09-17
  • 打赏
  • 举报
回复
第一题是个显然的结论,因为按照题中d的定义,就有一对:最大值、最小值
hqw19881118 2013-09-17
  • 打赏
  • 举报
回复
看来桶排序的思想也是挺有用的,赞2楼
LI597494570 2013-09-17
  • 打赏
  • 举报
回复
第一题都不会的漂过

33,027

社区成员

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

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