首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

【算法比赛】在一亿个数中寻找出现频率最多的4个。该怎么处理

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

【算法比赛】在一亿个数中寻找出现频率最多的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 开始运行5648857691共耗时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
------解决方案--------------------


如果Max就是1000,LZ给的方法基本上是性能的极限了,如果Max 为2^30以上,还有些优化的可能。
[解决办法]
标记下!看楼下精彩回复!
[解决办法]
计算机速度不一样对结果会有影响的,如何评判?
[解决办法]
关注下。。
[解决办法]
来学习。。。加油!
[解决办法]
这算发有趣,回去研究一下!!帮定
[解决办法]
伪代码:
print "你说那些数字是出现频率最高的?"

input a
input b
input c
input d

print "好吧我相信你"
print a
print b
print c
print d

print "我输出的对吗?Y/N"
input YorN
if YorN == 'Y' || YorN == 'y'
print "哈哈, 我聪明吧?"
else if YorN == 'N' || YorN == 'n'
print "日, 和我无关, 显然是你骗我!"
else
print "笨蛋, 说了Y或者N了。"
[解决办法]
第一次见 学习了
[解决办法]
哎,,顶起来 让大家一起看看 顺便接分
[解决办法]
规定了数组的值的上限了这就是最快的算法了
[解决办法]
Mark
[解决办法]
所说的性能指的是什么呢?只是时间?还是综合的?
[解决办法]
学习学习啊!!!
[解决办法]
伴水 你怎么把那么销魂的头像给换了。。。。。。。。。。
[解决办法]
ding!!!!!!!!!!!!!!!!!!
[解决办法]
咱把数值上线弄成int.Max吧
[解决办法]
值得关注!!!
逻辑思维强悍!!!
[解决办法]
多核机器算法会不一样。
[解决办法]
明天试试二分,折半
[解决办法]
mark,有空试试
[解决办法]
有空弄弄啊。学习一下
[解决办法]
我来 看看 呵呵 
学习的看看
[解决办法]
无奈,接分好了。没更好办法。
[解决办法]
中间占个位置.......
[解决办法]
mark....
[解决办法]
回家想想``` 明天来看答案```
[解决办法]
学习。
[解决办法]
仰望。。。
[解决办法]

探讨
推荐一下,让更多大虾小虾们看到,特别是litaoye 和 mathe 两位算法版的大牛。

------解决方案--------------------


幫頂,順便學習下..
[解决办法]
路过~~
[解决办法]
飘过!俺就看看
[解决办法]
值得研究。。。。
[解决办法]
呃……
小虾米漂到水面上才看见天空……
牛人好多……
[解决办法]
先看看 ,想想。。。。呵呵
[解决办法]
危险.. cpu直接挂了...
[解决办法]
难啊!
[解决办法]
除了象 ChrisAK 那样用多线程,恐怕很难提高速度了:

C# code
  //            作者_版本     static int[] Wuyi8808_0(int[] data, int len)  {    // 计算每个数据出现的次数    var dict = new int[max];    for (var i = 0; i < count; i++) dict[data[i]]++;    // 奇怪,这里如果改用下一行,速度反而更慢:    // foreach (var x in data) dict[x]++;    // 按出现的次数排序    var indexs = new int[max];    for (var i = 0; i < max; i++) indexs[i] = i; // 获得完整的序号    Array.Sort(dict, indexs); // 似乎这样就可以了,不过速度和伴水的是一样的    //*    for (var i = max - 1; i > max - 101; i--)    {      Console.WriteLine("{0,4}={1}", indexs[i], dict[i]);    }    //*/    var result = new int[len];    for (var i = 0; i < len; i++) result[i] = indexs[max-i-1]; // 输出    return result;  }
[解决办法]
顶顶顶顶的。
[解决办法]
支持一下
[解决办法]
1231111111111111111111111111111111111111
[解决办法]
探讨

危险.. cpu直接挂了...

[解决办法]
Pentium(R) Dual-Core CPU
E5300 @ 2.60GHz
2.61 GHz, 2.00 GB 的内存

Zswang_0 688毫秒
Wuyi8808_0 672毫秒
ChrisAK_0 593毫秒
[解决办法]
MARK
[解决办法]
粗看了题目,想了想还是我的老方法好用,数组下标作为计数值。

再仔细一看,NLGB,LZ的方法和我一样。
[解决办法]
C# code
            // 计算每个数据出现的次数            var dict = new int[max];            for (var i = 0; i < count / 2; i++)            {                dict[data[i]]++;                dict[data[count - i - 1]]++;            }            // 按出现的次数排序            var indexs = new int[max];            for (var i = 0; i < max/2; i++)            {                indexs[i] = i; // 获得完整的序号                indexs[max - i - 1] = max - i - 1;            }
[解决办法]
如果给定元素的范围,且范围不是很大的话,楼主的方法应该是最快的了
[解决办法]
学习了.
[解决办法]
mark
[解决办法]
来个简洁版的...性能嘛,最好不要用大数据量测试,你会绝望的...内存占用嘛,是非常可怕的,你会崩溃的...小数据量则只低那么一点点,可以接受...

好吧,我承认我是来捣乱的...
C# code
static int[] vrhero_0(int[] data, int len){    return data.GroupBy(d => d).OrderByDescending(r => r.Count()).Take(len).Select(r => r.Key).ToArray();} 


[解决办法]

探讨
C# code
// 作者_版本
static int[] ChrisAK_0(int[] data, int len)
{
// 计算每个数据出现的次数
int ncpu = Environment.ProcessorCount;
va……

[解决办法]
不会。
[解决办法]
我只能收藏了。哎。
[解决办法]
顶一下,看看什么反应,新贴啊。
[解决办法]
除了象 ChrisAK 那样用多线程,恐怕很难提高速度了:
C# code // 作者_版本
static int[] Wuyi8808_0(int[] data, int len)
{
// 计算每个数据出现的次数
var dict = new int[max];
for (var i = 0; i < count; i++) dict[data[i]]++;
// 奇怪,这里如果改用下一行,速度反而更慢:
// foreach (var x in data) dict[x]++;

// 按出现的次数排序
var indexs = new int[max];
for (var i = 0; i < max; i++) indexs[i] = i; // 获得完整的序号
Array.Sort(dict, indexs); // 似乎这样就可以了,不过速度和伴水的是一样的
//*
for (var i = max - 1; i > max - 101; i--)
{
Console.WriteLine("{0,4}={1}", indexs[i], dict[i]);
}
//*/
var result = new int[len];
for (var i = 0; i < len; i++) result[i] = indexs[max-i-1]; // 输出
return result;
}

[解决办法]
占个位
[解决办法]
作为菜鸟!
只能默默学习当中!

[解决办法]
10877801
[解决办法]
这个测试有啥用处呢 这只会加大计算机硬件的负荷啊

热点排行