位图(bitmap)排序

放假之前从图书馆借来《编程珠玑》,开篇遍把我震住,作者以位图排序优雅地解决了一个现实问题:
有3000万个没有重复的电话号码,1M内存,外存比较充裕,需要将这3000万个电话排序
借此作者引出了位图排序:
位图排序是指以一个N位长的串,每位上以“1”或“0”表示需要排序的集合(后简称“集合”)中的数。比如集合为{2,7,4,9,1,10},则生成一个10位的串,将第2、7、4、9、1、10位置为“1”,其余位置为“0”,这样当把串中所有位都置完后,排序也自动完成了(因为串的下标是有序的):1101001011
位图排序的代码如下:

public void bitmapSort(int[] set){
  int max=max(set);
  int[] array=new int[max];
  
  for(int i=0;i<array.length;i++)
    array[i]=0;

  for(int i=0;i<set.length;i++)
    array[set[i]]=1;

  for(int i=0;i<array.length;i++){
    if(array[i]==1)
      System.out.println(i+” ”);
  }
}

private int max(int[] set){
  // return the maxium integer of the set
}

可以看出,位图排序的时间复杂度是O(n)的,比一般的排序都快,但它是以空间换时间(需要一个N位的串),而且有一些限制,比如排序前集合大小最好已知,而且集合中元素的最大重复次数必须已知,最好是稠集数据(不然空间浪费很大)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为Java领域的专家,我可以给您提供一些关于Redis中bitmap底层的基础知识和实现十个不同数使用bitmap排序的思路。 关于Redis中bitmap底层的基础知识: Redis中的bitmap是一种特殊的数据结构,它是由一系列二进制位组成的序列,其中每个位要么是0,要么是1。Redis中的bitmap可以用来表示某个对象是否存在,也可以用来表示某个对象的状态等。 实现十个不同数使用bitmap排序的思路: 假设我们要实现十个不同的数使用bitmap排序,这些数的范围是0~9。下面是一种可能的实现思路: 1. 创建一个位图bitmap),它包含10个二进制位,每个位代表一个数。初始时,所有位都置为0。 2. 对于每个数,将对应的二进制位置为1。例如,如果要插入数字3,就将索引为3的二进制位置为1。 3. 排序时,从0到9依次遍历位图中的二进制位。如果某个二进制位的值为1,就输出对应的数字。 4. 最终输出的结果就是按照升序排列的数字序列。 需要注意的是,如果有多个相同的数字,它们在位图中对应的二进制位都是1,因此在排序时会出现重复的数字。为了避免这种情况,可以将位图中每个二进制位的值改为该位之前出现的数字的个数,这样在排序时就可以按照数字的出现顺序输出结果。 以上是一种简单的实现思路,实际实现过程中可能还需要考虑其他因素,例如位图的大小、性能等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值