• 位图排序概要 编程珠玑(第一章)-----学习笔记


    位图或者位向量可以表示一系列序列集合,比如:可用一个20位长的字符串来表示一个所有元素都小于20的简单的非负整数集合。例如可用如下字符串表示集合

    {1,2,3,5,8,13}: 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 集合中为1的代表整数集合中的该数。

    这种表示有一些限制:输入数据限制在相对较小的范围内,数据没有重复,而且对于每条记录而言,除了单一整数外,没有任何其他关联数据。

    分三个自然阶段来编写程序,第一阶段讲所有为都置为0,从而讲集合初始化为空,第二阶段通过读入文件中的每个整数来建立集合,将每个对应位都置为1,第三阶段

    检验每一位,如果该位为1,就输出对应的整数,由此产生有序的输出文件。

    #include <stdio.h>
    #define MAX 1000000
    #define SHIFT 5           
    #define MASK 0x1F
    #define DIGITS 32
    int a[1+MAX/DIGITS];
    
    void set(int n)     //将逻辑位置为n的二进制位置为1 
    {
        a[n>>SHIFT]=a[n>>SHIFT]|(1<<(n&MASK));     //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置,
    }                                              //然后将1左移的结果与当前数组元素进行或操作,相当于将逻辑位置为n的二进制位置1.  
    
    void clear(int n)
    {
        a[n>>SHIFT]=a[n>>SHIFT]&(~(1<<(n&MASK)));   //将逻辑位置为n的二进制位置0,原理同set操作 
    }
    
    int test(int n)
    {
        return a[n>>SHIFT] & (1<<(n&MASK));        //测试逻辑位置为n的二进制位是否为1 
    }
    
    int main()
    {
        int i,n;
        for(i=1;i<=MAX;i++)
        {
            clear(i);
        }    
        while(scanf("%d",&n)!=EOF)
        {
            set(n);
        }
        for(i=1;i<=MAX;i++)
        {
            if(test(i))
                printf("%d ",i);
        }
        return 0;
    }


    这里是c的实现代码,每个字节32位,所以需要/32来找到字节位,然后n要和32取余,n%32,转化为为操作就是n&0x1F。

    c++中有现成的数据结构bitset<>可以用,简单使用:

    #include <iostream>
    #include<bitset> 
    #define MAX 1000000
    using namespace std;
    
    bitset<MAX+1> bit;        //声明一个有(MAX+1)个二进制位的bitset集合,初始默认所有二进制位为0 
    
    int main()
    {
        int n,i;
        while(cin>>n)
        {
            bit.set(n,1);          //将第n位置1               
        }    
        for(i=0;i<=MAX+1;i++)
        {
            if(bit[i]==1)
                cout<<i<<endl;
        }
        return 0;
    }


  • 相关阅读:
    某个牛人做WINDOWS系统文件详解
    常用ASP脚本程序集锦
    LINUX基础:文件安全与权限
    proftpd+mysql+quota
    apache2.0.49tomcat5.0.19jk2建立virtualHost
    URL Redirection(转) Anny
    顶级域名后缀列表(转) Anny
    \u4E00\u9FA5意义 Anny
    How to POST Form Data Using Ruby(转) Anny
    How to get rid of 'Enter password to unlock your login keyring' in Ubuntu(转) Anny
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3151221.html
Copyright © 2020-2023  润新知