2011-01-17 28 views

Respuesta

4

Para que sea lineal, necesitaría una lista enlazada/conjunto/matriz de los índices establecidos como verdaderos. Mantener dicho índice secundario no es parte de las compensaciones de desempeño/almacenamiento requeridas por std :: bitset, y dado que pondría en desventaja a todos sin su requisito específico, no hay forma de que una implementación lo proporcione. Podría considerar complementar su conjunto de bits con un contenedor de este tipo, o usar la biblioteca de contenedores de múltiples índices de boost.

+0

También puede encontrar el código para bitsets dispersos en la web. – etarion

+0

Entiendo. Desafortunadamente, mantener un almacenamiento de índices por separado no es una opción. Gracias por tus ideas. – Astyanax

0

Looping sobre todo el conjunto de bits y simplemente verificando el valor y almacenando el índice si es verdadero, IS lineal. Puede acelerar eso con una tabla de búsqueda. Ver este código:

http://xiangqi-engine.cvs.sourceforge.net/viewvc/xiangqi-engine/tsito2/src/Utility.cpp?revision=1.5&view=markup

+1

El objetivo de la pregunta era que la exploración de todo el conjunto de bits no es necesariamente lineal con respecto al número de bits establecidos. Por ejemplo, si se sabe que el número de conjuntos de bits es ~ ln donde N era el tamaño del conjunto, entonces un escaneo aún tomará O (N) y no O (ln N). –

+0

Eddie, no es lineal en el número de bits verdaderos. Considere editar su respuesta o eliminarla. – einpoklum

1

Puede comprobar hasta 32-bits a la vez con un acumulador de U64 y una mesa de 32 entrada como


u32 kTable[] 
{ 
0x01, 0x03, 0x07, 0x0F ..., 0xFFFFFFFF 
}; 

Basta con leer en 32 bits en un U64 acumulador y desplazarlo hacia abajo dependiendo de la compensación y verificar sus bits contra la mesa. Puede hacer esto de forma binaria para hacer el número de comparaciones en un máximo de 5. Esto será más lento para los datos que no son de forma 'lineal'. Esto se convierte en tiempo de registro.

+0

Interesante. ¿Puedes decirnos un poco más sobre cómo usar dicha tabla? – Astyanax

+1

O (N/32) sigue siendo O (N) - y eso es nuevamente lineal en el número total de bits. – MSalters

+0

La tabla kTable está ordenada para que pueda bsearch sus bits. Eso hace en tiempo de registro –

13

Un bitvector estándar no admite la iteración eficiente sobre bits verdaderos: el tiempo de ejecución siempre es O (n), donde n es el número total de bits, que no depende de k. Sin embargo, una estructura especial llamada van Emde Boas Tree admite la iteración sobre los bits en el tiempo O (k lg lg n), donde n es el número de bits yk es el número de bits verdaderos.

Como un poco de auto promoción de Shameless, tengo an implementation of a vEB-tree on my personal website. Si no es apropiado para mí anunciar esto aquí, házmelo saber y lo quitaré.

1

sólo hay dos opciones que lo hacen mucho mejor que O (N) en el total de bits:

  1. utilización de las instrucciones de bits de escaneo especiales disponibles en ciertas arquitecturas como BSF in x86.
  2. Hay algoritmos O (log2 (N)) para encontrar el bit más bajo establecido en una palabra. Esto, por supuesto, no escala bien cuando el conjunto de bits es denso, en lugar de escaso. Resucitando algún recuerdo brumoso mío, encontré la fuente en el FXT library Los detalles se pueden encontrar en el FXT book (pdf), en la sección 1.3.2.
0

A veces las personas usan run-length encoding para cosas como esas. Si codifica el conjunto de bits entrantes en una matriz de longitudes de ejecución, el número de ejecuciones con las que finaliza no excederá el número de transiciones entre los bits definidos y claros, que es como máximo 2*k. Además, en muchas aplicaciones, el número de transiciones es mucho menor que k, por lo que obtendría un excelente rendimiento de tiempo promedio además del peor caso lineal.

Por otra parte, es fácil añadir una estructura de datos que le permiten buscar de manera eficiente para cosas tales como "el siguiente conjunto de bits a partir de n ª posición en la matriz": acaba de construir un scan de las tiradas.