Recientemente me di cuenta de que existen muchos algoritmos basados en parte o en su totalidad en usos inteligentes de números en bases creativas. Por ejemplo:
- Los montones binomiales se basan en números binarios, y los montones binomiales sesgados más complejos se basan en números binarios sesgados.
- Algunos algoritmos para generar permutaciones ordenadas lexicográficamente se basan en el sistema numérico factorádico.
- Los intentos se pueden considerar como árboles que miran un dígito de la cadena a la vez, para obtener una base adecuada.
- Los árboles de codificación de Huffman están diseñados para que cada borde del árbol codifique un cero o uno en alguna representación binaria.
- La codificación de Fibonacci se utiliza en la búsqueda de Fibonacci y para invertir ciertos tipos de logaritmos.
Mi pregunta es: ¿qué otros algoritmos existen que utilizan un sistema numérico inteligente como un paso clave de su intuición o prueba? . Estoy pensando en organizar una charla sobre el tema, así que cuantos más ejemplos tenga, mejor.
algorithm
math
data-structures
numbers
number-systems
templatetypedef
fuente
fuente
Respuestas:
Chris Okasaki tiene un capítulo muy bueno en su libro Estructuras de datos puramente funcionales que analiza las "Representaciones numéricas": esencialmente, tome alguna representación de un número y conviértala en una estructura de datos. Para darle un toque, aquí están las secciones de ese capítulo:
Algunos de los mejores trucos, destilados:
Aquí también está la lista de referencia para ese capítulo:
fuente
etc ...
Esta lista es un buen punto de partida.
fuente
Leí su pregunta el otro día y hoy me enfrenté a un problema: ¿Cómo puedo generar todas las particiones de un conjunto? La solución que se me ocurrió y que utilicé (tal vez debido a leer su pregunta) fue esta:
Para un conjunto con (n) elementos, donde necesito (p) particiones, cuente todos los (n) números de dígitos en la base (p).
Cada número corresponde a una partición. Cada dígito corresponde a un elemento en el conjunto, y el valor del dígito le dice en qué partición colocar el elemento.
No es sorprendente, pero es genial. Está completo, no genera redundancia y utiliza bases arbitrarias. La base que utilice depende del problema de particionamiento específico.
fuente
111222
diferencia de222111
?Recientemente encontré un algoritmo genial para generar subconjuntos en orden lexicográfico basado en las representaciones binarias de los números entre 0 y 2 n - 1. Utiliza los bits de los números tanto para determinar qué elementos deben elegirse para el conjunto como para reordenar localmente los conjuntos generados para ponerlos en orden lexicográfico. Si tiene curiosidad, tengo un artículo publicado aquí .
Además, muchos algoritmos se basan en el escalado (como una versión de polinomio débil del algoritmo de flujo máximo de Ford-Fulkerson), que utiliza la representación binaria de los números en el problema de entrada para refinar progresivamente una aproximación aproximada en una solución completa.
fuente
No es exactamente un sistema de base inteligente, sino un uso inteligente del sistema de base: las secuencias de Van der Corput son secuencias de baja discrepancia formadas invirtiendo la representación de números en base n. Se utilizan para construir secuencias Halton bidimensionales que se parecen a esto .
fuente
Recuerdo vagamente algo sobre los sistemas de base doble para acelerar la multiplicación de matrices.
El sistema de base doble es un sistema redundante que utiliza dos bases para un número.
Redundante significa que un número se puede especificar de muchas formas.
Puede buscar el artículo "Algoritmo híbrido para el cálculo del polinomio matricial" de Vassil Dimitrov, Todor Cooklev.
Tratando de dar la mejor descripción breve que pueda.
Intentaban calcular un polinomio matricial
G(N,A) = I + A + ... + A^{N-1}
.Suponiendo que N es compuesto
G(N,A) = G(J,A) * G(K, A^J)
, si aplicamos J = 2, obtenemos:además,
Como es "obvio" (en broma) que algunas de estas ecuaciones son rápidas en el primer sistema y otras mejores en el segundo, es una buena idea elegir la mejor de las que dependen
N
. Pero esto requeriría una operación de módulo rápida para 2 y 3. Aquí está la razón por la que entra la base doble: básicamente puede hacer la operación de módulo rápidamente para ambos, lo que le brinda un sistema combinado:Mire el artículo para una mejor explicación, ya que no soy un experto en esta área.
fuente
RadixSort puede utilizar varias bases numéricas. http://en.wikipedia.org/wiki/Radix_sort Implementación bastante interesante de un bucketSort.
fuente
aquí hay una buena publicación sobre el uso de números ternarios para resolver el problema de las "monedas falsas" (donde debe detectar una sola moneda falsificada en una bolsa de monedas normales, usando un saldo el menor número de veces posible)
fuente
Las cadenas de hash (por ejemplo, en el algoritmo de Rabin-Karp ) a menudo evalúan la cadena como un número base-b que consta de n dígitos (donde n es la longitud de la cadena y b es una base elegida que es suficientemente grande). Por ejemplo, la cadena "ABCD" se puede codificar como:
Sustituyendo los valores ASCII por caracteres y tomando b como 256, esto se convierte en,
Sin embargo, en la mayoría de las aplicaciones prácticas, el valor resultante se toma como módulo de un número de tamaño razonable para mantener el resultado lo suficientemente pequeño.
fuente
La exponenciación al elevar al cuadrado se basa en la representación binaria del exponente.
fuente
En
Hackers Delight
(un libro que todo programador debería saber en mis ojos) hay un capítulo completo sobre bases inusuales, como -2 como base (sí, bases negativas derechas) o -1 + i (i como unidad imaginaria sqrt (-1)) como base. También me gustó calcular cuál es la mejor base (en términos de diseño de hardware, para todos los que no quieran leerlo: la solución de la ecuación es e, así que puedes ir con 2 o 3, 3 sería un poco mejor (factor 1.056 veces mejor que 2) - pero es técnico más práctico).Otras cosas que me vienen a la mente son el contador gris (usted cuando cuenta en este sistema solo cambios de 1 bit, a menudo usa esta propiedad en el diseño de hardware para reducir los problemas de metaestabilidad) o la generalización de la codificación de Huffmann ya mencionada: la codificación aritmética.
fuente
La criptografía hace un uso extensivo de anillos enteros (aritmáticos modulares) y también de campos finitos, cuyas operaciones se basan intuitivamente en el comportamiento de los polinomios con coeficientes enteros.
fuente
Realmente me gusta este para convertir números binarios en códigos Gray: http://www.matrixlab-examples.com/gray-code.html
fuente
Gran pregunta. La lista es muy larga. Decir la hora es una instancia simple de bases mixtas (días | horas | minutos | segundos | am / pm)
He creado un marco n-tuple de enumeración de metabase si está interesado en conocerlo. Es un azúcar sintáctico muy dulce para los sistemas de numeración de bases. Aún no se ha lanzado. Envía mi nombre de usuario por correo electrónico (en gmail).
fuente
Uno de mis favoritos con base 2 es la codificación aritmética . Es inusual porque el corazón del algoritmo usa representaciones de números entre 0 y 1 en binario.
fuente
Puede ser AKS es el caso.
fuente