zoukankan      html  css  js  c++  java
  • BitMap排序

    问题描述:

          BitMap排序思想:

                用1bit位标记某个元素对应的值

          优点:

                效率高,不允许进行比较和移位

                占用内存少,比如32个整数,使用bit存储需要4byte,使用int数组需要32*4byte

         缺点:

               无法对重复数据进行排序和查找

        应用场景:

                    ①:对10亿个不重复的整数进行排序。

                    ②:找出10亿个数字中重复的数字。

     

    算法实现:

    /*
    *    BitMap算法
    *    思想:
    *        用1bit位来标记某个元素对应的value,而key即是该元素。
    *    
    *    优点:
    *        效率高,不允许进行比较和移位
    *        占用内存少,比如32个整数,使用bit存储需要4byte数据存储,使用数组需要32byte
    *
    *    缺点:
    *        无法对重复的数据进行排序和查找
    */
    
    #ifndef BitMap_H
    #define BitMap_H
    
    using std::cout;
    using std::endl;
    
    #define ByteLength 8
    
    //返回数组元素中的最大值
    int getMax(int* array,int size)
    {
        int max=array[0];
        for (int i=1;i<size;i++)
            max=array[i]>max?array[i]:max;
        return max;
    }
    
    //返回存储数组需要的byte个数
    int getByteCount(int* array,int size)
    {
        int max=getMax(array,size);
        int byteCount=max/ByteLength+1;    //BitMap存储该数组需要byteCount个字节
        return byteCount;
    }
    
    //返回存储整数对应的byte索引
    int index(int data)
    {
        return data/ByteLength;
    }
    
    //返回存储整数对应的byte偏移
    int shift(int data)
    {
        return data%ByteLength;
    }
    
    //BitMap排序
    void  bitmapSort(int* array,char* byteArray,int size)
    {
        int j=0;
        int k=0;
        for (int i=0;i<size;i++)
        {
            j=index(array[i]);
            k=shift(array[i]);
            byteArray[j] |= (char)(k>0?(1<<k):0);    //注意k为0的情况
        }
    }
    
    //输出byte位为1时对应的值
    void getValue(char data,int index)
    {
        if (data & 0x1==0)    //data为0的情况
        {
            cout<<index*ByteLength<<"	";
        }
    
        for (int i=0;i<ByteLength;i++)
        {
            if (data & (char)(1<<i))
                cout<<index*ByteLength+i<<"	";
        }
    }
    
    //输出排序后的数组
    void print(char* array,int size)
    {
        int count=0;
        for (int i=0;i<size;i++)
        {
            if (count>0 && count%10==0)
                cout<<endl;
    
            if (array[i]==0)
            {
                continue;
            }
            else
            {
                getValue(array[i],i);
                count++;
            }
        }
        cout<<endl;
    }
    
    #endif
  • 相关阅读:
    我的2007, 兼谈些对技术的看法
    回帖整理: 关于"学习Java社区"更清晰的思路
    回帖整理: 创业心态
    我的世界观 by 爱因斯坦
    回帖整理: 论团队中的设计工作
    请大家帮我一个忙
    回帖整理: Java社区有什么可学的?
    SSL原理及应用(1)SSL协议体系结构
    文件和目录的访问控制(4) 审核规则
    强名称(2)引用强名称签名的程序集
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3558313.html
Copyright © 2011-2022 走看看