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实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序的更多相关文章

  1. 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法

    外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...

  2. 大数据去重(data deduplication)方案

    数据去重(data deduplication)是大数据领域司空见惯的问题了.除了统计UV等传统用法之外,去重的意义更在于消除不可靠数据源产生的脏数据--即重复上报数据或重复投递数据的影响,使计算产生 ...

  3. SAP ABAP将大数据量排序后输入到内表

    要向内表读入3百50万条数据,如果一次读入就会产生运行错误,错误提示为,没有内存对于扩展 内表. 我考虑使用SELECT...INTO TABLE...PACKAGE SIZE 和ENDSELECT来 ...

  4. mysql排序,可以对统计的数据进行排序

    sql SELECT a.*,b.name as address_name,b.tel as address_tel,b.province as address_province,b.city as ...

  5. java数组排序问题:array.sort()是从小到大排序,那么如何从大到小排序?

    别告诉我从i=a.length开始打印然后i--!因为数组没变啊,只是打印顺序变了.有木有啥别的方法,除了冒泡插入选择.. nteger [] array=new Integer[]{1,2,3,4, ...

  6. php 大数据量及海量数据处理算法总结

    下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题.下面的一些问题基本直接来源于公司的面试笔试题目, ...

  7. 大数据算法->推荐系统常用算法之基于内容的推荐系统算法

    港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...

  8. 大数据list去重

    MaxList模块主要是对Java集合大数据去重的相关介绍. 背景: 最近在项目中遇到了List集合中的数据要去重,大概一个2500万的数据,开始存储在List中,需要跟一个2万的List去去重. 直 ...

  9. List<Map>中根据map的同一指标项数据——去重代码

    先看网络上,博客经常出现的错误代码: for(ABatchAddCheckVO aBatchAddCheckVO : addList){ dto.put("aac001",aBat ...

随机推荐

  1. 解决okHttp使用https抛出stream was reset: PROTOCOL_ERROR的问题

    昨天在做Android接口调用的时候,api接口是https的,用okhttp抛出: okhttp3.internal.http2.StreamResetException: stream was r ...

  2. AJPFX关于this用法和注意事项

    this:代表对象.就是所在函数所属对象的引用.哪个对象调用了this所在的函数,this就代表哪个对象,就是哪个对象的引用.开发时在定义功能时,如果该功能内部使用到了调用该功能的对象,这时就用thi ...

  3. (六)SpringIoc之延时加载

    Spring容器初始化时将所有scope = singleton的bean进行实例化. 通常情况下这是一件好事,因为这样在配置中的错误会更容易发现.但是如果不想spring容器初始化就实例化就要用到延 ...

  4. C#枚举中的位运算权限分配

    什么是位运算 常用的位运算主要有与(&), 或(|)和非(~), 比如: & = ; | = ; ~ = ; 运用在权限设计中 先建立一个枚举表示所有的权限管理操作: [Flags] ...

  5. vue2.0 自定义指令详解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 1、QQ装机部落---腾讯软件

    亲,赚钱快人一步,我给你推荐QQ装机部落!大品牌,口碑好,知名软件,绿色无毒,每天结算,回报高!到这里注册:http://zjbl.qq.com/#/?invid=476058088 返利网邀请码立即 ...

  7. IE主页被恶意修改处理办法

    HKEY_USERS/.DEFAULT/Software/Policies/Microsoft/Internet Explorer/Control Panel 下的DWORD值“homepage”的键 ...

  8. win7电脑桌面壁纸曝光过高影响图标怎么办?亲测实用解决方法

    现在用win7系统的人应该还是挺多的吧,虽然说windows家族已经升级到现在的win11了,相信大多数人家用的电脑系统还是win7吧,今天要讲的是一个壁纸曝光度过高的解决办法,虽然还不清楚为什么,但 ...

  9. codeforces_B. Forgery

    http://codeforces.com/contest/1059/problem/B 题意: For simplicity, the signature is represented as an  ...

  10. JavaSE-18 常用工具类

    学习要点 Object类 枚举 包装类 Math类 Random类 字符串处理 日期时间 Object类 1  什么是Object类 Object类存储在java.lang包中,是所有java类(Ob ...