Aplicación del método de mapa de bits

Primero proporcione 4 mil millones de enteros int sin signo que no se repitan y luego proporcione un número. ¿Cómo determinar rápidamente si este número está entre esos 4 mil millones de números?

Solicite una memoria de 512 M.

Un bit representa un valor int sin signo.

Lee 4 mil millones de números y configura los bits correspondientes.

Lea el número a consultar y verifique si el bit correspondiente es 1, 1 significa que existe y 0 significa que no existe.

En segundo lugar, utilice el método de mapa de bits para determinar si hay duplicados en la matriz de plástico.

Determinar si hay duplicados en un conjunto es una de las tareas comunes de programación. Cuando la cantidad de datos en la colección es grande, generalmente queremos escanear menos veces, por lo que no es recomendable el método de doble bucle.

El método de mapa de bits es más adecuado para esta situación. El método consiste en crear una nueva matriz con una longitud máxima de 1 basada en el elemento más grande de la colección, luego escanear la matriz original nuevamente y dar la posición de la nueva matriz 1 después de encontrarla varias veces. Si se satisface 5, asigne 1 al sexto elemento de la nueva matriz, de modo que la próxima vez que desee configurarlo, encontrará que el sexto elemento de la nueva matriz es 65438. Este método de inicializar una nueva matriz con ceros y luego uno es similar al método de mapa de bits, por lo que se denomina método de mapa de bits. Su peor número de operaciones es 2N. Si se conoce el valor máximo de la matriz, la eficiencia se puede duplicar si la longitud de la nueva matriz se puede fijar de antemano.

El código de muestra es el siguiente:

Paquete com.sitinspring

Clase pública DuplicatedArrayTest {

Public static void main(String[ ] args) {

int [][] arr = {

{ 1 , 2 , 3 , 5 , 3 , 5 , 56 , 534 , 3 , 32 } ,

{ 1 , 2 , 3 , 5 } ,

{ 1 , 2 , 3 , 5 , 3 , 5 } ,

{ 0 , 0 , 1 , 2 , 3 , 5, 56, 534, 78, 32},

};

for(int I = 0; ilt longitud de la matriz; i) {

System.out.print(array:);

for (int temp: arr[i]) {

System.out.print(temp,);

}

System.out.print(中);

system . print(hasDuplicatedItem(arr[I])? Existe: no existe). /p>

System.out.print(Elemento duplicado.\n);

}

}

/**

* Determine si hay datos duplicados en la matriz de enteros, la complejidad del tiempo es O (n)

* @param array

* @return

*/

Public static boolean hasDuplicatedItem( int [] arr) {

//Escanee la matriz para encontrar el valor máximo

int max = arr[0 ];

for(int I = 1; i lt longitud de la matriz; i) {

if(arr[I] gt; máximo){

max = arr[I];

}

}

//Crea una nueva matriz basada en el valor máximo.

int[]bitArray = new int[max 1];

//Agrega un valor a la nueva matriz por valor.

Por ejemplo, si el valor es 3, bitArray[3]=1.

for (int value: arr) {

if (bitArray[value]!= 0) {

//Si la posición señalada por el valor es no cero, lo que indica que este bloque se ha establecido en 1 antes y devolver verdadero inmediatamente indica que la matriz se repite.

Devuelve verdadero

}

De lo contrario{

//Si la posición señalada por el valor es cero, se establece en 1 , indicando que el Bit ya existe.

bitArray[valor]= 1;

}

}

Devuelve falso

}

}

Salida:

Hay elementos duplicados en la matriz: 1, 2, 3, 5, 3, 5, 56, 534, 3, 32.

No hay elementos duplicados en la matriz: 1, 2, 3, 5.

Hay elementos repetidos en la matriz: 1, 2, 3, 5, 3, 5.

Hay elementos repetidos en la matriz: 0, 0, 1, 2, 3, 5, 56, 534, 78, 32.

En tercer lugar, utilice el método de mapa de bits para ordenar la matriz de plástico.

Paquete com. he yang;

Clase pública BitmapSorter {

Public static void main(String[] args) {

int [] arr = { 1, 7, - 3, 0, 0, 6, 6, 9, -11 };

bitmapSort(arr); arr) {

System.out.print(i,);

}

}

/**

*Utilice métodos de mapa de bits para ordenar.

* @param array

*/

public static void bitmapSort(int[]arr){

//Encontrar la matriz el valor máximo.

int max = arr[0];

int min = max

for (int i: arr) {

if( max lt; i) {

max = I

}

si(min gt; i) {

min = I ;

}

}

//Obtener la matriz de mapa de bits

int[]new arr = new int[max-min 1 ];

for (int i: arr) {

int index = I-min;

nuevo arreglo[index];

}

//Reorganizar los elementos en arr

int index = 0;

for(int I = 0; IltnewArr.lengthi) {< /p >

mientras(nuevo arreglo[I] gt; 0 ) {

arr[index]= I min

index

nuevo arreglo[; I]-;

}

}

}

}

Cuarto, mapa de bits Cómo almacenar datos

¿Cómo almacenar datos cortos sin firmar en 8k bytes de espacio de memoria?

Convención general:

Definir matriz: acceso directo sin firmar [4096];

De esta manera, solo se pueden almacenar como máximo datos cortos sin firmar de 4K.

Utilice el método de mapa de bits:

Defina una matriz: chaarrBit sin firmar[8192];

Esto puede almacenar 8K*8=64K de datos cortos sin firmar.

La posición del byte y la posición del bit de rrBit (byte 0~8191, bit 0~7)

Por ejemplo, escribiendo 1234, el orden de los bytes: 1234/8 = 154; : 1234; 0b111 = 2, luego 1234 se coloca en el subíndice 154 byte de arrBit y el segundo bit (0 ~ 7) de este byte se establece en 1.

Posición del byte: int nbyte pos = 1234/8 = 154

Posición del bit: int nbit pos = 1234 7 = 2

//Posición de la voluntad 2 de 154 bytes de la matriz se establecen en 1.

Valor corto sin signo = 1 lt; ltnBitPos

arr bit[nBytePos]= arr bit[nBytePos]| //Escribe 1234 para obtener arr bit[154]= 0b 00000100 .

Escribe 1236 nuevamente en este momento.

Posición del byte: int nbyte POS = 1236/8 = 154

Posición del bit: int nBitPos = 1236 7 = 4

. ///Establece 4 bits de la matriz de 154 bytes en 1.

val = 1 lt; ltnBitPos

arr bit[nBytePos]= arr bit[nBytePos]| //Escribe 1236 nuevamente para obtener arr bit[154]= 0b 0010100.

Leer elementos de datos: lea arrBit bit a bit para obtener la posición del byte y la posición del bit de 1 bit. El valor del elemento es 8*nBytePos nBitPos.

for(I = 0;i lt8192;i)

{

for(j = 0;j lt8;j)

{

if(arr bit[I] amp; (1 lt; ltj))

{

cout lt ltarr bit: lt; lt lt ltj lt lt lt lt8 * I j lt;

}

}

}

dará salida:

arrBit: 154 2 1234

arrBit: 154 4 1236

Eliminar elemento: calcula la posición del byte y la posición del bit del elemento que se va a eliminar: arr bit[nbyte pos ] ;= ~(1 lt; ltnbit pos);

Por ejemplo, eliminar 1234: arr bit[154]; = ~(1 lt; lt2);