BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序
BitMap利用byte特性 针对排序+去重 最佳实践: 100万条数据的排序+去重用时200毫秒左右
static void Main(string[] args)
{
int[] data = new int[];
/*alias*/
Random r = new Random();
for (int i = ; i < data.Length; i++)
{
data[i] = r.Next(, );
}
Stopwatch stop = new Stopwatch();
stop.Start();
List<byte> lstbyte = new List<byte>();
foreach (var item in data)
{
int unit = item / ;
int index = item % ;
if (lstbyte.Count <= unit)
{
lstbyte.AddRange(new byte[unit-lstbyte.Count + ]);
}
lstbyte[unit] = set_bit(lstbyte[unit], index + , true);
}
List<int> result = new List<int>();
for (int i = ; i < lstbyte.Count; i++)
{
int currentIndex = i*;
List<int> lstint = new List<int>();
if (lstbyte[i] > )
{
/**
* 这段代码用于判断,byte对应位置的值是否有1
* 例如: 目标 byte:0010 0001
* 0010 0001 & 0000 0001 结果为1则 第一位为1
* 第二位比较方式就是目标byte和 0010 0001 & 0000 0010
* 为避免频繁的装箱拆箱操作,这里不用通过 Math.Pow计算平2的平方立方来得到目标比较数。
*/
int b = lstbyte[i] & 0x01;
if (b == )
{
lstint.Add(currentIndex+);
}
b = lstbyte[i] & 0x02;
if (b == )
{
lstint.Add(currentIndex + );
}
b = lstbyte[i] & 0x04;
if (b == )
{
lstint.Add(currentIndex + );
}
b = lstbyte[i] & 0x08;
if (b == )
{
lstint.Add(currentIndex + );
}
b = lstbyte[i] & 0x10;
if (b == )
{
lstint.Add(currentIndex + );
}
b = lstbyte[i] & 0x20;
if (b == )
{
lstint.Add(currentIndex + );
}
b = lstbyte[i] & 0x40;
if (b == )
{
lstint.Add(currentIndex + );
}
b = lstbyte[i] & 0x80;
if (b == )
{
lstint.Add(currentIndex + );
}
}
result.AddRange(lstint);
}
stop.Stop();
Console.WriteLine("结果数:"+result.Count);
//foreach (var item in result)
//{
// Console.WriteLine(item);
//}
Console.WriteLine(string.Concat("时间:" ,stop.ElapsedMilliseconds ,"毫秒"));
Console.ReadKey();
}
/// <summary>
/// 设置某一位的值
/// </summary>
/// <param name="data"></param>
/// <param name="index">要设置的位, 值从低到高为 1-8</param>
/// <param name="flag">要设置的值 true / false</param>
/// <returns></returns>
static byte set_bit(byte data, int index, bool flag)
{
if (index > || index < )
throw new ArgumentOutOfRangeException();
int v = index < ? index : ( << (index - ));
return flag ? (byte)(data | v) : (byte)(data & ~v);
}
运行速度和待排序去重的最大数的大小有关系
BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序的更多相关文章
- 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法
外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...
- 大数据去重(data deduplication)方案
数据去重(data deduplication)是大数据领域司空见惯的问题了.除了统计UV等传统用法之外,去重的意义更在于消除不可靠数据源产生的脏数据--即重复上报数据或重复投递数据的影响,使计算产生 ...
- SAP ABAP将大数据量排序后输入到内表
要向内表读入3百50万条数据,如果一次读入就会产生运行错误,错误提示为,没有内存对于扩展 内表. 我考虑使用SELECT...INTO TABLE...PACKAGE SIZE 和ENDSELECT来 ...
- mysql排序,可以对统计的数据进行排序
sql SELECT a.*,b.name as address_name,b.tel as address_tel,b.province as address_province,b.city as ...
- java数组排序问题:array.sort()是从小到大排序,那么如何从大到小排序?
别告诉我从i=a.length开始打印然后i--!因为数组没变啊,只是打印顺序变了.有木有啥别的方法,除了冒泡插入选择.. nteger [] array=new Integer[]{1,2,3,4, ...
- php 大数据量及海量数据处理算法总结
下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题.下面的一些问题基本直接来源于公司的面试笔试题目, ...
- 大数据算法->推荐系统常用算法之基于内容的推荐系统算法
港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...
- 大数据list去重
MaxList模块主要是对Java集合大数据去重的相关介绍. 背景: 最近在项目中遇到了List集合中的数据要去重,大概一个2500万的数据,开始存储在List中,需要跟一个2万的List去去重. 直 ...
- List<Map>中根据map的同一指标项数据——去重代码
先看网络上,博客经常出现的错误代码: for(ABatchAddCheckVO aBatchAddCheckVO : addList){ dto.put("aac001",aBat ...
随机推荐
- css3 transform + deviceorientation实现图片旋转效果
1. 陀螺仪deviceorientation的使用,参考<关于陀螺仪deviceorientation>https://segmentfault.com/a/11900000071838 ...
- Selenium--Python环境部署
本文引读:一二为python环境安装:三为selenium安装同时介绍了pip:四为PyCharm安装:五为验证SE可以正常使用 一.下载python安装包 我这里安装的是python3.6.5,官网 ...
- PHP自定义函数及内部函数考察点
变量的作用域和静态变量 变量的作用域 变量的作用域也称变量的范围,变量的范围即它定义的上下文背景(也是它的生效范围).大部分的PHP变量只有一个单独的范围.这个单独的范围跨度同样包含了include和 ...
- ubuntu18.04 frpc安装与自动启动
1. 下载, 解压 export FRP_VERSION='0.25.3' wget --no-check-certificate https://github.com/fatedier/frp/re ...
- April Fools Day Contest 2019: editorial回顾补题
A. Thanos Sort time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 【转】C# 二进制,十进制,十六进制 互转
//十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(6 ...
- 【VScode】使用VScode 来写markdown时序图
准备工作 在VScode中下载插件Markdown Preview Enhanced插件 创建一个.md文件 在VScode中打开文件,界面内点击右键可以看到Open preview to the s ...
- Linux C动态链接库实现一个插件例子
实现一个简单的计算动态链接库:升级动态链接库后,在不重新编译主程序的情况下,直接生效. lib库: #cat math.c #include <stdio.h> int add(int x ...
- PHP Web开发入门流程
在学习WEB开发前,至少有一个对C或者计算机编程任何一种语言的基本学习,这会对你以后的开发有一定的启蒙作用. 一.Web开发入门 推荐学习网址: http://www.w3school.com.cn/ ...
- P2347 砝码称重(动态规划递推,背包,洛谷)
题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,10 ...