注册 登录
编程论坛 数据结构与算法

今天去参加笔试的一个算法题

myseemylife 发布于 2011-03-24 19:10, 1145 次点击
给你N个数(百万级的)。求出最大三个数,要有效率(重点),大家看一看
6 回复
#2
LSYHEFENG2011-03-24 20:05
用哈希,时间属于线性的
#3
buffer2011-03-24 20:09
(1)把前K个数初始化为一个最小堆
(2)从第K+1个数开始,与堆顶元素比较,如果大于堆顶元素,就用这个数替换堆顶,调整堆;否则,比较下一个数
最后这个最小堆里的元素就是最大的K个数,时间复杂度O(n*logK),空间复杂度O(K)
这里K=3,所以时间复杂度基本就是线性的了:)
#4
世界模型2011-03-24 20:18
额,前几天我也纠结过一类似的问题,顶一个
#5
xiepanqi2011-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
jacobkusch2011-05-08 17:59
弱弱地说一下,只要最大三个数,擂台法扫一遍就可以了。
1