【整理】在一亿个数中寻找出现频率最多的4个 <转>

简介:

本文中所有算法均搜集于网络,在此感谢各位大师的无私奉献。

主函数:

复制代码

  
  
1 const int max = 1000 ; // 最大取值范围
2 // const int count = 5000; // 小数据量
3   const int count = 100000000 ; // 数据量
4   const int resultLen = 4 ; // 返回长度
5  
6 static void Main( string [] args)
7 {
8 var random = new Random( 2010 ); // 固定随机种子,确保大家测试数据一致
9   var data = new int [count];
10 #region 生成测试数据,不在性能计算之内
11 for (var i = 0 ; i < count; i ++ ) data[i] = random.Next(max);
12 #endregion 生成测试数据
13
14 #region 计算性能
15 Console.WriteLine( " Zswang_0 开始运行 " );
16 var tick = Environment.TickCount;
17 foreach (var i in Zswang_0(data, 4 ))
18 {
19 Console.WriteLine(i);
20 }
21 Console.WriteLine( " 共耗时{0}毫秒 " , Environment.TickCount - tick);
22 #endregion
23
24 Console.ReadKey();
25 }
26  
复制代码

 

算法一:

复制代码

  
  
1 static int [] Zswang_0( int [] data, int len)
2 {
3 // 计算每个数据出现的次数
4   var dict = new int [max];
5 for (var i = 0 ; i < count; i ++ ) dict[data[i]] ++ ;
6
7 // 按出现的次数排序
8   var indexs = new int [max];
9 for (var i = 0 ; i < max; i ++ ) indexs[i] = i; // 获得完整的序号
10 Array.Sort(indexs, delegate ( int a, int b)
11 {
12 return dict[b] - dict[a];
13 });
14 /*
15 for (var i = 0; i < 100; i++)
16 {
17 Console.WriteLine("{0}={1}", indexs[i], dict[indexs[i]]);
18 }
19 // */
20 var result = new int [len];
21 for (var i = 0 ; i < len; i ++ ) result[i] = indexs[i]; // 输出
22 return result;
23 }
24
复制代码

运行结果如下:

 

算法二:

复制代码

  
  
1 static int [] ChrisAK_0( int [] data, int len)
2 {
3 // 计算每个数据出现的次数
4 int ncpu = Environment.ProcessorCount;
5 var dict = new int [ncpu][];
6 int part = count / ncpu;
7 if (ncpu > 1 )
8 {
9 Thread[] threads = new Thread[ncpu - 1 ]; // 每个cpu分配一个线程
10 for (var i = 1 ; i < ncpu; ++ i)
11 {
12 dict[i] = new int [max]; // 分配线程用的计数器
13 var th = new Thread((baseidx) =>
14 {
15 int bidx = ( int )baseidx;
16 int start = bidx * part;
17 int end = start + part;
18 for (var j = bidx * part; j < end; j ++ )
19 {
20 ++ dict[bidx][data[j]];
21 }
22 });
23 th.Start(i);
24 threads[i - 1 ] = th;
25 }
26 dict[ 0 ] = new int [max]; // 主线程开始计算自己的部分
27 for (var i = 0 ; i < part; i ++ )
28 {
29 dict[ 0 ][data[i]] ++ ;
30 }
31 for (var i = 1 ; i < ncpu; ++ i) // 等待其它线程结束
32 threads[i - 1 ].Join();
33 for (var i = 0 ; i < max; ++ i) // 合并结果
34 {
35 int sum = 0 ;
36 for (var j = 1 ; j < ncpu; ++ j)
37 sum += dict[j][i];
38 dict[ 0 ][i] += sum;
39 }
40 for ( int i = ncpu * part; i < count; ++ i) // 处理某些CPU内核个数无法整除的情况
41 dict[ 0 ][ 1 ] ++ ;
42 }
43 else
44 {
45 for (var i = 0 ; i < part; i ++ ) // 单线程的情况.
46 {
47 dict[ 0 ][data[i]] ++ ;
48 }
49 }
50 // 按出现的次数排序
51 var indexs = new int [max];
52 for (var i = 0 ; i < max; i ++ ) indexs[i] = i; // 获得完整的序号
53 Array.Sort(indexs, delegate ( int a, int b)
54 {
55 return dict[ 0 ][b] - dict[ 0 ][a];
56 });
57 for (var i = 0 ; i < 50 ; i ++ )
58 {
59 Console.WriteLine( " {0}={1} " , indexs[i], dict[ 0 ][indexs[i]]);
60 }
61 var result = new int [len];
62 for (var i = 0 ; i < len; i ++ ) result[i] = indexs[i]; // 输出
63 return result;
64 }
65
复制代码

运行结果如下:

 

算法三:

复制代码

  
  
1 static int [] Wuyi8808_0( int [] data, int len)
2 {
3 // 计算每个数据出现的次数
4 var dict = new int [max];
5 for (var i = 0 ; i < count; i ++ ) dict[data[i]] ++ ;
6 // 奇怪,这里如果改用下一行,速度反而更慢:
7 // foreach (var x in data) dict[x]++;
8
9 // 按出现的次数排序
10 var indexs = new int [max];
11 for (var i = 0 ; i < max; i ++ ) indexs[i] = i; // 获得完整的序号
12 Array.Sort(dict, indexs); // 似乎这样就可以了,不过速度和伴水的是一样的
13 // *
14 for (var i = max - 1 ; i > max - 51 ; i -- )
15 {
16 Console.WriteLine( " {0,4}={1} " , indexs[i], dict[i]);
17 }
18 // */
19 var result = new int [len];
20 for (var i = 0 ; i < len; i ++ ) result[i] = indexs[max - i - 1 ]; // 输出
21 return result;
22 }
23
复制代码

运行结果如下:

 

算法四:

复制代码

  
  
1 static int [] sp1234_0( int [] data, int len)
2 {
3 var dict = new int [max];
4 for (var i = 0 ; i < count; i ++ ) dict[data[i]] ++ ;
5 var indexs = new int [max];
6 for (var i = 0 ; i < max; i ++ ) indexs[i] = i;
7 int f = 0 ;
8 int t = indexs.Length - 1 ;
9 int m;
10 loop:
11 m = partition(dict, indexs, f, t);
12 if (m == len)
13 {
14 var result = new int [len];
15 for (var i = 0 ; i < len; i ++ ) result[i] = indexs[i];
16 return result;
17 }
18 else if (m > len)
19 t = m - 1 ;
20 else
21 f = m + 1 ;
22 goto loop;
23 }
24
25 static int partition( int [] value, int [] data, int i, int j)
26 {
27 var x = i ++ ;
28 var y = value[data[x]];
29 int m;
30 begin:
31 while (i <= j && value[data[i]] >= y)
32 i ++ ;
33 while (j >= i && value[data[j]] <= y)
34 j -- ;
35 if (i > j)
36 {
37 m = data[x];
38 data[x] = data[j];
39 data[j] = m;
40 return j;
41 }
42
43 m = data[i];
44 data[i] = data[j];
45 data[j] = m;
46 i ++ ;
47 j -- ;
48 goto begin;
49 }
50
复制代码

运行结果如下:

 

算法五:

复制代码

  
  
1 static int [] Wuyi8808_1( int [] data, int len)
2 {
3 int [] dict = new int [max];
4 int [] indexs = new int [max];
5 int [] result = new int [len];
6 unsafe
7 {
8 fixed ( int * a = data, b = dict, c = indexs)
9 {
10 for ( int i = 0 ; i < count; i ++ ) b[a[i]] ++ ;
11 for ( int i = 0 ; i < max; i ++ ) c[i] = i;
12 Array.Sort(dict, indexs);
13 for ( int i = 0 ; i < len; i ++ ) result[i] = c[max - i - 1 ];
14 }
15 }
16 return result;
17 }
18
复制代码

运行结果如下:

 

算法六:

复制代码

  
  
1 struct set
2 {
3 public int count;
4 public int key;
5 }
6 static int [] LCL_0( int [] data, int len)
7 {
8 // 计算每个数据出现的次数
9 set [] dict = new set [max];
10
11 for ( int i = 0 ; i < count; i ++ )
12 {
13 dict[data[i]].count ++ ;
14 if (i < max) dict[i].key = i;
15 }
16
17 // 按出现的次数排序
18 Array.Sort(dict, delegate ( set a, set b)
19 {
20 return b.count - a.count;
21 });
22
23 int [] result = new int [len];
24 for ( int i = 0 ; i < len; i ++ ) result[i] = dict[i].key; // 输出
25 return result;
26 }
27
复制代码

运行结果如下:

 

算法七:

复制代码

  
  
1 static int [] Lihanbing_0( int [] data, int len)
2 {
3 // 计算每个数据出现的次数
4 int [] dict = new int [max];
5 for ( int i = 0 ; i < count; i ++ ) dict[data[i]] ++ ;
6
7 // 按出现的次数排序
8 int [] result = new int [len], resultcount = new int [len];
9 int tempResult = 0 , tempResult2 = 0 ;
10 int tempCount = 0 , tempCount2 = 0 ;
11 for ( int i = 0 ; i < max; i ++ )
12 {
13 tempCount = dict[i];
14 tempResult = i;
15 for ( int j = 0 ; j < len; j ++ )
16 {
17 if (tempCount <= resultcount[j])
18 continue ;
19 tempCount2 = resultcount[j];
20 tempResult2 = result[j];
21 resultcount[j] = tempCount;
22 result[j] = tempResult;
23 tempCount = tempCount2;
24 tempResult = tempResult2;
25
26 }
27 }
28 return result;
29 }
30
复制代码

运结结果如下:



本文转自温景良(Jason)博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2010/05/17/1737824.html,如需转载请自行联系原作者

相关文章
|
7月前
|
人工智能 自然语言处理 安全
技术人办活动不用慌,这个AI指令帮你搞定完整策划案
技术人办活动头疼?用AI指令轻松生成完整策划案!覆盖目标分析、流程设计、预算风控等八大模块,适配沙龙、发布会等多种场景。结合国产AI工具,30分钟搞定专业方案,助力开发者高效落地活动。
934 2
|
人工智能 自然语言处理 数据挖掘
2025国内有哪些呼叫中心系统值得推荐?
在数字化浪潮推动下,呼叫中心系统已成为企业客户服务的核心枢纽。通过全面智能化、多渠道融合、大数据与AI驱动的决策支持及云化与安全性等技术优势,呼叫中心系统实现了降本增效和客户体验提升。2025年,随着人工智能和云计算的深度渗透,呼叫中心将迎来新一轮升级。推荐几款高效系统:合力亿捷、中国移动、华为云、阿里云和百度语音解决方案,涵盖电商、金融、政府等多个领域,助力企业优化服务流程,提升竞争力。
924 13
|
人工智能 测试技术
Valley:字节跳动开源小体积的多模态模型,在小于 10B 参数的模型中排名第二
Valley 是字节跳动推出的多模态大模型,能够处理文本、图像和视频数据,在电子商务和短视频领域表现优异,并在 OpenCompass 测试中排名第二。
929 10
Valley:字节跳动开源小体积的多模态模型,在小于 10B 参数的模型中排名第二
|
SpringCloudAlibaba Dubbo Java
【SpringCloud Alibaba系列】Dubbo基础入门篇
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
【SpringCloud Alibaba系列】Dubbo基础入门篇
|
自然语言处理 算法 Ubuntu
GeneralUpdate应用程序自动升级跨平台解决方案,支持国产操作系统。
前些年随着技术的发展逐渐兴起“一次编码到处运行”、“国产化”的概念那么跨平台就是各大技术争相主推的能力之一。具备跨平台的能力同时也需要自动升级的能力,GeneralUpdate 随之应运而生。
552 11
|
SQL 监控 Oracle
【Oracle系列】- Oracle数据库更改数据文件位置
【Oracle系列】- Oracle数据库更改数据文件位置
462 0
|
网络协议 安全 网络虚拟化
思科交换机配置命令归纳
【11月更文挑战第8天】本文总结了思科交换机的常见配置命令,包括模式转换、基本配置、查看命令、VLAN 配置、Trunk 配置、以太网通道配置、VTP 配置、三层交换机配置、生成树配置以及其他常用命令,适用于网络管理和维护。
1766 2
|
机器学习/深度学习 编解码 定位技术
【小样本图像分割-2】UniverSeg: Universal Medical Image Segmentation
UniverSeg是一种用于医学图像分割的小样本学习方法,通过大量医学图像数据集的训练,实现了对未见过的解剖结构和任务的泛化能力。该方法引入了CrossBlock机制,以支持集和查询集之间的特征交互为核心,显著提升了分割精度。实验结果显示,UniverSeg在多种任务上优于现有方法,特别是在任务多样性和支持集多样性方面表现出色。未来,该方法有望扩展到3D模型和多标签分割,进一步提高医学图像处理的灵活性和效率。
588 0
【小样本图像分割-2】UniverSeg: Universal Medical Image Segmentation
|
移动开发 前端开发 JavaScript
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
24925 3
Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战
|
安全 应用服务中间件 Shell
nginx配置https的ssl证书和域名
nginx配置https的ssl证书和域名