日期:2014-05-20  浏览次数:20806 次

【算法比赛】在一亿个数中寻找出现频率最多的4个。
性能最高者奖励150分专家分+1000可用分,其余酌情散掉。

需求:寻找数组中出现频率最多的4个数
数字=出现次数
56=101024
488=100892
576=100879
91=100857
247=100820
160=100811
323=100789
213=100762
417=100756
363=100754

特殊情况
出现并列任意抽取即可
463=16
979=13
168=13
88=12
694=12
709=12
691=11

即输出:
463
979
168
88

463
979
168
709
均可

输出样例:
Assembly code
Zswang_0 开始运行
56
488
576
91
共耗时1141毫秒



测试代码:
C# code
using System;

namespace ConsoleApplication1
{
    class Program
    {
        const int max = 1000; // 最大取值范围
        //const int count = 5000; // 小数据量
        const int count = 100000000; // 数据量
        const int resultLen = 4; // 返回长度

        static void Main(string[] args)
        {
            var random = new Random(2010); // 固定随机种子,确保大家测试数据一致
            var data = new int[count];
            #region 生成测试数据,不在性能计算之内
            for (var i = 0; i < count; i++) data[i] = random.Next(max);
            #endregion 生成测试数据

            #region 计算性能
            Console.WriteLine("Zswang_0 开始运行");
            var tick = Environment.TickCount;
            foreach (var i in Zswang_0(data, 4))
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("共耗时{0}毫秒", Environment.TickCount - tick);
            #endregion

            Console.ReadKey();
        }

        //             作者_版本   
        static int[] Zswang_0(int[] data, int len)
        {
            // 计算每个数据出现的次数
            var dict = new int[max];
            for (var i = 0; i < count; i++) dict[data[i]]++;

            // 按出现的次数排序
            var indexs = new int[max];
            for (var i = 0; i < max; i++) indexs[i] = i; // 获得完整的序号
            Array.Sort(indexs, delegate(int a, int b)
            {
                return dict[b] - dict[a];
            });
            /*
            for (var i = 0; i < 100; i++)
            {
                Console.WriteLine("{0}={1}", indexs[i], dict[indexs[i]]);
            }
            //*/
            var result = new int[len];
            for (var i = 0; i < len; i++) result[i] = indexs[i]; // 输出
            return result;
        }
    }
}



------解决方案--------------------
占个位吧
这太难了。对我来说
------解决方案--------------------
mark 蹭分吧
------解决方案--------------------
mark
------解决方案--------------------
mark
------解决方案--------------------
性能最高是什么意思???根据什么来衡量???

完全根据所用的时间?不考虑内存的使用?
------解决方案--------------------
前排就座晚上回去写个,试下
------解决方案--------------------

------解决方案--------------------
我还是看看吧
------解决方案--------------------
传说中的第一页。。。
------解决方案--------------------
路过回帖,帮顶。
------解决方案--------------------
mark
------解决方案--------------------
MARK
------解决方案--------------------