bitmap位图法学习

最近各种忙呀.............需要了解各种知识。发现现在网上的资料真的太杂了,很难找到自己想要的,最重要的还是得靠自己。另外就是搜技术相关的东西最好还是用google。

继续努力........

-----------以下切入正题-------------

bitmap位图法是利用二进制的几位来表示数据一种状态的方法,通常适用于数据量大的处理与分析。网上举得最多的例子就是给你N个不重复的乱序的数,然后再给一个数,让你判断这个数是否在这N个数中(N这个数字很大)。遇到这种数据量大,但是状态很少的问题(这个例子中就是一个数存在或者不存在)。

在处理过程比较需要注意的是用于存储状态的位数组的方向。

以下是一个小例子:

#include<stdio.h>
#include<stdlib.h>
typedef int (*fun_bit)(int,char*,int);
typedef struct{
    fun_bit set;
    fun_bit statistic;
}fun_bitmap;
/*
 *put the num to the bitmap
 *the first param is useless
 */
int set_bit(int num,char *bitmap,int size){
    int pos,bit;
    if(size*8-1<num){
        printf("num is too large\n");
        return -1; 
    }   
    bit=num%8;
    pos=num/8;
    bitmap[pos]|=(0x01<<bit);
    return 0;
}
/*
 *statisc the number of unique num in bitmap
 *the first param is useless
 */
int statistic(int num,char *bitmap,int size){
    unsigned char p=0x01;
    int i,j,sum=0;
    for(i=0;i<size;i++){
        for(j=0;j<8;j++){
            if(bitmap[i]&(p)){
                printf("the num is:%d\n",i*8+j);
                ++sum;  
            }   
            p<<=1;
        }   
        p=0x01;
    }   
    return sum;
}
int main(int argc,char *argv[]){
    int i;
    int array[]={1,2,2,3,4,3,5,6,7,8,9,10,1000};
    char bitmap[200]={0};
    int size=200;
    fun_bitmap bit={set_bit,statistic};
    for(i=0;i<13;i++){
        bit.set(array[i],bitmap,size);
    }
    printf("num total:%d\n",bit.statistic(0,bitmap,size));
    return 0;
}

 

posted @ 2011-09-19 08:20  akawhy  阅读(739)  评论(0编辑  收藏  举报