数据结构(五)位图算法
位图算法实现思想:
将需要排序的数字转换为数组的下标,通过数组的下标完成对数据的排序,优点效率高,缺点浪费存储空间。
| 1 | public class BitMapTest { |
| 2 | /** |
| 3 | * 参数说明: |
| 4 | * @param buf 新定义的bit数组(int类型) |
| 5 | * @param value 需排序的传入数值 |
| 6 | * @return |
| 7 | * |
| 8 | * 功能说明: |
| 9 | * 将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 | } |

浙公网安备 33010602011771号