浪客剑心:位图法Bitmap算法分析

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GoogLeNet结构

Inception V1 GoogLeNet结构&#xff08;Inception V1&#xff09; 输入为224x224的RGB图像&#xff0c;‘#3x3 reduce’和‘#5x5 reduce’表示3x3和5x5卷积之前1x1的卷积核的个数。 转载于:https://www.cnblogs.com/Peyton-Li/p/11201038.html

uboot的移植——移植三星官方的uboot到x210开发板

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、移植总结 二、移植过程 1、获取三星官方版本的uboot &#xff08;1&#xff09;由于X210开发板使用S5PV210这款CPU&#xff0c;因此我们应该寻找一块使用相同CPU的开发板&#xff0c;然后以这块…

Hadoop 文件命令

为什么80%的码农都做不了架构师&#xff1f;>>> * 文件操作 * 查看目录文件 * $ hadoop dfs -ls /user/cl * * 创建文件目录 * $ hadoop dfs -mkdir /user/cl/temp * * 删除文件 * $ hadoop dfs -rm /user/cl/temp/a.txt * * 删除目录与目录下所有文件 …

Swans and ducks, Piešťany, Slovakia

What Makes This a Photo of the Day? I love the slightly off-kilter composition here, with the cluster of birds near the bottom of the frame. This gives a sense of movement and allows the eye to take in the peripheral elements—the ripples of the water and…

python day15

今日内容 昨日内容补充: 对于两个文件中的互相导入md模块问题分析: x 1from md import xprint(x)# md中的xfrom md import xx 1000print(x)# 当前文件中的x __all__ 列表写什么,执行导入语句那个文件就能拿到什么; __all__不写的情况,默认是将所在文件所有的名字都暴露给导入…

如何有效抓取SQL Server的BLOCKING信息

2019独角兽企业重金招聘Python工程师标准>>> SQL Server允许并发操作&#xff0c;BLOCKING是指在某一操作没有完成之前&#xff0c;其他操作必须等待&#xff0c;以便于保证数据的完整性。BLOCKING的解决方法要查看BLOCKING的头是什么&#xff0c;为什么BLOCKING头上…

iOS开发篇——OC 协议和代理设计模式介绍

蓝鸥iOS培训讲师推荐&#xff1a;好久没和大家沟通了&#xff0c;没和大家沟通了&#xff0c;今天就和大家说说有关OC内容协议和代理设计模式。首先要讲的是协议一、协议OC中的协议和接口有些相似&#xff0c;协议中定义的方法&#xff0c;在类中实现。协议一般情况下是用来实现…

uboot的移植——移植uboot官方的uboot到x210开发板

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 uboot——官网下载直接移植(一) - biaohc - 博客园 uboot——官网下载直接移植(二) - biaohc - 博客园 uboot移植&#xff08;一&#xff09;配置过程分析_LouisGou的博客-CSDN博客 获取…

[转载]使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)...

前言 本章将实现非常实用的功能——下载在线视频。涉及到多线程、线程更新UI等技术&#xff0c;还需思考产品的设计&#xff0c;如何将新加的功能更好的融入到现有的产品中&#xff0c;并不是简单的加一个界面就行了&#xff0c;欢迎大家交流产品设计和技术细节实现&#xff01…

Hibernate上路_16-继承关系映射

2019独角兽企业重金招聘Python工程师标准>>> 例&#xff1a;员工Employee分为正式工SalaryEmployee和临时工HourEmployee。子类表的字段都不能使用非空约束。 1.三种继承关系的建表方式&#xff1a; 1&#xff09;父类、子类在同一张表&#xff0c;表中有“辨别者…

C++起航篇——bool类型,输入输出,命名空间

以下内容源于慕课网http://www.imooc.com/course/list?ccplusplus的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 慕课网学习内容 一、起航 二、离航 三、远征 封装继承多态模板 1、c的新特征 &#xff08;1&#xff09;新数据类型 bool &#xff08;true和fals…

C++离航篇——引用,const

以下内容源于http://www.imooc.com/learn/381的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、引用 &#xff08;1&#xff09;引用即定义别名 对引用进行操作即对本身操作&#xff1b;int a10; int &ba; //定义了a的别名b&#xff1b;注意别名是不包括&…

【广搜】棋盘游戏

题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋&#xff0c;当且仅当两个格子有公共边&#xff0c;这两个格子上的棋是相邻的。移动棋子的规则是交换相邻两个棋子。现在给出一个初始棋盘和一个最终棋盘&#xff0c;要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。Klux说…

C++离航篇——函数默认参数、函数重载、内敛函数

1、函数的默认参数 2、函数的重载 &#xff08;1&#xff09;在相同的作用域内&#xff0c;用同一个函数名定义的多个函数&#xff0c;其中每个函数的参数个数、参数类型不同。 3、内联函数 &#xff08;1&#xff09;编译的时候&#xff0c;将函数体代码和相应的实参直接在函…

C++离航篇——内存的申请释放

1、内存的申请和释放 使用关键字new&#xff0c;紧接申请的类型&#xff0c;以及用中括号标明申请多大的内存空间。 2、内存的初始化 注意和块内存申请不同&#xff0c;初始化是&#xff08;&#xff09;&#xff0c;块内存是[ ]。

C++远征之封装篇——类和封装、实例化和对象成员访问

一、封装篇的学习内容数据成员 成员函数构造函数 析构函数对象复制 对象赋值对象数组 对象指针this指针二、类与封装三、实例化和对象成员访问&#xff08;1&#xff09;从栈中实例化对象&#xff08;2&#xff09;从堆中实例化对象 &#xff08;3&#xff09;对象成员的访…

C++远征之封装篇——字符串类型

一、c中的字符串操作函数 二、字符串类型string 1、c中没有字符串类型&#xff0c;只有字符类型 因此对于字符串的操作&#xff0c;一般是用上面的函数来操作。 2、字符串的初始化 3、字符串相关的操作

C++远航之封装篇——数据的封装

以对象为中心&#xff0c;具体来说&#xff0c;以谁做什么来代表程序的逻辑。所有操作都通过调用自己的函数来完成。 数据成员暴露了&#xff0c;不好的设计&#xff1a; 数据的封装&#xff1a;

游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2

老少爷们儿反击战 上一篇中 我们的女仆终于可以做一些像阳光下其他人一样的事情了&#xff0c;少爷们可以和女仆酱一起参加下午茶~ 难得的上流社会啊 这是永远1v1被人私有的女奴 和 喝茶时被人共有的女仆酱最明显的差异~ 明媚的午后阳光下&#xff0c;庭院里白色长餐桌两旁&am…