看了博客园里一篇文章《一道腾讯前端试题,谁来试试身手》,正好以前了解过位图法,确实不错。位图法适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在,如可标记1为存在,0为不存在。

  位图法网上资料比较少,我在百度百科找到了对它的描述

位图法比较适合于如下这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数,遇到几就给新数组的第几位置上1,如遇到 5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在着重复。这种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法。它的运算次数最坏的情况为2N。如果已知数组的最大值即能事先给新数组定长的话效率还能提高一倍。

  效率测试(参考一道腾讯前端试题,谁来试试身手):

  传统的双重循环查找也是可取的,但效率实在不敢恭维,特别是处理大量数据时候

  

 class Program{static void Main(string[] args){//产生随机数int[] array = Enumerable.Range(1, 100000).OrderBy
(n => Guid.NewGuid()).Take(80000).ToArray();DateTime dt1 = DateTime.Now;int max = array[0];int flag;//数组无序排列,查找最大值for (int i = 1; i < array.Length; i++){if (array[i] > max){max = array[i];}}for (int i = 1; i <= max; i++){flag = 1;for (int j = 0; j < array.Length; j++){//相等标记Flag=0,意味着不是缺少的数字if (i.Equals(array[j])){flag = 0;break;}}if (flag == 1){Console.Write("{0},", i);}}DateTime dt2 = DateTime.Now;TimeSpan ts = dt2 - dt1;Console.WriteLine("\r\n" + "共耗时间{0}ms", ts.TotalMilliseconds);//52730.5525
            Console.ReadKey();}}

测试结果:数据量小时,还OK,数据量大的情况下,显示很卡很缓慢,最坏的时间复杂度:T(n)=O(n*n)

以上测试,总时间约为:51291.2996MS

位图法测试

  class Program{static void Main(string[] args){//随即产生80000个不重复数int[] array = Enumerable.Range(1, 100000).OrderBy
(n => Guid.NewGuid()).Take(80000).ToArray();//int[] array={1,2,3,5,7,9,10,12,45,62,55,78,98,52,12,4,200,60,63,65,66,67,68,69,70,74,79,80,82,89,90,91,92,93,94,98,100,101};DateTime dt1=DateTime.Now;//找出最大值int max=array[0];for (int i = 1; i < array.Length; i++){if (array[i]>max){max = array[i];}}//新数组的长度为旧数组最大数字+1int[] lose=new int[max+1];foreach (int item in array){//若Item为2,则Lose[2]=1...所以新数组的长度为旧数组最大数字+1lose[item] = 1;}//那么为0的就是缺少值for (int i = 1; i < lose.Length; i++)//100
            {if (lose[i].Equals(0)){Console.Write("{0},",i);}}DateTime dt2=DateTime.Now;Console.WriteLine("\r\n"+(dt2-dt1).TotalMilliseconds);//6004.3379Ms
            Console.ReadKey();}}

位图法在确定最大数值后的时间复杂度还是挺乐观的,最坏情况:T(n)=O(2n)

屏幕飞快的刷新着,测试时间约是:6295.3601MS

总结

判断集合中是否存在重复元素或者查找缺失元素是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可,位图法Bitmap可以考虑。。

转载于:https://www.cnblogs.com/OceanEyes/archive/2012/07/12/bitmap_test.html

浪客剑心:位图法Bitmap算法分析相关推荐

  1. 海量数据处理——位图法bitmap

    海量数据处理--位图法bitmap 一.定义        位图法就是bitmap的缩写.所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个 ...

  2. redis位图法bitmap统计活跃用户

    位图法 位图(bitmap),就是用位(bit)来表示存放的某种状态,如开关,有无.在redis中,字符串是以二进制的形式存储的,因此位图在redis中并不是一种数据类型,而是一种字符串的表现形式.位 ...

  3. 位图法:判断一个数是否在40亿个整数中?

    微信搜索[程序员囧辉],关注这个坚持分享技术干货的程序员. 题目 最近看到一个题目:给40亿个不重复的 unsigned int 的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个 ...

  4. java 位图法_位图法对大量整数进行排序

    问题 输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7.如果在输入文件中有任何正数重复出现就是致命错误.没有其他数据与该正数相关联. 输出:按升序排列的输入整数的列表. 约束:最多 ...

  5. Java 位图法排序

    java JDK里面容器类的排序算法使用的主要是插入排序和归并排序,可能不同版本的实现有所不同,关键代码如下: /*** Performs a sort on the section of the a ...

  6. java位图_Java 位图法排序的使用方法

    java JDK里面容器类的排序算法使用的主要是插入排序和归并排序,可能不同版本的实现有所不同,关键代码如下: /** * Performs a sort on the section of the ...

  7. 算法设计与分析——位图(BitMap)

    分类目录:<算法设计与分析>总目录 相关文章: · 位图(BitMap) · 布隆过滤器(Bloom Filter) 位图(Bitmap),即位(Bit)的集合,可用于记录大量的 0 / ...

  8. Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.转换位图的像素色彩 给图片添加装饰物,只是在局部变换,如果想让图片一边保持轮廓一边改变色彩,就要深入图像的每个像素点,将这些像素点统统采取某种算法 ...

  9. Oracle创建索引bitmap,Oracle编程高手箴言:位图索引(Bitmap Index)的故事

    Oracle编程高手箴言:位图索引(Bitmap Index)的故事 您如果熟悉Oracle数据库,我想您对Thomas Kyte的大名一定不会陌生.Tomas主持的asktom.oracle.com ...

最新文章

  1. 设置Squid Cache_mem大小
  2. openstack 同一网络 多个subnet
  3. 番茄花园 Ghost XP SP3 金秋国庆版 2013.AA0
  4. 010_AOPXml方式开发
  5. Python Django HttpResponse响应json数据
  6. Java 运行时数据区域
  7. 15-07-10 结构体-输入学生成绩进行排序
  8. flume简介(大数据技术)
  9. android文件系统只读,android
  10. groovy 和 java的区别_Groovy和JAVA的区别
  11. 深度学习入行门槛太低,不开心!
  12. java websocket
  13. WebLogic下部署war包
  14. 文件/目录权限设置命令:chmod
  15. C++之调用C的so
  16. 基于 Arduino 的 RFID 识别实验
  17. 计算机一级演示文稿知识点,计算机一级考试ppt演示文稿及上网题考点
  18. matlab:双或三方演化博弈,lotka-Volterra 1.双方演化博弈:代分析稳定点分析,代绘制相位图,matlab仿真图代码
  19. 《如何高效学习》总结
  20. MySQL架构 数据库(1)

热门文章

  1. 1至9填入九个方框内_防水涂料和施工堵漏的“五大技巧”和“九个细节”
  2. oracle trace 文件名,限制oracle trace 文件大小
  3. pc端html轮播带滑块,swiper.js简单快速实现轮播滑动(兼容PC端、移动端)
  4. java jframe添加面板_JFrame添加组件的两种方式
  5. 看这玩意复习你还会挂科?《网络原理篇》
  6. leetcode45 跳跃游戏II 秒杀所有答案
  7. 如何在博客内添加音乐
  8. C语言多个变量运算存储过程,postgresql函数中的赋值运算和postgresql函数存储过程实现数据批量插入...
  9. django框架学习文档_Python四大主流网络编程框架,你知道么?
  10. Ubuntu安装Google浏览器