La tarea es encontrar una manera de dibujar una línea horizontal en una matriz de enteros de 16 bits.
Asumimos una matriz de 256x192 píxeles con 16 píxeles por palabra. Una línea es una serie contigua de bits set (1). Las líneas pueden comenzar en el medio de cualquier palabra, superponerse con otras palabras y terminar en cualquier palabra; También pueden comenzar y terminar en la misma palabra. Es posible que no se envuelvan a la siguiente línea. Sugerencia: las palabras intermedias son fáciles: solo escriba 0xffff, pero los bordes serán complicados, al igual que manejar el caso para el inicio y el final en la misma palabra. Una función / procedimiento / rutina debe tomar una coordenada x0 y x1 que indique los puntos de inicio y parada horizontales, así como una coordenada ay.
Me excluyo de esto porque diseñé un algoritmo casi idéntico para un procesador integrado, pero tengo curiosidad por saber cómo lo harían otros. Puntos de bonificación por usar operaciones relativamente rápidas (por ejemplo, una operación de multiplicación de 64 bits o de coma flotante no sería rápida en una máquina integrada, pero un simple cambio de bits sería).
fuente
Respuestas:
Este código supone que tanto x0 como x1 son puntos finales inclusivos, y que las palabras son little endian (es decir, el (0,0) píxel se puede establecer con
array[0][0]|=1
).fuente
Pitón
El truco principal aquí es usar una tabla de búsqueda para almacenar máscaras de bits de los píxeles. Esto ahorra algunas operaciones. Una tabla de 1kB no es tan grande incluso para una plataforma integrada en estos días
Si el espacio es realmente limitado, por el precio de un par de & 0xf, la tabla de búsqueda se puede reducir a solo 64B
Este código está en Python, pero sería fácil de transferir a cualquier lenguaje que admita operaciones de bits.
Si usa C, podría considerar desenrollar el bucle usando el dispositivo
switch
de Duff . Como la línea tiene un máximo de 16 palabras de ancho, extendería lasswitch
14 líneas y prescindiría delwhile
total.fuente
Aquí hay una versión C de mi respuesta de Python usando la instrucción switch en lugar del ciclo while y la indexación reducida al incrementar un puntero en lugar del índice de matriz
El tamaño de la tabla de búsqueda se puede reducir sustancialmente usando T [x1 y 0xf] y U [x2 y 0xf] para un par de instrucciones adicionales
fuente
Scala,
7s / 1M líneas4.1s / 1M líneasprimera implementación:
Después de eliminar la llamada al método interno, y reemplazar el for- con un ciclo while, en mi 2Ghz Single Core con Scala 2.8, absuelve 1 Mio. Líneas en 4.1s sec. en lugar de los 7 iniciales.
Código de prueba e invocación:
Pruebas de rendimiento:
Probado con el tiempo de la herramienta Unix, comparando el tiempo de usuario, incluido el tiempo de inicio, el código compilado, sin fase de inicio de JVM.
El aumento de la cantidad de líneas muestra que, por cada millón nuevo, necesita 3.3 s adicionales.
fuente