| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1145 人关注过本帖
标题:今天去参加笔试的一个算法题
只看楼主 加入收藏
myseemylife
Rank: 2
等 级:论坛游民
帖 子:100
专家分:58
注 册:2009-3-22
结帖率:91.67%
收藏
已结贴  问题点数:20 回复次数:6 
今天去参加笔试的一个算法题
给你N个数(百万级的)。求出最大三个数,要有效率(重点),大家看一看
搜索更多相关主题的帖子: 笔试 
2011-03-24 19:10
LSYHEFENG
Rank: 2
等 级:论坛游民
帖 子:112
专家分:71
注 册:2010-7-17
收藏
得分:0 
用哈希,时间属于线性的
2011-03-24 20:05
buffer
Rank: 5Rank: 5
等 级:职业侠客
帖 子:73
专家分:326
注 册:2010-12-31
收藏
得分:5 
(1)把前K个数初始化为一个最小堆
(2)从第K+1个数开始,与堆顶元素比较,如果大于堆顶元素,就用这个数替换堆顶,调整堆;否则,比较下一个数
最后这个最小堆里的元素就是最大的K个数,时间复杂度O(n*logK),空间复杂度O(K)
这里K=3,所以时间复杂度基本就是线性的了:)
2011-03-24 20:09
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
额,前几天我也纠结过一类似的问题,顶一个
2011-03-24 20:18
xiepanqi
Rank: 2
等 级:论坛游民
帖 子:43
专家分:55
注 册:2009-10-24
收藏
得分:0 
最好哈希
次点就二叉查找树
2011-03-26 15:48
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:15 
#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;
}
2011-03-26 22:50
jacobkusch
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-5-8
收藏
得分:0 
弱弱地说一下,只要最大三个数,擂台法扫一遍就可以了。
2011-05-08 17:59
快速回复:今天去参加笔试的一个算法题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047079 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved