zoukankan      html  css  js  c++  java
  • 数据结构(五)位图算法

    位图算法实现思想:

    将需要排序的数字转换为数组的下标,通过数组的下标完成对数据的排序,优点效率高,缺点浪费存储空间。

    public class BitMapTest {
        /**
         * 参数说明:
         * @param buf 新定义的bit数组(int类型)
         * @param value 需排序的传入数值
         * @return
         * 
         * 功能说明:
         *     将value值转换为数组的下标,将数组buf的第value位置为1   
    10       *     buf[value >> 5]表示value属于int数组的第几个成员
    11       *     value & 0x1F 表示在对应int数组项中具体的第几个bit位
    12       *     buf[value >> 5] |= (1 << (value & 0x1F))表示将对应数组项目中的bit位置为1
    13       */
    14      public static void encode(int []buf,int value){
    15          buf[value >> 5] |= (1 << (value & 0x1F));
    16      }
    17     
    18      /**
    19       * 参数说明
    20       * @param buf 编码后的bit数组
    21       * @param value 传入的bit数组下标
    22       * @return
    23       * 
    24       * 功能
    25       * 判读buf数组中相应的数据项中对用的bit位是否为 1
    26       */
    27      public static int decode(int [] buf,int value){
    28          return buf[value >> 5] & (1 << (value & 0x1F));
    29      }
    30     
    31      public static void main(String[] args) {
    32          int a[] = {3,98,15,12,7,9,8,17,6,11};
    33          long start = System.currentTimeMillis();
    34          int LENGTH = a.length;
    35          int max = 0,i=0;
    36         
    37          for (i=0;i<LENGTH;i++){
    38              if (a[i] > max){
    39                  max = a[i];
    40              }
    41              System.out.print(a[i]+", ");
    42          }
    43          System.out.println();
    44         
    45          // 获取int数组的长度,取排序数子中的最大值与数组长度中的二者的最大值
    46          max = max>LENGTH?max:LENGTH;
    47          int size = max/32+1;//98/32+1=4
    48         
    49          int []r = new int[size];
    50          for (i=0;i<LENGTH;i++){
    51              encode(r,a[i]);
    52          }
    53         
    54          // 遍历的长度大于max即可
    55          for (i=0;i<max+1;i++){
    56              if (decode(r,i) > 0){
    57                  System.out.print(i + ",");
    58              }
    59          }
    60          System.out.println();
    61         
    62          System.out.println("time:"+(System.currentTimeMillis()-start));
    63      }
    64  }
  • 相关阅读:
    Chrome调试中的奇技淫巧
    正则表达式学习记录
    探寻<a>中的href和onclick
    鼠标事件记录
    读取本地文件并进行处理
    浏览器兼容性问题汇总
    前端经验总结
    PL/sql使用总结
    正反斜杠的使用场景记录
    isEmpty和isBlank的区别
  • 原文地址:https://www.cnblogs.com/jianyuan/p/5410974.html
Copyright © 2011-2022 走看看