zoukankan      html  css  js  c++  java
  • 第一章:位向量/位图

    1.位图排序

    //1.关闭所有位,初始化集合为空
    for i=[0,n)
        bit[i]=0;
    
    //2.读取文件,打开相应的位,建立集合
    for each i in the input file
        bit[i]=1;
    
    //3.检查每个位,如果某个位为1,就写出相应的数,从而创建已排序的文件
    for i=[0,n)
        if(bit[i])
            write i to the output file

    2.位图的实现

    2.1

    #define BITSPERWORD 32
    #define SHIFT 5
    #define MASK 0x1F
    #define N 10000000
    
    int a[1+N/BITSPERWORD];
    
    void clr(int i){
        a[i>>SHIFT] &= ~(1<<(i&MASK));
    }
    
    void set(int i){
        a[i>>SHIFT] |= (1<<(i&MASK));
    }
    
    int test(int i){
        return a[i>>SHIFT] & (1<<(i&MASK));
    }

    2.2 C++中bitset

    3.生成[0,n)之间不重复的随机整数

    //先把所有可能数顺序放到数组,然后打乱顺序,则保证不重复
    for i=[0,n)
        a[i]=i;
    
    for i=[0,n)
        swap(a[i], a[randint(i,n)]);
    
    //随机返回一个[m,n)之间的值
    int randint(int m,int n){
        return rand()%(n-m)+m;
    }

    4.首次访问元素时将其初始化

    用空间换时间带来的一个问题是,初始化空间本身可能会占用大量时间。解决方案如下:

    使用另外两个n元素向量form,to以及整数top中包含的符号能够初始化向量data[i]。如果data[i]已经初始化,那么from[i]<top并且to[form[i]]==i。

    top=0;
    
    //访问data[i]
    form[i] = top;
    to[top] = i;
    data[i] = 0;
    top++;

    通过更多的空间来减少初始化的时间,所以只能在空间便宜时间昂贵,而且向量比较稀疏的情况下使用。

  • 相关阅读:
    Kinect学习笔记(六)——深度数据测量技术及应用
    [device]/proc/devices and /dev/
    [Eth]Mac/Phy/mdio/Rgmii
    [uboot]uboot如何引导系统
    [网络]Linux一些网络知识
    [基础]sizeof和strlen
    [基础]关于extern指针和数组的用法
    [ucos]了解ucos
    [Linux]gcc/libc/glibc
    [i.MX6q]i.MX6q处理器,linux操作系统平台搭建 从SD卡启动系统
  • 原文地址:https://www.cnblogs.com/bukekangli/p/4278856.html
Copyright © 2011-2022 走看看