Notas de Estudio - colección

N es un número entero fijo cuando pequeño, {1,2 ... N} es un subconjunto de N Si N = 10 000, puede ser una matriz A [N] para indicar la presencia de este conjunto, en cuyo caso el tamaño de la matriz A [ N], tal como una [1] = 1 indica un primer conjunto de elementos presentes.

Como su nombre indica es el uso de los bits del vector de bits para almacenar elementos. tipo corto sin signo en un libro, por ejemplo, está representado por la siguiente Estados Unidos. EE.UU. ocupa 2 bytes, 16 bits, 16 representan un número de US continuación, sólo puede utilizar este número N N / 16 de tipo representa el número de los Estados Unidos. Un caso para el tamaño de la matriz A [N / 16 + 1],

A [0] representa un número de 1-16 (0-15)

A [1] representa un número de 2-32 (16-31)

...

A [0] = 13, puede ser visto como 000000001011, A [0] en la primera posición, la segunda posición, la cuarta posición de la presente número, es decir, la presencia de tres números 0,1,3. 

Si un número de entrada 30, primero para determinar que la posición en la matriz, 30/16 = 1, esta vez debe ser de la matriz A [1], la necesidad de cálculo sólo A [1] en la posición de 30% de 16 + 1 = 15 , que representa la posición 15a.

El siguiente método analítico para lograr un conjunto de libro Xiaodong:

Un conjunto de operaciones básicas:

//并集运算:其运算结果为集合A和集合B的并集
Set SetUnion(Set A,Set B);

//交集运算:其运算结果为集合A和集合B的交集
Set SetIntersection(Set A,Set B);

//赋值运算:将集合B赋值给A
void SetAssign(Set A,Set B);

//判断运算:相等返回1 否则返回0
int SetEqual(Set A,Set B);

//成员运算:x与集合相同的类型,当x属于S时,返回1 否则返回0
int SetMember(int x,Set set);

//插入运算:将x与插入集合S,当x本身属于S时,不改变集合
void SetInsert(int x,Set s);

//删除运算:将集合S中的x元素删除,当x不属于S时,不改变集合
void SetDelete(int x,Set s );

Establecer un conjunto de definiciones: 

typedef struct set
{
    int size;//能存储元素规模
    //数组大小应该看类型 如v为 ushort应该一个数可以存16个 大小为arr/16+1||(size+15)
    int arraysize;
    //向量组 每个向量能存储16个
    unsigned short *v;
} Bitset, *Set;

SetInit función se utiliza para crear un nuevo conjunto:

Set InitSet(int size)
{
    Set _set = new Bitset;
    _set->size = size;
    //一个US类型可以表示16个 故数组大小为1+size/16
    //书中这种向右移动4位的运算方式等同于/16
    _set->arraysize = (size+15)>>4;
    //书中v大小为size 个人认为有错,有不同意见的朋友欢迎探讨
    _set->v = new unsigned short[_set->arraysize];
    for (int i = 0; i <_set->arraysize; i++) 
    {
         _set->v[i] = 0;
    } 
    return _set; 
}

función SetAssign para la asignación:

//把B赋值给A
void SetAsign(Set A, Set B)
{
    if (A->size != B->size)
        return;
    for (int i = 0; i < A->size; i++)
    {
        A->v [i] = B->v[i];
    }
}

ArrayIndex encontrar la ubicación del número de la matriz:

//计算位置大小 除类型的大小 UShort为16 故要/16 按位的话/4即可
int ArrayIndex(int x){
    return x>>4;
}

BitMask función para encontrar el primero de varios lugares en los EE.UU.:

//计算这个数在一个ushort里面所在的第几个位置 除16取余+1即可
//输入10二进制为1010为15 1111 &计算得1010表示10 之后右移
unsigned short BitMask(int x){
    return 1<<(x&15);
}

SetInsert Insertar función:

//位插入运算 查找数组位置  找到x%16放置 用|运算
//如17插入,此时数组v[1]中为00100000,表示第七个位置有东西,17%16+1=2 |运算后v[1]为00100010
void SetInsert(int x,Set s){
    if(x<0||s->size<x)
        return;
    s->v[ArrayIndex(x)]|=BitMask(x);
}

SetDelte función de borrado:

//删除元素运算 先取反再去取&
//如删除17,此时数组v[1]中为00100010,表示第2、7个位置有东西,17%16+1=2 ~2取反为11111101 &运算后v[1]为00100000
void SetDelete(int x,Set s ){
     if(x<0||s->size<x)
        return;
     s->v[ArrayIndex(x)]&=~BitMask(x);
}

SetMember función para ver si hay elementos:

//检测元素是否存在
int SetMember(int x,Set set){
    if(x<0||x>set->size)
        return 0;
    //首先查找数组对应位置,与x相对的位置
    //如3 此时在数组第一个位置 BitMask值为1000 表示第4数,第1个为0
    return set->v[ArrayIndex(x)]&BitMask(x);
}

función SetEqual para determinar si los conjuntos A y B son iguales:

int SetEqual(Set A,Set B){
    if(A->size! B->size)
        return 0;
    for (int i = 0; i < A->arraysize; i++)
    {
        if(A->v[i]! B->v[i])
            return 0;
    }
    return 1;
}

SetUnion y operaciones de ajuste:

//取并集  如A=1100 B=0110 此时第2、3、4个为并集
Set SetUnion(Set A,Set B){
    Set s=InitSet(A->size);
    for (int i = 0; i < s->arraysize; i++)
    {
        //按位|
        s->v[i]=A->v[i] B->v[i];
    }
}

operador de intersección SetIntersection:

//取交集  如A=1100 B=0100=>0100 此时第3个为交集
Set SetIntersection(Set A,Set B){
    Set s=InitSet(A->size);
    for (int i = 0; i < s->arraysize; i++)
    {
        //按位&
        s->v[i]=A->v[i] B->v[i];
    }
}

SetDifference operación de conjunto diferencia:

//取差集  如A=111000 B=001000=>取&为001000 再异或110000 此时第5.6个为差集
Set SetDifference(Set A,Set B){
    Set s=InitSet(A->size);
    for (int i = 0; i < s->arraysize; i++)
    {
        //按位& 再^
        s->v[i]=A->v[i]^(A->v[i] B->v[i]);
    }
}

 

Publicado 35 artículos originales · ganado elogios 2 · Vistas 1385

Supongo que te gusta

Origin blog.csdn.net/weixin_41001497/article/details/103318965
Recomendado
Clasificación