一个无序的整数数组,找出两个最接近的数,时间复杂度最快能达到多少?

Aaron_Jerry 2009-07-17 10:45:08
如题。谢谢
...全文
1508 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuxing_hui 2010-03-23
  • 打赏
  • 举报
回复
你的想法很好,但可以这样处理,设一个标志数组,大小和原来数组相等,记录位置确定状态,当某个元素的位置最终确定时,将此元素对应的标志置为true,同时看它前后相邻的元素的位置是否确定,如果确定了,就将其最小差值记录下来,这样,即使某个元素位置确定时,它的前后元素的位置没有确定,最终等它的前后元素的位置确定后,它与前后元素的差值总会被计算出来。

上面的方法还可以改进,可以去掉位置确定标志数组,因为快速排序时,假设对a[n] a[n+1] ... a[n+k]
这个区间进行partion,当某个元素a[x] 在这轮partion中被定位下来放在 m 位置 (n <= m <= n+k),如果m != n || m != n+k 则不需要计算这个元素与前后元素的差值,因为a[x]如果不被放在区间的第一个或者最后一个,意味着它被放在了区间的中间,则它前后的元素必定没有被定位(请仔细分析)。



[Quote=引用 26 楼 hezhiyonging 的回复:]

快速排序在一次排序之后,可以确定一个元素的位置,但是他前后的元素的位置并不能确定,所以,你在“每确定一个元素的位置后记下这个元素前后的差值,保存最小值,”,是不合理的,不知道是否正确。

引用 18 楼 yuxing_hui 的回复:
先快速排序,在排序的过程中,每确定一个元素的位置后记下这个元素前后的差值,保存最小值,这样,当整个
数组排完后,这个最小值也计算出来了,不必要分成两个步骤……
[/Quote]
hezhiyonging 2009-09-30
  • 打赏
  • 举报
回复
快速排序在一次排序之后,可以确定一个元素的位置,但是他前后的元素的位置并不能确定,所以,你在“每确定一个元素的位置后记下这个元素前后的差值,保存最小值,”,是不合理的,不知道是否正确。

[Quote=引用 18 楼 yuxing_hui 的回复:]
先快速排序,在排序的过程中,每确定一个元素的位置后记下这个元素前后的差值,保存最小值,这样,当整个
数组排完后,这个最小值也计算出来了,不必要分成两个步骤(先排完序,在找最小值)。
[/Quote]
poson 2009-09-30
  • 打赏
  • 举报
回复
先一遍扫描,求最大,最小和均值。

x=(max-min)/avg
用x把数分成很多个区间,用hash做。
然后再每个区间求最小距离。相邻区间也要求一次。
yangyongde2002 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 hyram 的回复:]
引用 22 楼 orangeguy 的回复:
就是求一维最小曼哈顿距离, 复杂度O(n)

能不能详细讲一下?
[/Quote]

我猜他讲不出来!
hyram 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 orangeguy 的回复:]
就是求一维最小曼哈顿距离, 复杂度O(n)
[/Quote]
能不能详细讲一下?
fire_woods 2009-09-28
  • 打赏
  • 举报
回复
n*log(n)
orangeguy 2009-09-28
  • 打赏
  • 举报
回复
就是求一维最小曼哈顿距离, 复杂度O(n)
yuxing_hui 2009-07-22
  • 打赏
  • 举报
回复
先快速排序,在排序的过程中,每确定一个元素的位置后记下这个元素前后的差值,保存最小值,这样,当整个
数组排完后,这个最小值也计算出来了,不必要分成两个步骤(先排完序,在找最小值)。
juggernaut620 2009-07-22
  • 打赏
  • 举报
回复
不会
LeonTown 2009-07-22
  • 打赏
  • 举报
回复
再问一下,
可不可以用二分法啊~
abcdef0966 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yuxing_hui 的回复:]
先快速排序,在排序的过程中,每确定一个元素的位置后记下这个元素前后的差值,保存最小值,这样,当整个
数组排完后,这个最小值也计算出来了,不必要分成两个步骤(先排完序,在找最小值)。
[/Quote]

这样做比先排序再找最小差值也没啥优势啊
shex4 2009-07-21
  • 打赏
  • 举报
回复
我也比较土:排序 O( nlgn )
+ 计算“ a[n]-a[n-1] n from 1 ” O(n)


hash以后还是要查看每个小bucket吧?
zhengjiaxiang135 2009-07-21
  • 打赏
  • 举报
回复
转转 学习~~~
abcdef0966 2009-07-21
  • 打赏
  • 举报
回复
先排序
将排序后的数组元素a[i]-a[i-1]->b[i]
再在b[i]中找出最小值

菜鸟,欢迎拍砖
abcdef0966 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 abcdef0966 的回复:]
先排序
将排序后的数组元素a[i]-a[i-1]->b[i]
再在b[i]中找出最小值

菜鸟,欢迎拍砖
[/Quote]

复杂度可达到 O(nlgn) + O(n) = O(nlgn)
LeonTown 2009-07-20
  • 打赏
  • 举报
回复
或许可以通过分治法来处理。

每次将数组分成两部分,分别找距离最小的两个数,和距离;
对相邻组间的数,比较距离在全局距离最小值范围内的数。
jlp999 2009-07-20
  • 打赏
  • 举报
回复
学习,没明白:(
showjim 2009-07-18
  • 打赏
  • 举报
回复
1.数组大的时候可以用位图,第一遍扫数组,第二遍扫位图。
2.数组小的时候用哈希合并,第一步从最后一位开始逐位合并直到某个哈希键值有两个值(最小值与最大值),第二步扫描哈希表(如果存在下键值,则本键最大值与下键最小值之差也要计算)计算最小差值。
showjim 2009-07-18
  • 打赏
  • 举报
回复
1.数组大的时候可以用位图,第一遍扫数组,第二遍扫位图。
2.数组小的时候用哈希合并,第一步从最后一位开始逐位合并直到某个哈希键值有两个值(最小值与最大值),第二步扫描哈希表(如果存在下键值,则本键最大值与下键最小值之差也要计算)计算最小差值。
dirtysalt 2009-07-18
  • 打赏
  • 举报
回复
如果这个无序数组是静态的话,排序可能是最快的吧O(nlgn)
如果这个无序数组是动态的话,可以通过扩展平衡树达到(nlgn).可以看看算法导论14.3-6这个习题
加载更多回复(8)

33,008

社区成员

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

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