范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

位图排序算法实践

  一.算法介绍
  排序算法是计算机专业必学的内容,教科书里介绍的像冒泡排序,插入排序,Shell排序,堆排序,快速排序等几种经典的排序算法,其中快速排序最为推荐和广为人知,其采用二分分组递归的方式,对数据巧妙而快速的排序,平均性能复杂度为N*LogN,商用的代码库一般会使用快速排序(由于其最差性能复杂度为N*N,像STL库里面的排序算法会结合插入排序和堆排序,使其最差性能复杂度也能达到NLogN)。但是除了这些教科书里面的算法,有没有其它的排序算法,排序算法的时间复杂度能不能突破理论上的极限N*LogN呢?
  经典的《编程珠玑》一书里对于长度在一定范围的不重复数字序列,介绍一款非常巧妙的算法 -位图排序 ,其时间复杂度达到惊人的 N, 很多了解通用排序算法的读者,听到的第一反应可能是大呼"怎么可能!"
  且看位图排序算法的实践逻辑如下:
  1)第一步:申请一个长度超过最大数字的数组,
  2)第二步:遍历数字序列,以数字作为索引,将数组对应的值赋值为1.
  3)第三步:遍历数组,打印值为1的数组索引值
  这个算法直接打破常规思维,唤山不来,向山走去,利用空间换取时间,使算法复杂度达到了不可思议的 N, 简单至极而又巧妙至极! 二.编程实践
  "纸上得来终觉浅,绝知此事要躬行",位图排序的实际效果到底如何,笔者开发了一个demo来验证一下,代码中使用Java的里面的位操作来实现位图存储,以节约了存储空间,另外和快排排序算法进行了性能比较,代码如下: public static void main(String[] args) {     final int MAX = 1000000000; //数字最大值     final int COUNT = 300000000;//数字个数          System.out.println("排序个数:" + COUNT);     int[] ints = getRandomData(COUNT, MAX);     long start = System.currentTimeMillis();     start = System.currentTimeMillis();     ints = getRandomData(COUNT, MAX);     start = System.currentTimeMillis();     quickSort(ints);     System.out.println("快速排序时间:" + (System.currentTimeMillis() - start));          ints = getRandomData(COUNT, MAX);     start = System.currentTimeMillis();     byte[] bytes = bitmapSort(ints, MAX);     System.out.println("位图排序1时间:" + (System.currentTimeMillis() - start)); }  // 产生最大为值max,数量为count的数字 private static int[] getRandomData(int count, int max) {     int[] ints = new int[count];     for (int i = 0; i < count; i++) {         int ran = (int) (Math.random() * max);         //System.out.print(ran + " ");         ints[i] = ran;     }     return ints; }  // 位图排序法1,无法处理重复数据 private static byte[] bitmapSort(int[] array, int max) {     final int len = (int) Math.ceil(max / 8.0);     byte[] bytes = new byte[len];     for (int i = 0; i < array.length; i++) {         int j = array[i] >> 3;         int k = array[i] % 8;         bytes[j] = setByte(bytes[j], k);     }     return bytes; }  // 将字节b第i位置1 public static Byte setByte(byte b, int i) {     b |= 0x01 << i;     return b; }  /**  * 快速排序  *  * @param array  */ public static void quickSort(int[] array) {     int len;     if (array == null             || (len = array.length) == 0             || len == 1) {         return;     }     sort(array, 0, len - 1); }  /**  * 快排核心算法,递归实现  *  * @param array  * @param left  * @param right  */ public static void sort(int[] array, int left, int right) {     if (left > right) {         return;     }     // base中存放基准数     int base = array[left];     int i = left, j = right;     while (i != j) {         // 顺序很重要,先从右边开始往左找,直到找到比base值小的数         while (array[j] >= base && i < j) {             j--;         }          // 再从左往右边找,直到找到比base值大的数         while (array[i] <= base && i < j) {             i++;         }          // 上面的循环结束表示找到了位置或者(i>=j)了,交换两个数在数组中的位置         if (i < j) {             int tmp = array[i];             array[i] = array[j];             array[j] = tmp;         }     }      // 将基准数放到中间的位置(基准数归位)     array[left] = array[i];     array[i] = base;      // 递归,继续向基准的左右两边执行和上面同样的操作     // i的索引处为上面已确定好的基准值的位置,无需再处理     sort(array, left, i - 1);     sort(array, i + 1, right); }
  对于最大10亿的3亿个数字排序:运行的时间结果是:
  快速排序:37183毫秒
  位图排序:4019毫秒
  比起经典的快速排序,位图排序的性能要高出 9倍以上!
  但这个算法存在一个问题,就是排序的数字序列不能有重复的数字,如何改进这个算法呢?其实很简单,只要将存储最小单元由BIT改成BYTE,相同的数字,位图数组的值加1即可,这样可以处理最多255个重复的数,应该可以满足大部分场景,改进的代码如下: // 位图排序法2,可处理重复最多255个数     private static byte[] bitmapSort2(int[] array, int max) {         byte[] result = new byte[max];         for (int i = 0; i < array.length; i++) {             result[array[i]]++;         }         return result;     }
  运行测试,第二种排序时间为4857毫秒,效率依然杠杠的!

华为P50真机及细节配置曝光,麒麟9000L120Hz高刷66W快充早在五一之前,众多数码博主就曾曝光过华为P50的真机机模,那个时候曝光的消息显示,华为P50将会采用后置超大椭圆镜头模组前置单打孔直屏的设计,和去年发布的P40系列属于截然不同的I造车新势力4月份销量蔚来稳坐第一,威马ampampquot优雅退群ampampquot我没想到,4月份的销量,竟然是造车新势力率先公布了销量。经过几年的浮浮沉沉之后,造车新势力也逐渐有了自己的马太效应有的车企已经稳步向前,但是也有的造车新势力开始覆灭,毕竟说到底,造特斯拉维权事件再添新剧情女车主起诉公司副总裁陶琳,其丈夫称给他整连续剧5月6日,河南安阳特斯拉维权车主张女士表示,因特斯拉公司以及特斯拉公司全球副总裁陶琳对外发布的一些不实言论,给自己和家人造成严重影响,已向法院依法提起诉讼,要求书面赔礼道歉并索赔精数字货币暴涨,还有哪些潜力币可埋伏二拟币数字货币行情火爆,狗狗币一年涨幅150倍,以太坊最近大涨,比特币一直维持在高位震荡。可是投资者炒币者想要再在这些虚拟币上暴富,难度可想而知,除非大力加杠杆,做杠杠合约交易,但这不是奇瑞不够好,而是五菱实在太强严格意义上来说,奇瑞是介入微型车市场最早的企业,但从目前的销量表现来看,奇瑞却不是第一。奇瑞QQ开创了微型车时代,成为一个时代记忆的标签,时代的变迁不意味着奇瑞QQ没有替代品的出现IBM宣布已开发出全球首个2nm芯片5月6日消息,IBM宣布造出了全球第一颗2nm工艺的半导体芯片。核心指标方面,IBM称该2nm芯片的晶体管密度(MTrmm2,每平方毫米多少百万颗晶体管)为333。33,几乎是台积IBM制造出全球首款2nm制程的芯片,相比台积电,领先两年时间5月6日,IBM宣布制造出了全球第一颗2nm制程的半导体芯片。这是什么概念呢?现今主流的电脑芯片多使用7nm和10nm制程,手机因为体积的原因,多使用5nm制程,比如苹果的A14高荣耀30,主打颜值与拍照的手机,让我们来回顾一下在讲这款手机之前,我想先说一下,因为现在麒麟芯片的稀缺,这款手机是麒麟985的处理器,8128版本是2999元,因为毕竟是去年的,所以有所降价。其实这款手机的优点很明显,就是他的相中国芯片业再获喜讯,阿斯麦光刻机就位在即,缺芯困境即将解决?前言在阅读这篇文章之前,记得关注,精彩内容分享天天有,订阅完全免费,可以十万个放心。你是编者进步的动力,更多更好的文章为你奉上,喜欢就关注订阅吧!近来,米国似乎认输了,频频释放出合俗用无所堪,时人嫌不取OPPO在生态链落后华为小米太多5月6日,OPPO在线上召开了K9超次元发布会,发布了K9手机OPPO智能电视K9OPPOEncoAir和OPPO手环活力版四款新品。其中,作为此次新品发布的一大亮点的OPPO对KASML11台光刻机,雪中送炭ASML作为世界上最先进的光刻机厂商,在半导体行业自然享有超然的地位,几乎所有芯片代工厂都需要它的技术支持。就拿目前最高端的EUV光刻机来说,生产7nm及其以上制程的芯片都离不开它
iPhone14ProProMax开发屏下FaceID尽管iPhone13系列尚未正式发布,但坊间却已经开始流传明年推出的下代iPhone的各种消息。在知名曝料人放出所谓iPhone14系列的部分特性之后,又有DSCC首席分析师Ros为科幻片迷打造的无人机全球首款V型双旋翼无人机Falcon上手体验随着科技的发展,无人机逐渐在各种场景中出现,人们对于飞行器的选择也越来越多,看似简单的无人机,实则搭载了多项科技,今天我们就给大家带来全球首款V型双旋翼无人机Falcon的上手体验鸿蒙全家桶缺少一员猛将华为P50Pro,我选择等一等目前,网上已经有很多人拿到了全新的华为P50Pro,看着着实令人羡慕,虽然手中的华为P40Pro在鸿蒙系统的加持下还能再战很久,但谁能抵过华为P50Pro更强大的影像力诱惑呢。拥有4G芯片价格不降反升?专家5G普及并未同步,新兴市场4G手机需求旺5G高速发展下,4G芯片的价格反而在上涨?得益于手机厂商运营商等多方推动,5G已成为拉动手机市场出货量增长的主要动力,但4G手机尚未退出主流舞台,不过其芯片生产线却多数被5G分走,宁放过一千不多招一个,小米汽车的第一步走错了?9月1日,小米汽车正式注册,雷布斯亲任法人。首期投资为100亿元人民币,未来10年将投资100亿美元。大赛道,大投资,业内人士纷纷用脚投票。自开放首批岗位招聘,小米汽车已收到超过2大众CEO竟是ampampquot特吹ampampquot?迪斯很欣赏马斯克,目标2025年超越特斯拉日前,在2021德国慕尼黑国际车展上,大众汽车集团CEO赫伯特迪斯(HerbertDiess)在接受采访时,谈到了大众汽车在电动化领域的目标以及其最大对手特斯拉和公司CEO埃隆马斯鸿蒙OS最新内测名单出炉,多款机型皆可申请,华为将提前完成目标提起华为手机很多人第一时间都会想到鸿蒙OS系统,自从华为公司受限之后,鸿蒙OS系统的研发成功是华为公司所传出的最好消息,这个由华为自研的手机操作系统一经发布就广受好评,本来这是华为出行方式即将改变今天下午,一家三口人在下应北路的欧拉4s店内预订了欧拉好猫GT,家庭出行方式即将因为它的到来所改变。可能以后出门都要想着用新能源车了,今天是9月12日,都说因为芯片的紧缺,国内新能先于时代三星GalaxyS系列盘点回顾三星旗舰的发展之路如果说是苹果开启了属于智能手机的发展时代,那么在智能手机时代的第一个十年里,唯一能和苹果竞争的品牌就是三星。而在这个十年里,能和iPhone竞争的三星手机,S系列则是当之无愧的首选知名驾校破产,曾被曝拖欠3万学员近2亿元学费,号称要用互联网改变行业9月10日,互联网驾考企业广东猪兼强互联网科技有限公司(下称猪兼强)破产管理人通过官微发布一则公告,称广州市中级法院于8月31日裁定宣告广东猪兼强互联网科技有限公司破产。猪兼强是广超实用的新功能,测速好帮手WiFiman移动应用程序更新啦!新的信号测绘仪可以帮助您更轻松地跟踪无线网络的性能。点击应用程序右上角感叹号,即可了解有关新功能的更多信息。在月初的时候,我们给WiFiman增加