编程论坛
注册
登录
编程论坛
→
数据结构与算法
今天去参加笔试的一个算法题
myseemylife
发布于 2011-03-24 19:10, 1145 次点击
给你N个数(百万级的)。求出最大三个数,要有效率(重点),大家看一看
6 回复
#2
LSYHEFENG
2011-03-24 20:05
用哈希,时间属于线性的
#3
buffer
2011-03-24 20:09
(1)把前K个数初始化为一个最小堆
(2)从第K+1个数开始,与堆顶元素比较,如果大于堆顶元素,就用这个数替换堆顶,调整堆;否则,比较下一个数
最后这个最小堆里的元素就是最大的K个数,时间复杂度O(n*logK),空间复杂度O(K)
这里K=3,所以时间复杂度基本就是线性的了:)
#4
世界模型
2011-03-24 20:18
额,前几天我也纠结过一类似的问题,顶一个
#5
xiepanqi
2011-03-26 15:48
最好哈希
次点就二叉查找树
#6
世界模型
2011-03-26 22:50
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <time.h>
float min_num[5] = {-100.0,-110.0,-120.0,-130.0,-140.0};
//任意设置的五个最小值
int location[5] = {1000,2000,4000,8000,9000};
//任意设置的五个最小值的位置。
//也可不要,由随机数生成。
void min_five_elem()
{
srand((int)time(NULL));
float five[5];
float temp;
for(int i=0;i<5;i++)
{
five[i] = float(rand()/1000.0);
// cout<<five [i]<<" ";
}
for(i=0;i<5;i++)
{
for(int j=i+1;j<5;j++)
{
if(five[i]>five[j])
{
temp = five[i];
five[i] = five[j];
five[j] = temp;
}
}
}
int x=0;
for(i=5;i<10000;i++)
{
//最小值可以不要设定,由随机数产生,设定是为了判断程序正确性。
//////////////////////////////////////////////////////////////////////////////////////
// if(i==location[1]||i==location[2]||i==location[3]||i==location[4]||i==location[0])//任意位置设置5个最小的数,用于判断程序的正确性。
// temp = min_num[x++];
// else
//////////////////////////////////////////////////////////////////////////////////////
temp = float(rand()/100.0);
//cout<<temp<<" ";
if(temp <five[4])
{
for(int j=0;j<5;j++)
{
if(temp < five[j])
{
for(int x = 4;x>j;x--)
{
five[x] = five[x-1];
}
five[j] = temp;
j=6;//?
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
#if 0
if( five[4]>temp )
{
five[4]=temp;
for( int k=3; k>=0; --k )
{
if( five[k]>temp )
{
five[k+1]=five[k];
}
else
{
five[k+1]=temp;
break;
}
}
}
#endif
////////////////////////////////////////////////////////////////////////////////////////////////
}
cout<<endl<<"-------------------------------------------------------------------------------"<<endl;
cout<<"最小的五个数是:";
for(i=0;i<5;i++)
{
cout<<five[i]<<" ";
}
cout<<endl<<"-------------------------------------------------------------------------------"<<endl;
}
int main()
{
clock_t start, finish; //时间比较的函数
double duration;
start = clock();
min_five_elem();
finish = clock();
duration = (double)(finish - start)/ CLOCKS_PER_SEC;
printf("\n完成此程序所用的时间为:");
printf("%f\n",duration);
return 0;
}
#7
jacobkusch
2011-05-08 17:59
弱弱地说一下,只要最大三个数,擂台法扫一遍就可以了。
1