如何找到第二小的值?
在有很多double型的数中,如何找到第二小的值呢?有没有简单、快速的?因为数相当多。
我的思路是,先找到最小的(就是将第一个数给min,然后后面的比较,比min小的就传给min)
然后,将第一个数给min_2,然后后面的比较,比min_2小且不等于min的给min_2。
有没有其它好的、快速的方法?
另外,在这里怎么判断两个数是否相等呢?浮点数一般用相减形式小于某误差值的形式,但是,这个我并不知道误差值是多少。能不能直接用不等于号呢?况且里面可能还含有0.
谢谢!
[解决办法]
维护一个2个元素的数组,用来暂存当前最大的两个值,下一个比其中任何一个大,就替换,O(n)复杂度。
[解决办法]
定义两个指针,一个从头,一个从尾,分别向数组的中间移动,比较*pHead,*pEnd,Max,SubMax,吧大数赋给max,次大的数给SubMax。两个指针相遇时,比较久结束了
[解决办法]
误差一般是 FLT_EPSILON 或者DBL_EPSILON.
找第几大的数什么的,一般都是堆.
O(n)的时间复杂度建立堆,然后破之
[解决办法]
共有2个元素,一个是最小的a,一个是大于最小的b.
要找的这个数x x>a,x<=b.
[解决办法]
。。。用循环比较不行吗
[解决办法]
if(m[0]>m[1])
{
a2=m[0];
a1=m[1];
}
else
{
a1=m[0];
a2=m[1];
}
for(b=2;到数据结束;b++)
{
if(m[b]<a2)
{
if(m[b]<a1)
{
a2=a1;
a1=m[b];
}
else
a2=m[b];
}
}
a2为次小
a1为最小
[解决办法]
先找最大值,然后比较和最大值差最小的
[解决办法]
1.有这样两种较快思路,第一边输入边存入找到最大的,在进行扫描比较每个元素,这样是O(2n)时间;
2.运用寻找第k小元素的算法(这个网上会有,一般教材也会有),即
if(数据个数<100) 排序即可
else 对数据分组,对每一组排序,找到每组中位数,然后对这一组递归调用该函数,返回最值p;
用p对所有数据进行划分,<p;=p;>p;三组,然后判断k与三组中的数据个数关系;然后递归调用该函数;
这个粗略说了一下,自己搜吧
2的时间理论计算是O(N)但大约也得O(十几个n)的复杂度,要比1慢,但要找第k小(大)元素是线性时间的,要比排序快的多。