Friday, 6 October 2017

Leftrotate Binary Options


Exploración de la flecha SoCKit Parte V - Informática MD5 Comprobaciones sobre la FPGA En las partes I a IV de esta serie de tutoriales, observamos cómo crear un simple módulo LED parpadeante en el FPGA y controlarlo mediante software. Ahora, vamos a ver cómo usar el FPGA para realizar la computación. Para ello, tomaremos un algoritmo no trivial y lo implementaremos en Verilog. He elegido utilizar el algoritmo de suma de comprobación MD5 como ejemplo, ya que es relativamente fácil de implementar en hardware. Una vez que tengamos una unidad de hardware que pueda calcular las sumas de MD5, podemos instanciar varias instancias de la misma y conectarlas a la CPU para realizar la inversión de hash MD5 de fuerza bruta. Ill estar rompiendo el desarrollo de la galleta MD5 a través de varios puestos de blog, al igual que lo hice con el ejemplo LED parpadeante. Este post se centrará en la implementación del algoritmo. Posteriormente los puestos abordarán la verificación mediante simulación y control mediante software. El Algoritmo Aquí está el pseudocódigo para el algoritmo MD5, tomado de Wikipedia. La primera decisión a tomar es qué partes del algoritmo se implementarán en el FPGA y qué se hará en el código de control. En general, los cálculos con flujo de control simple que se repiten una y otra vez son un buen ajuste para el FPGA. También es difícil obtener FPGAs para manejar datos que pueden ser de tamaño variable. Por lo tanto, implementaremos el bucle principal, que procesa un fragmento de 512 bits de la entrada, en Verilog. El código de control de la CPU puede entonces ocuparse de rellenar adecuadamente la entrada y alimentarla en trozos por chunk a la FPGA. Ahora que hemos decidido qué implementar, debemos averiguar cómo romper el cálculo en bloques, que luego se pueden implementar como módulos independientes de Verilog. En primer lugar, está claro que vamos a necesitar ROMs para K y s. Así como una RAM para la entrada M. También necesitaremos un módulo para calcular F. una unidad para calcular g. Un rotador izquierdo, un sumador de 32 bits y, finalmente, una máquina de estado para asegurarse de que la computación procede en el orden correcto. Implementación de memorias El Cyclone V puede implementar de forma eficiente memorias pequeñas utilizando la memoria RAM del chip integrado. Con el fin de generar ROMs y RAM que usan el bloque RAM, vamos a utilizar la herramienta Altera MegaWizard. Para abrir MegaWizard, vaya a Herramientas - gt Administrador de complementos MegaWizard. Esto le permitirá seleccionar de una lista de megafunciones, que son bloques de IP de hardware configurables que se pueden agregar a un diseño. En este momento, estamos interesados ​​en las megafunciones en la sección del compilador de memoria. La RAM del bloque FPGA puede tener dos conjuntos separados de señales de dirección y datos. Puesto que estaremos instanciando varias copias de nuestra unidad MD5, es lógico tenerlas compartiendo memoria tanto como sea posible, así que usaremos la ROM de 2 puertos para K y s. En la primera página de opciones, seleccione 64 para el número de palabras en la memoria. A continuación, elija el tamaño de la palabra correcta. Esto debe ser 32 para K y 5 para s. Para Qué debe ser el tipo de bloque de memoria, elija M10K. Puede saltarse la sección sobre los relojes, ya que los valores predeterminados están bien. En la tercera página, le preguntará a qué puertos desea colocar los registros. Los registros en las entradas son necesarios, pero los registros en los puertos de salida son opcionales. Cada conjunto de registros añade un ciclo de retardo, por lo que deseleccionar la colocación de registros en las salidas de modo que la ROM sólo tiene un retardo de ciclo único. En la cuarta página, le pedirá que proporcione un archivo que especifique qué valores serán en la ROM. Puede elegir entre proporcionar un archivo de inicialización de memoria (.mif) o un archivo hexadecimal Intel (.hex). El primero es más legible por el ser humano, mientras que el segundo puede ser más fácilmente generado por computadora. Puede encontrar los archivos. mif para la ROM K ROM y la ROM en el repositorio Github. Después de que haya finalizado la intialización de la memoria, puede hacer clic en Finalizar para generar los módulos de Verilog para la memoria. Puede seguir el mismo procedimiento para generar la RAM para M. Elija la RAM de 2 puertos en la sección Compilador de memoria. Cree una RAM con un puerto de lectura y un puerto de escritura. El asistente para RAM tiene una sección adicional que le pregunta qué debe suceder si intenta leer de una dirección que se está escribiendo. Elija No me importa esto. Además, para RAMs, no es necesario especificar un archivo de inicialización de memoria. Unidades Combinacionales Ahora que tenemos nuestros recuerdos, podemos ver las porciones de lógica combinacional de nuestro circuito. En primer lugar, vamos a considerar el cálculo de la variable F. La señal F se genera a partir de combinaciones de bits de B. C y D. Sin embargo, la operación particular depende del valor del contador i de bucle de 6 bits. Notará, sin embargo, que la única información que necesitamos es si está en uno de los cuatro rangos de igual tamaño. Podemos determinar esto examinando sólo los dos primeros bits de i. Los operadores son operaciones AND, OR, XOR y NOT a bit a bit, respectivamente. Para calcular g. Tenemos que multiplicar i por ciertas constantes, añadirlo a ciertas constantes, y luego tomar el resultado módulo 16. Podemos simplificar esto observando que tomar el módulo de un entero binario por 16 es lo mismo que tomar los cuatro bits más bajos. También podemos simplificar nuestra lógica basada en el hecho de que es multiplicar y agregar basándonos en los últimos cuatro bits de i y luego tomar los últimos cuatro bits del resultado es lo mismo que multiplicar y agregar por los seis bits de i. El último truco que podemos usar es deshacernos de la multiplicación, que es una costosa operación lógica. Lo que notarás es que las constantes que multiplicamos por (3, 5 y 7) son todas una distancia de una potencia de dos (2, 4, y 8). Esto es muy conveniente, ya que podemos multiplicar fácilmente por potencias de dos por bits de desplazamiento a la izquierda. Podemos entonces sumar o restar el número original del número desplazado para obtener el resultado final de la multiplicación. Por lo tanto, podemos expresar nuestras multiplicaciones usando los siguientes equivalentes. La cantidad por la cual cambiamos i y el número que agregamos a ella se seleccionará sobre la base de los dos bits más altos de i. Tal como lo hicimos con la calculadora F. Luego está el rotater izquierdo, que es bastante sencillo. Para expresar una rotación a la izquierda en verilog, puede doblar la entrada, desplazarla a la izquierda y luego tomar la mitad superior de los bits. Para el sumador, simplemente utilizaremos el operador verilog. Ahora que tenemos nuestras unidades combinacionales, tendremos que unirlas para realizar el bucle interno de la computación. Cálculo secuencial La lógica combinacional apátrida no es suficiente para realizar el cálculo que queremos. Por lo tanto, necesitaremos una máquina de estado para almacenar los resultados intermedios en los registros y seleccionar las entradas correctas para las unidades combinacionales. En el cuerpo del bucle interno del algoritmo MD5, hay un montón de adiciones de 32 bits. Sin embargo, nos gustaría reducir el número de agregadores de 32 bits que usamos para no usar demasiados elementos lógicos. Afortunadamente, a través de secuenciación inteligente, hay una manera de hacer el cálculo en sólo cuatro ciclos utilizando sólo un sumador de 32 bits. Estos cuatro pasos tendrán que repetirse 64 veces, con i incrementando cada vez. Entonces, al final, necesitaremos cuatro ciclos más para añadir A, B, C y D a a0, b0, c0 y d0. Este módulo chunkcruncher realiza el cálculo en el bucle interno del algoritmo MD5. Tiene puertos de dirección y datos para las ROM y RAMs, así como señales de reinicio y de inicio. La señal de reinicio le indicará a la unidad que comience un nuevo cálculo MD5 y la señal de inicio indicará a la unidad que procese un nuevo trozo de 512 bits. El primer bloque siempre es combinacional y simplemente multiplexa las entradas del sumador de 32 bits basado en el paso y la etapa actuales. El segundo bloque siempre es nuestra máquina de estado. Tenga en cuenta que, curiosamente, hacemos i i 1 en el paso 2 en lugar del paso 3. Esto se debe a que hay registros en las entradas de dirección de nuestras ROMs. Cambiamos el valor de i en el paso 2. En el paso 3, el valor de s se basará en el valor antiguo de i. Entonces, cuando volvemos al paso 0, el valor de k se basará en el nuevo valor de i. Colocando la Memoria y la Computación Juntos Ahora que tenemos nuestra memoria y los bloques computacionales, tenemos que ponerlos juntos para hacerlos hacer algo útil. Dado que nuestras ROMs son de doble puerto, bien juntas dos módulos chunkcruncher, una ROM sdata, una ROM kdata y dos RAM mdata. Conclusión Ahora weve construido son la unidad MD5. Pero, ¿cómo nos aseguramos de que funcione? En mi próximo post, Ill discutir la verificación con el simulador de circuito ModelSim. B printtree imprime cada nodo en el árbol exactamente una vez (b) printTree - imprime cada nodo en el árbol exactamente una vez, en preOrder. (C) printLevel - imprime cada nodo en el árbol exactamente una vez en orden de nivel de abajo hacia arriba. (D) printPaths - imprime cada ruta desde la raíz a una hoja en el árbol. (E) Ninguna de estas opciones es un buen nombre para la función. Esta vista previa tiene secciones borrosas intencionalmente. Regístrese para ver la versión completa. MC5 (2.5pts) Piense en un algoritmo que utiliza una pila para e fi cientemente comprobar si hay delimitadores desequilibrados o no emparejados. ¿Cuál es el número máximo de delimitadores a la izquierda que aparecerá en la pila en cualquier momento cuando el algoritmo analiza la cadena) (). (A) 1 (b) 2 (c) 3 (d) 4 (e) 5 o más MC6 (2.5pts) Supongamos que eliminamos el nodo que contiene la clave 10 del árbol AVL de abajo. (A) leftRotate cerca de 9, seguido por rightRotate alrededor de 8. (b) rightRotate alrededor de 8. (c) leftRotate () () () (Qué secuencia de rotaciones restablecerá el equilibrio del árbol Cerca de 12, seguido de rightRotate alrededor de 8. (d) rightLeftRotate cerca de 9, seguido por rightRotate alrededor de 8. (e) Ninguna de estas opciones reequilibrará el árbol. MC7 (2.5pts) Examine la función mystery siguiente - gtright no será NULL.) TreeNode y t-gtright t-gtright y-gtleft y-gtleft t y-gtheight max (altura (y-gtright), altura (y-gtleft)) 1 t-gtheight max (altura T-gtright), altura (t-gtleft)) 1 ty ¿Cuál de las siguientes funciones del diccionario podría invocar mysteryFunction más de una vez (a) insertar (clave) (b) MC8 (2.5pts) Considere el AVL Tree construido insertando la siguiente secuencia de números enteros, uno a la vez en el dado 10. ¿Cuál de las siguientes afirmaciones es verdad sobre el árbol (a) 11rsquos el niño izquierdo es NULL y 15rsquos el niño izquierdo es 11. (b) 11rsquos el niño izquierdo es NULL y 15rsquos el niño izquierdo es 13. (c) 11 rsquos niño izquierdo es 10 y 15 rsquos niño izquierdo es 11. (d) 11rsquos niño izquierdo es 10 y 15rsquos niño izquierdo es 13. (e) Ninguna de estas respuestas es correcta. Esta vista previa tiene secciones borrosas intencionalmente. Regístrese para ver la versión completa. (B) 2 30 - 1 (c) 2 31 - 1 (d) La respuesta no puede ser determinada por el (los) número (s) La información dada. (E) Ninguna de estas respuestas es correcta. MC 10 (2.5pts) Utilice los siguientes 3 ejemplos de código para contestar la pregunta a continuación. Asuma que todas las matrices e imágenes se han inicializado correctamente para contener datos válidos. (I) RGBPixel colorArray100 loadColors (colorArray) // inicializar los valores del array pragma omp paralelo para (int i 1 i lt 100 i) (ii) imagen PNG (dogPic. PNG) // carga desde el archivo pragma omp parallel for for (int I 0 i lt image. width () i) (iii) tabla int 1010 Este es el final de la vista previa. Un sistema y un método se describen para implementar operaciones de establecimiento dinámico sobre datos almacenados en una matriz ordenada usando un híbrido rojo - Archivo de búsqueda binario negro como estructura de datos. Más particularmente, la presente invención facilita la implementación de una búsqueda binaria para acceder a elementos de datos almacenados en una matriz ordenada por posición, en lugar de por valor de clave. Esto se logra mediante la generación de un árbol de búsqueda binario rojo-negro equilibrado para una matriz ordenada de elementos de datos en la que la información almacenada en cada nodo del árbol incluye: un valor de clave un color un puntero izquierdo para indicar la presencia de un niño a la izquierda Del nodo un puntero derecho para indicar la presencia de un niño a la derecha del nodo un recuento de descendientes a lo largo de una rama a la izquierda del nodo y un recuento de descendientes a lo largo de una rama a la derecha del nodo. Un método para acceder a elementos de datos almacenados en una matriz ordenada por posición que comprende las etapas de: a) proporcionar una matriz ordenada de elementos de datos; b) generar un árbol de búsqueda binario equilibrado para la matriz ordenada de elementos de datos utilizando una primera Segmento de código de ordenador basado en un conjunto de propiedades que controlan una estructura del árbol, en el que cada elemento de datos en el conjunto ordenado define un nodo en el árbol, y la información se almacena en cada nodo incluyendo: i) un valor de clave correspondiente a un dato Iii) un puntero izquierdo para indicar un niño a la izquierda del nodo; iv) un puntero derecho para indicar un niño a la derecha del nodo; v) Un recuento de los descendientes en todos los sub-árboles en una rama a la izquierda del nodo y vi) un recuento de los descendientes en todos los sub-árboles en una rama a la derecha del nodo y c) realizar una búsqueda binaria del árbol usando Un segundo segmento de código de ordenador para acceder a un elemento de datos solicitado en una posición dada en la matriz ordenada, haciendo referencia a los conteos de descendientes derecho e izquierdo en cada nodo en una ruta desde un nodo raíz del árbol al nodo del elemento de datos solicitado, En el que los siguientes pasos se ejecutan recursivamente a partir del nodo raíz hasta que se encuentra el elemento de datos solicitado: i) decidir una posición de un nodo actual refiriéndose a los recuentos de descendientes izquierdo y derecho en las ramas izquierda y derecha ii) determinar qué rama de El árbol para buscar comparando la posición dada del elemento de datos solicitado y la posición del nodo actual iii) designando un nodo superior en la rama determinada como el nodo actual y repitiendo pasos desde el paso decisivo si no se encuentra el elemento de datos solicitado En el nodo superior de la rama determinada. 2. Un método de acuerdo con la reivindicación 1, que comprende además la etapa de añadir un elemento de datos a la matriz ordenada insertando un nodo en el árbol. 3. Un método según la reivindicación 2, que comprende además la etapa de ajustar la estructura del árbol después de la inserción de un nodo de tal manera que el árbol cumple con el conjunto de propiedades que controlan su estructura. 4. Un método de acuerdo con la reivindicación 3, en el que la etapa de ajustar la estructura del árbol después de la inserción de un nodo incluye la etapa de realizar al menos una rotación local. 5. Un método de acuerdo con la reivindicación 3, en el que la etapa de ajustar la estructura del árbol después de la inserción de un nodo incluye la etapa de reconstruir los recuentos descendentes derecho e izquierdo para todos los nodos efectuados por el ajuste. 6. Un método de acuerdo con la reivindicación 1, que comprende además la etapa de eliminar un elemento de datos de la matriz ordenada suprimiendo un nodo del árbol. 7. Un método de acuerdo con la reivindicación 6, que comprende además la etapa de ajustar la estructura del árbol después de la supresión de un nodo de tal manera que el árbol cumple con el conjunto de propiedades que controlan su estructura. 8. Un método según la reivindicación 7, en el que la etapa de ajustar la estructura del árbol después de la supresión de un nodo incluye la etapa de realizar al menos una rotación local. 9. Un método de acuerdo con la reivindicación 7, en el que la etapa de ajustar la estructura del árbol después de la supresión de un nodo incluye la etapa de reconstruir los recuentos descendentes derecho e izquierdo para todos los nodos efectuados por el ajuste. 10. Un programa legible por máquina, incorporado tangiblemente en un medio legible por ordenador, que contiene instrucciones para controlar un sistema para acceder a elementos de datos almacenados en una matriz ordenada por posición que comprende: a) medios para generar un árbol de búsqueda binario equilibrado para una matriz ordenada de datos Elementos basados ​​en un conjunto de propiedades que controlan una estructura del árbol, en el que cada elemento de datos en la matriz ordenada define un nodo en el árbol y cada nodo contiene una pluralidad de campos de datos para almacenar información que incluye: i) un campo de valor de clave para Almacenar un valor de clave correspondiente a un elemento de datos en la matriz ordenada ii) un campo de color para almacenar un color seleccionado de un grupo consistente en rojo y negro iii) un campo de puntero izquierdo para almacenar un valor que indica la existencia de un niño a la izquierda de El nodo iv) un campo de puntero derecho para almacenar un valor que indica la existencia de un niño a la derecha del nodo v) un campo de conteo izquierdo para almacenar un valor igual a un número total de descendientes en todos los subárboles de una rama izquierda de El nodo y vi) un campo de recuento derecho para almacenar un valor igual a un número total de descendientes en todos los subárboles en una rama derecha del nodo y b) medios para realizar una búsqueda binaria del árbol para acceder a un elemento de datos solicitado En una posición dada en la matriz ordenada haciendo referencia a los valores almacenados en los campos de cuenta derecha e izquierda en cada nodo en una ruta desde un nodo raíz del árbol al nodo de la partida de datos solicitada, en el que los siguientes pasos se ejecutan recursivamente A partir del nodo raíz hasta encontrar el elemento de datos solicitado: i) decidir una posición de un nodo actual refiriéndose a los recuentos de descendientes izquierdo y derecho en las ramas izquierda y derecha ii) determinar qué rama del árbol buscar mediante la comparación del Posición dada del elemento de datos solicitado y la posición del nodo actual iii) designar un nodo superior en la rama determinada como el nodo actual y repetir pasos desde el paso de decisión si el elemento de datos solicitado no se encuentra en el nodo superior en el nodo determinado rama. 11. El programa legible por máquina de la reivindicación 10, que comprende además medios para añadir un elemento de datos a la matriz ordenada insertando un nodo en el árbol. 12. El programa legible por máquina de la reivindicación 11, que comprende además medios para ajustar la estructura del árbol después de la inserción de un nodo de tal manera que el árbol cumple con el conjunto de propiedades que controlan su estructura. 13. El programa legible por máquina de la reivindicación 12, en el que los medios para ajustar la estructura del árbol después de la inserción de un nodo incluyen medios para realizar al menos una rotación local. 14. El programa legible por máquina de la reivindicación 12, en el que los medios para ajustar la estructura del árbol después de la inserción de un nodo incluyen medios para reconstruir los conteos de descendientes derecho e izquierdo para todos los nodos efectuados por el ajuste. 15. El programa legible por máquina de la reivindicación 10, que comprende además medios para eliminar un elemento de datos de la matriz ordenada suprimiendo un nodo del árbol. 16. El programa legible por máquina de la reivindicación 15, que comprende además medios para ajustar la estructura del árbol después de la supresión de un nodo de tal manera que el árbol cumple con el conjunto de propiedades que controlan su estructura. 17. El programa legible por máquina de la reivindicación 16, en el que los medios para ajustar la estructura del árbol después de la supresión de un nodo incluyen medios para realizar al menos una rotación local. 18. El programa legible por máquina de la reivindicación 16, en el que los medios para ajustar la estructura del árbol después de la supresión de un nodo incluyen medios para reconstruir los recuentos descendentes derecho e izquierdo para todos los nodos efectuados por el ajuste. 19. Un método para generar un árbol de búsqueda binario equilibrado para una matriz ordenada de elementos de datos que utilizan un segmento de código de ordenador, que comprende los pasos de: a) proporcionar una pluralidad de nodos que tienen cada uno un valor de clave correspondiente a un elemento de datos en la matriz ordenada B) asignar un color a cada nodo utilizando el segmento de código de ordenador basado en un conjunto de propiedades que controlan una estructura del árbol, en el que el color de un nodo se selecciona del grupo consistente en rojo y negro c) asignando un papel a cada uno En el árbol que utiliza el segmento de código de ordenador, en el que la función de cada nodo se selecciona del grupo que consiste en niño, padre, tío y abuelo, dependiendo de la relación de cada nodo con un nodo de referencia y d) seguimiento de un número total de Descendientes en una rama a la izquierda de cada nodo y un número total de descendientes en una rama a la derecha de cada nodo para facilitar una búsqueda binaria del árbol por posición, así como por el valor de clave utilizando el segmento de código de computadora para ejecutar la siguiente Pasos que comienzan recursivamente desde un nodo raíz hasta que se encuentra un elemento de datos solicitado en una posición dada: i) decidir una posición de un nodo actual refiriéndose a los números descendentes izquierdo y derecho en las ramas izquierda y derecha ii) determinar qué rama del Árbol para buscar comparando la posición dada del elemento de datos solicitado y la posición del nodo actual iii) designando un nodo superior en la rama determinada como el nodo actual y repitiendo pasos desde el paso decisivo si el elemento de datos solicitado no se encuentra en El nodo superior en la rama determinada. Una parte de la divulgación de este documento de patente contiene material que está sujeto a protección de derechos de autor. El titular de los derechos de autor no tiene ninguna objeción a la reproducción por parte de cualquiera de los documentos de patente o de la patente, tal como aparece en la Oficina de Patentes y Marcas, archivo de patente o registros, pero de otro modo se reserva todos los derechos de autor. Antecedentes de la invención La presente invención se refiere a estructuras de datos y, más particularmente, a un sistema y método para implementar operaciones de establecimiento dinámico sobre datos almacenados en una matriz ordenada usando un árbol de búsqueda binario rojo-negro híbrido. 2. Antecedentes de la técnica relacionada Los árboles de búsqueda binaria son estructuras de datos que almacenan colecciones de elementos que se pueden ordenar, tales como números enteros. En un árbol de búsqueda binario, un elemento de datos se almacena en una raíz. Los elementos más pequeños se organizan recursivamente en un subárbol a la izquierda de la raíz, mientras que los elementos mayores se almacenan recursivamente en un subárbol a la derecha de la raíz, como se ilustra por ejemplo en la FIG. 1. Los subárboles derecho e izquierdo contienen nodos que almacenan los elementos de la colección. Los expertos en la técnica apreciarán fácilmente que hay muchos árboles de búsqueda posibles para una colección dada de artículos. Los árboles de búsqueda binarios admiten operaciones de conjunto dinámico estándar como búsqueda, inserción y eliminación. Se realiza una búsqueda para determinar si un elemento está contenido en un árbol y, si es así, devuelve el elemento. Insert se implementa para agregar un elemento a una colección almacenada en un árbol, si aún no está presente, y se implementa la eliminación para eliminar un elemento de una colección almacenada en un árbol. Un árbol de búsqueda binario de altura h puede implementar cualquier operación de conjunto dinámico estándar en tiempo O (h). Por lo tanto, las operaciones de ajuste son rápidas si la altura del árbol es pequeña, pero si la altura del árbol es grande, su rendimiento puede ser mejor que las operaciones implementadas con una lista enlazada de elementos de datos. Un árbol rojo-negro es un árbol binario de la búsqueda con un pedacito adicional de almacenaje por nodo: su color, que puede ser rojo o negro. Al restringir la forma en que los nodos pueden ser coloreados en cualquier trayectoria desde la raíz a una hoja, los árboles rojo-negros aseguran que ninguna trayectoria es el doble que cualquier otra, de modo que el árbol esté aproximadamente equilibrado. Así, las operaciones de ajuste dinámico básico en una te roja-negra con n nodos toman tiempo O (lg n) en el peor de los casos. Cada nodo de un árbol rojo-negro contiene el color de los campos, la clave, el puntero secundario izquierdo, el puntero secundario derecho y el padre. Si no existe un hijo o el padre del nodo, el campo de puntero correspondiente del nodo contiene el valor NIL. NILs se consideran como punteros a los nodos externos (hojas) del árbol binario de la búsqueda, y los nudos normales, que llevan la llave son considerados como nodos internos del árbol. Un árbol binario de búsqueda es un árbol rojo-negro si satisface las siguientes propiedades rojo-negro: 1) Cada nodo es rojo o negro. 2) La raíz es negra. 3) Cada hoja (NIL) es negra. 4) Si un nodo es rojo, entonces sus dos hijos son negros. 5) Para cada nodo, todas las rutas del nodo a las hojas descendentes contienen el mismo número de nodos negros. A menudo, grandes conjuntos de elementos de datos se muestran en forma tabular, donde los elementos de datos se organizan en filas. En muchas aplicaciones, por ejemplo, en carteras de inversión que contienen una multiplicidad de instrumentos financieros, las filas de la tabla se mantienen en orden ordenado, y hay frecuentes inserciones y supresiones de fila única que deben mostrarse en tiempo real. Hay varias aplicaciones informáticas que están actualmente disponibles para mostrar datos tabulares. Dos utilizados comúnmente son tablas XRT para aplicaciones basadas en Motif y JTables para aplicaciones basadas en Java. Estas aplicaciones presentan una vista en la tabla que consiste en un número fijo de filas y columnas que cabrán en una pantalla. Detrás de esta vista, se encuentra el código de aplicación que suministra datos a la vista. En Java, este código se denomina TableModel. La JTable y otras aplicaciones similares recuperan datos llamando al modelo de datos y solicitando el valor en una celda especificada por índice de filas y columnas. A medida que el usuario se desplaza alrededor de la tabla, hay una cantidad enorme de llamadas al modelo de datos a medida que las diferentes celdas se mueven a la vista. La manera clara para que el TableModel almacene datos está en una matriz de filas, donde cada fila contiene una matriz de columnas. En la mayoría de las aplicaciones de tabla, este método es bastante apropiado, ya que proporciona acceso rápido a cualquier célula individual mediante la indexación en la matriz de filas, a continuación, la indexación en la matriz de columnas. En las tablas en las que las filas no están clasificadas o hay cambios de filas poco frecuentes, este método es ideal. Si la matriz está ordenada pero no cambia, se puede utilizar cualquier algoritmo de clasificación rápida para crear la matriz ordenada, y luego acceder a los datos rápidamente. Si la matriz cambia con frecuencia, pero el orden no es importante, las nuevas filas se pueden agregar al final de la matriz muy rápidamente. Sin embargo, surge un problema cuando las filas de la tabla se mantienen en orden ordenado y hay adiciones y supresiones frecuentes, como es común en las carteras de inversión. Si se utiliza una representación de matriz, para insertar una nueva fila en la tabla, todas las filas debajo de la nueva fila deben desplazarse hacia abajo, en orden ordenado, para dejar espacio a la nueva fila. Esto toma tiempo proporcional al número de filas de la tabla. Si la tabla es grande y las inserciones son frecuentes, habrá un problema de rendimiento. Este problema se puede superar almacenando los datos en un árbol de búsqueda binario en lugar de en una matriz de filas y columnas, ya que las operaciones de conjunto tales como inserciones y supresiones tienen lugar en un árbol de búsqueda binario estándar en tiempo O (h) o en una Árbol rojo-negro en O (lg n) tiempo en el peor de los casos. Sin embargo, los árboles binarios de búsqueda, incluidos los árboles rojo-negro, no proporcionan acceso a los elementos de datos por su posición en una matriz. Más bien, proporcionan acceso a los elementos de datos por valor clave. Por ejemplo, si una matriz de datos consiste en un conjunto de transacciones que implican valores de renta fija que se muestran en el orden de fecha de entrada, se puede generar un árbol de búsqueda binario que permite al usuario realizar operaciones de conjunto dinámico estándar tales como búsqueda, En tiempo O (h). Pero cuando se le pide al TableModel que busque y devuelva un comercio en una posición particular de la tabla, en lugar de uno con datos de entrada particulares, no puede hacerlo. En los árboles convencionales de búsqueda binaria, incluidos los árboles rojo-negro, no hay acceso directo a un elemento de datos por su posición, a diferencia de una matriz en la que los datos pueden ser recuperados por índice de filas y columnas. Por lo tanto, sería beneficioso construir una estructura de datos, y preferiblemente un árbol rojo-negro modificado que pueda facilitar la evaluación de los elementos de datos en posiciones dadas en una tabla de filas ordenadas, tan rápidamente como las filas se pueden encontrar por valor de clave. Sumario de la invención La presente invención se refiere a un sistema y un método para implementar operaciones de establecimiento dinámico sobre datos almacenados en una matriz ordenada usando un árbol de búsqueda binario rojo-negro híbrido como estructura de datos. Más particularmente, la presente invención facilita la implementación de una búsqueda binaria para acceder a elementos de datos almacenados en una matriz ordenada por posición o índice, así como por valor de clave, como en árboles convencionales negro-rojos. Esto se logra mediante la generación de un árbol de búsqueda binario rojo-negro equilibrado para una matriz ordenada de elementos de datos, en la que la información almacenada en cada nodo del árbol de búsqueda incluye: un valor de clave correspondiente a un elemento de datos en la matriz ordenada, Grupo que consiste en rojo y negro un puntero izquierdo para indicar la presencia de un niño a la izquierda del nodo un puntero derecho para indicar la presencia de un niño a la derecha del nodo un recuento de descendientes a lo largo de una rama a la izquierda de la Nodo y un recuento de descendientes a lo largo de una rama a la derecha del nodo. Usando esta estructura de datos, puede realizarse una búsqueda binaria para acceder y recuperar un elemento de datos seleccionado en una posición dada en el ordenamiento ordenado por referencia a los recuentos de descendientes derecho e izquierdo en cada nodo. Con respecto a los datos tabulares clasificados, la estructura de datos de la invención objeto puede encontrar filas en una posición dada en una tabla ordenada tan rápido como pueda con un valor de clave dado. Como resultado, las filas se pueden agregar, eliminar o actualizar en O (lg n) tiempo. Estos y otros aspectos del sistema y método de la presente invención resultarán más evidentes para los expertos en la técnica a partir de la siguiente descripción detallada de la invención tomada en conjunción con los dibujos descritos aquı en lo que sigue. Breve descripción de los dibujos Para que los expertos en la técnica a la que pertenezca la presente invención comprendan más fácilmente cómo emplearlos, puede hacerse referencia a los dibujos en los que: La FIG. La figura 1 es una ilustración de un árbol binario convencional en el que un elemento de datos y se almacena en el nodo raíz, y elementos más pequeños se organizan recursivamente en el subárbol izquierdo, mientras que los elementos mayores se organizan recursivamente en el subárbol derecho. 2 es una tabla de datos que muestra un conjunto de operaciones presentadas en filas ordenadas ordenadas por fecha de entrada FIG. 3 es una ilustración de un árbol de búsqueda binario rojo-negro generado a partir de los datos contenidos en la tabla de datos de la FIG. 2. con la fila de la tabla correspondiente al nodo raíz del árbol resaltado, donde se almacena información en cada nodo que incluye, entre otros, el número de descendientes a lo largo de las ramas derecha e izquierda del nodo FIG. 4 es una tabla que contiene la información almacenada en cada nodo en el árbol de búsqueda binario rojo-negro de la FIG. 3 La FIG. 5 muestra la tabla de datos de la FIG. 2. en el que se ha insertado una única fila de datos en la tabla, y en la que la fila insertada está resaltada. 6 es una ilustración del árbol de búsqueda binario rojo-negro de la FIG. 3. después de que la estructura del árbol ha sido ajustada para acomodar la inserción de la nueva fila de datos como se muestra en la tabla de la FIG. 5 La FIG. 7 muestra la tabla de datos de la FIG. En el que una única fila de datos ha sido suprimida de la tabla y la FIG. 8 es una ilustración del árbol de búsqueda binario rojo-negro de la FIG. 3. después de que la estructura del árbol ha sido ajustada para acomodar la supresión de una fila existente de datos como se muestra en la tabla de la FIG. 7. Descripción detallada de las formas de realización preferidas Con referencia ahora a los dibujos, se ilustra en la FIG. 2 a data table designated generally by reference numeral 10 which contains an array of data or information relating to a set of trades involving fixed income securities. In this example, data table 10 contains information concerning Treasury notes (TSY) and mortgage backed securities (MBS). Data table 10 contains a plurality of rows and columns. The columns of the data table contain information relating to the date of a trade, the name of the dealer involved in the trade, the name of the desk where the trade originated (e. g. TSY or MBS), the type of transaction (i. e. buy or sell) the quantity of securities transacted, the price of the securities transacted, and the net money associated with each trade. Each row of the data table represents a particular trade and they are organized or sorted by the date on which the trade occurred. In this example, the earliest trade in the table occurred on Jan. 1, 2002 and the latest trade occurred on Sep. 14, 2002. Data table 10 is preferably a JTable supported by a Java based TableModel. However, other computer applications may also be employed. Haciendo referencia a la FIG. 3. there is illustrated a red-black binary search tree designated by reference numeral 20 that has been generated from the information set forth in data table 10 of FIG. 2. with the highlighted row containing the trade that occurred on Apr. 14, 2002 serving as the root of the binary tree. The red black binary tree 20 of FIG. 3 is constructed based upon the red-black properties set forth hereinabove, namely, that every node in the tree is either red or black, the root of the tree is black, every leaf (NIL) is black, if a node is red, then both its children are black, and for each node in the tree, all paths from the node to descendant leaves contain the same number of black nodes. These predefined properties of a red-black tree are well known in the art. The following Java class generates the data structure of the hybrid red-black tree of the subject invention. This class, as well as other routines set forth herein, are based upon pseudocodes presented in Thomas H. Cormen, et al. Introduction to Algorithms . pp. 273293 (MIT Press, 2d ed. 2001), which is incorporated herein by reference. The nodal structure of the hybrid red-black tree of the subject invention is substantially identical to that of a conventional red-black tree, except that the following code is designed to store the number of descendants down each branch of a node. Continuing on with the example of FIGS. 2 and 3. the key values stored at the root and each internal node of the tree represent the trade date set forth in table 10 . For instance, the key value of the root is 414 which corresponds to the trade date of Apr. 14, 2002, located at row six of data table 10 . Similarly the red node to the left of the root contains the key value 321 representing the trade date of Mar. 21, 2002 located at row 4 of data table 10 . while the red node to the right of the root node contains the key value 714 corresponding to the trade date of Jul. 14, 2002, which is located at the tenth row of data table 10 . In addition to the key value, additional information relating to the structure of the tree is stored at each node of red-black binary tree 20 . This information, which is tabulated in FIG. 4 for illustrative purposes, includes traditional red-black tree information, namely, the node color (e. g. red or black), a left child pointer indicating the existence of a descendant to the left of the node and a right child pointer indicting the existence of a descendant to the right of the node. In accordance with the subject invention, additional information is stored at each node of the search tree, namely, the number of descendents contained in a branch to the left of each node and the number of descendants contained in a branch to the right of each node. This additional information facilitates a binary search of the red-black tree to access and retrieve data by position or index, as well as by key value. In accordance with the subject invention, all binary searches using the hybrid red-black tree disclosed herein begin at the last row located in the data table. Therefore, it is necessary to keep track of this row as it serves as a reference point for the operation. The following is a Java class that locates an element or item in a TableModel of a JTable by index or position. Object get(int index) if (lastIndex lt 0) while (lastNode sentinel) if (index lastIndex) else if (index lt lastIndex lastNode. leftCount index gt lastIndex lastNode. rightCount) if (lastNode. parent sentinel) else if (lastNode lastNode. parent. left) lastIndex lastIndex lastNode. rightCount 1 lastIndex lastIndex lastNode. leftCount 1 else if (index lt lastIndex) lastIndex lastIndex lastNode. rightCount 1 lastIndex lastIndex lastNode. leftCount 1 By way of example, referring to the data table of FIG. 2 in conjunction with the corresponding red-black binary search tree of FIG. 3. suppose that a request is made to retrieve the data in the ninth row of the table, as opposed to the trade that occurred on Jun. 21, 2002. Those skilled in the art and familiar with Java based applications will readily appreciate that in JTables, such requests are commonly made using the command getCellValue. Beginning at the root node of binary tree 20 . which in this example is row six, it is known that the first five rows are ordered recursively to the left of the root node (these rows are represented by nodes containing key values (i. e. trade dates) that are less than the key value of the root), while the last six rows are ordered recursively to the right of the root node (these rows are represented by nodes containing key values (i. e. trade dates) that are greater than the key value of the root). Since the request is for the ninth row of the table, the left branch of the tree is not searched. Instead, the right branch is searched. Looking to the first node of six in the right branch of the root, the left descendent count is equal to 3, and the right descendent count is equal to 2. Therefore, the ninth row must be down the left sub-branch, rather than the right sub-branch, because the eleventh and twelfth rows are obviously down the right sub-branch, based upon the right descendant count. So the search proceeds down the left sub-branch. At the parent node of the left sub-branch, it is determined that there is one descendant to the left of the node and one descendant to the right. Therefore, the ninth row in data table 10 must be the right child node, and indeed it is. In addition to supporting indexed access through binary searching based on descendant counts, the data structure disclosed herein supports standard dynamic set operations of insert, delete and retrieve by key value. These operations all work normally in O(lg n) time. Insertions and deletions are accomplished as in an ordinary binary search trees. However, because such operations result in modifications to the tree, the resulting structure may violate the red-black properties set forth hereinabove. To restore the red-black properties, the colors and pointer structures of some nodes in the tree must be changed. Changes to the pointer structure of a node are accomplished through rotations which are local operations that preserve the binary-search-tree property. There are two types of rotations: left rotations and right rotations. The following routine performs a left rotation and is designed to keep track of the number of descendants on each side of the node being operated upon. private void leftRotate(Node x) if (y. left sentinel) if (x. parent sentinel) else if (x x. parent. left) y. leftCount x. leftCount x. rightCount 1 This routine performs a right rotation and is designed to keep track of the number of descendants on each side of the node being operated upon. private void rightRotate(Node x) if (y. right sentinel) if (x. parent sentinel) else if (x x. parent. left) y. rightCount x. leftCount x. rightCount 1 When a node is inserted into a red-black tree, it is colored red. If the node has a red parent, then there is a violation of the red-black properties. If the uncle is also red, the parent and uncle are colored black, and the grandparent is colored red. Then a check is made to determine if a violation of the red-black properties remains. Otherwise, one or two rotations may be needed to satisfy the red-black properties, but no more than two rotations will be required in any case. By way of example, FIG. 6 illustrates the red-black tree of FIG. 3 after it has been modified following the insertion of a node as represented by the modified data table of FIG. 5. The following routine performs an insertion procedure in a red-black tree. This Java class includes code for tracking descendant counts. Initially, the item is inserted into the tree without concern for preserving the red-black properties. Node y sentinel boolean wentLeft false while (x sentinel) int comp keypareTo(x. key) while (x. parent sentinel) if (x x. parent. left) else if (comp lt 0) index index x. leftCount 1 Node z new Node(key) else if (wentLeft) After an item has been inserted into the binary tree, the following routine is employed to re-establish the red-black properties of the tree, if necessary. while (z. parent. color red) if (z. parent z. parent. parent. left) if (z z. parent. right) if (z z. parent. left) When deleting a node from a tree, if the node that was excised was red, no additional steps are needed since the red-black tree properties remain intact. Otherwise, if the excised node was black, operations proceed as if there is an extra black node in the tree, and the extra black node is moved up the branches of the tree until the red-black properties are satisfied. At most, three rotations will be required to satisfy all of the properties. By way of example, FIG. 7 illustrates the red-black tree of FIG. 3 after it has been modified following the deletion of a node as represented by the modified data table of FIG. 8. Initially, before a deletion procedure can begin, the item to be deleted must be located or looked up. The following code is used to perform the initial search for the item to be deleted. while (z sentinel) int comp keypareTo(z. key) else if (comp lt 0) index index z. leftCount 1 index index z. leftCount After the item to be deleted has been located, the following code performs the deletion of the node. This routine includes code for tracking descendant counts. Node x sentinel Node y sentinel if (z. left sentinel z. right sentinel) if (y. left sentinel) if (y. parent sentinel) else if (y y. parent. left) if (y. color black) This routine rebuilds the descendant counts from the given node to the root after the node has been spliced from the tree. private void fixupCounts(Node x) while (x sentinel) if (x. left sentinel) x. leftCount x. left. leftCount x. left. rightCount 1 if (x. right sentinel) x. rightCount x. right. leftCount x. right. rightCount 1 This routine re-establishes the red-black properties of the tree after the deletion procedure, if necessary. That is, if the deleted node was red, this routine is not performed. private void rbDeleteFixup(Node x) while (x root ampamp x. color black) if (x x. parent. left) if (w. left. color black ampamp w. right. color black) if (w. right. color black) if (w. left. color black ampamp w. right. color black) if (w. left. color black) Although the system and method of the subject invention has been described with respect to preferred embodiments, those skilled in the art will readily appreciate that changes and modifications may be made thereto without departing from the spirit and scope of the present invention as defined by the appended claims. Method for creating a geometric hash tree in a document processing system Hewlett-Packard Development Company, L. P. Data structure and storage and retrieval method supporting ordinality based searching and data retrieval , Schneier B. Red-Black Trees , Apr. 1992, Dr. Dobbs Journal vol. 17, No. 4, p. 42, 44-46. Thomas H. Cormen, et al. Introduction to Algorithms, pp. 273-293 (MIT Press, 2d ed. 2001). Idx Systems Corporation Efficient indexing of hierarchical relational database records Blackrock Financial Management, Inc. System and method for implementing dynamic set operations on data stored in a sorted array Teradata Us, Inc. Efficiently performing inequality joins System and method for facilitating full text searching utilizing inverted keyword indices Using cross-site relationships to generate recommendations System and method for the dynamic generation of correlation scores between arbitrary objects Aggregate Knowledge Inc. Methods and systems for caching data using behavioral event correlations Portable scanning device Aggregate Knowledge, Inc. System and method for the dynamic generation of correlation scores between arbitrary objects Document enhancement system and method Secure data gathering from rendered documents Automatic modification of web pages Identifying a document by performing spectral analysis on the contents of the document Capturing text from rendered documents using supplemental information Performing actions based on capturing information from rendered documents, such as documents under copyright Triggering actions in response to optically or acoustically capturing keywords from a rendered document Data capture from rendered documents using handheld device Aggregate Knowledge, Inc. System and method for the dynamic generation of correlation scores between arbitrary objects Processing techniques for text capture from a rendered document Archive of text captures from rendered documents Aggregate analysis of text captures performed by multiple users from rendered documents Association of a portable scanner with input/output and storage devices Optical scanners, such as hand-held optical scanners Handheld device for capturing text from both a document printed on paper and a document displayed on a dynamic display device

No comments:

Post a Comment