【算法比赛】在一亿个数中寻找出现频率最多的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
均可
输出样例:
Zswang_0 开始运行5648857691共耗时1141毫秒
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; } }}
// 作者_版本 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
[解决办法]
// 计算每个数据出现的次数 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
[解决办法]
来个简洁版的...性能嘛,最好不要用大数据量测试,你会绝望的...内存占用嘛,是非常可怕的,你会崩溃的...小数据量则只低那么一点点,可以接受...
好吧,我承认我是来捣乱的...
static int[] vrhero_0(int[] data, int len){ return data.GroupBy(d => d).OrderByDescending(r => r.Count()).Take(len).Select(r => r.Key).ToArray();}
[解决办法]