首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

输入一个整数数组,回到所有元素两两之差绝对值最小的值,O(n)算法

2013-02-06 
输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法输入一个整数数组,返回所有元素两两之差绝

输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法

输入一个整数数组,返回所有元素两两之差绝对值最小的值(只要得出最 小值即可,不需要求出是哪两个数)。


两两之差的绝对值的最小值,也就是在找所有元素中离得最近的两个元素的距离。

我有一个O(n)的算法,用空间换来的。方法如下:申请一个长度为UINT_MAX的bool型数组isExist[],初始值均为false。

第一阶段,遍历输入数组,并记录数组的最大值最小值对于ai,将isExist[ai]标记为true。标记过程中如果发现某元素已经出现,说明有重复元素,直接返回0,即是最小值。

第二阶段,遍历数组isExist[]中位于输入数组最小值和最大值之间的部分,则很容易找到最近距离。

第一阶段时间复杂度为O(N), 第二阶段最坏情况下时间复杂度为O(UINT_MAX),是个常数。所以,总的时间复杂度是O(N).

理论上讲是O(N)的,实际应用上因为第二阶段最坏要遍历UINT_MAX个元素,除非N非常大,否则还不如O(N*logN)的算法速度快。

不知是否合理,欢迎看到的人拍砖。

1楼cosimo_dw昨天 15:49
LZ没有弄清楚复杂度的真正含义……怎么说呢,真正算复杂度的话就不应该有UINT_MAX这种限制了,否则的话按原来的算法第一阶段的复杂度并不是O(N)而是O(UINT_MAX),因为isExist中每个元素至多访问两次(第二次的时候就返回0了)。nn这样的话复杂度其实是个常数。nn事实上也确实如此,如果有UINT_MAX限制输入的大小范围的话,所有算法都是常数复杂度的。真正的复杂度的意义在于,不管输入的数范围有多大,这个算法的运算次数总可以保持在跟输入规模的某个函数成正比的范围内。
Re: cosimo_dw昨天 16:53
回复cosimo_dwn有个小错误:有UINT_MAX限制输入的大小范围的话,也并不是所有算法都是常数复杂度的……不过这个复杂度问题比较纠结了

热点排行