bitmap的实现方法

bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。

适用范围:可进行数据的快速查找,判重,删除
 
如下是实现的代码示例,用C实现,bitmap的起始位置为0
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef struct bitmap {
  size_t capacity;
  char* bit_array;
}bitmap_t;

int bitmap_init(bitmap_t* bitmap, const size_t capacity) {
  if (!bitmap) {
    return -1;
  }
  //bitmap->capacity = capacity >>3 + 1;
  size_t alloc_size = capacity >>3 + 1;
  bitmap->capacity = capacity;
  char* ptr = (char*)malloc(alloc_size);
  if (!ptr) {
    return 0;
  }
  memset(ptr, 0, alloc_size);
  bitmap->bit_array = ptr;
  return 1;
}

void get_index(const int index, int* high_pos,
    char* low_pos) {
  *high_pos = index >> 3;
  *low_pos = index & 0x7;
}
int bitmap_get(const bitmap_t* bitmap, const int index) {
  int high_pos;
  char low_pos;
  get_index(index, &high_pos, &low_pos);
  if (high_pos >= bitmap->capacity) {
    return -1;
  }
  char value = bitmap->bit_array[high_pos];
  return (value &(0x1<< low_pos));
}
int bitmap_data(const bitmap_t* bitmap, const int index) {
  return 0;
}
int bitmap_set(bitmap_t* bitmap, const int index) {
  int high_pos;
  char low_pos;
  get_index(index, &high_pos, &low_pos);
  if (high_pos >= bitmap->capacity) {
    return -1;
  }
  bitmap->bit_array[high_pos] |= (1<<low_pos);

  return 0;
}

int main(int argc, char * argv[]) {
  int array[] = {0,5,8,7,6,3,1,10,78,56,34,23,
    12,43,54,65,76,87,98,89,100};
  int range = 101;
  const int len = sizeof(array)/sizeof(array[0]);
  bitmap_t bitmap;
  bitmap_init(&bitmap, range);
  for (int i = 0; i < len; ++i) {
    bitmap_set(&bitmap, array[i]);
    printf("set_value = %d\n", array[i]);
  }
  for (int i = 0; i < range; ++i) {
    if (bitmap_get(&bitmap, i) > 0 ) {
      printf("get_value = %d\n",i);
    }
  
  }
  return 0;
}

 

posted @ 2013-09-17 19:07  westfly  阅读(513)  评论(0编辑  收藏  举报