Percebi recentemente que existem muitos algoritmos por aí baseados em parte ou no todo em usos inteligentes de números em bases criativas. Por exemplo:
- Os heaps binomiais são baseados em números binários, e os heaps binomiais skew mais complexos são baseados em números binários inclinados.
- Alguns algoritmos para gerar permutações ordenadas lexicograficamente são baseados no sistema numérico fatorádico.
- As tentativas podem ser pensadas como árvores que procuram um dígito da string por vez, em busca de uma base apropriada.
- As árvores de codificação Huffman são projetadas para que cada aresta da árvore codifique um zero ou um em alguma representação binária.
- A codificação de Fibonacci é usada na pesquisa de Fibonacci e para inverter certos tipos de logaritmos.
Minha pergunta é: que outros algoritmos existem que usam um sistema numérico inteligente como uma etapa-chave de sua intuição ou prova? . Estou pensando em fazer uma palestra sobre o assunto, então quanto mais exemplos eu tiver para tirar proveito, melhor.
algorithm
math
data-structures
numbers
number-systems
templatetypedef
fonte
fonte
Respostas:
Chris Okasaki tem um capítulo muito bom em seu livro Purely Functional Data Structures que discute "Representações Numéricas": essencialmente, pegue alguma representação de um número e converta-a em uma estrutura de dados. Para dar uma ideia, aqui estão as seções desse capítulo:
Alguns dos melhores truques, destilados:
Aqui está também a lista de referência para esse capítulo:
fonte
etc ...
Esta lista é um bom ponto de partida.
fonte
Li sua pergunta outro dia e hoje me deparei com um problema: Como faço para gerar todas as partições de um conjunto? A solução que me ocorreu e que usei (talvez por ter lido sua pergunta) foi esta:
Para um conjunto com (n) elementos, onde preciso de (p) partições, conte todos os (n) números de dígitos na base (p).
Cada número corresponde a um particionamento. Cada dígito corresponde a um elemento do conjunto e o valor do dígito informa em qual partição colocar o elemento.
Não é incrível, mas é legal. É completo, não causa redundância e usa bases arbitrárias. A base que você usa depende do problema de particionamento específico.
fonte
111222
diferente de222111
?Recentemente descobri um algoritmo legal para gerar subconjuntos em ordem lexicográfica com base nas representações binárias dos números entre 0 e 2 n - 1. Ele usa os bits dos números para determinar quais elementos devem ser escolhidos para o conjunto e para reordenar localmente os conjuntos gerados para colocá-los em ordem lexicográfica. Se você estiver curioso, tenho um artigo postado aqui .
Além disso, muitos algoritmos são baseados em escala (como uma versão fracamente polinomial do algoritmo de fluxo máximo de Ford-Fulkerson), que usa a representação binária dos números no problema de entrada para refinar progressivamente uma aproximação aproximada em uma solução completa.
fonte
Não é exatamente um sistema de base inteligente, mas um uso inteligente do sistema de base: as sequências de Van der Corput são sequências de baixa discrepância formadas pela inversão da representação de números base-n. Eles são usados para construir as sequências Halton 2-d que se parecem com isso .
fonte
Lembro-me vagamente de algo sobre sistemas de base dupla para acelerar algumas multiplicações de matrizes.
O sistema de base dupla é um sistema redundante que usa duas bases para um número.
Redundante significa que um número pode ser especificado de várias maneiras.
Você pode procurar o artigo "Algoritmo Híbrido para a Computação do Polinômio Matricial", de Vassil Dimitrov, Todor Cooklev.
Tentando dar a melhor visão geral curta que posso.
Eles estavam tentando calcular o polinômio da matriz
G(N,A) = I + A + ... + A^{N-1}
.Supondo que N é composto
G(N,A) = G(J,A) * G(K, A^J)
, se aplicarmos J = 2, obteremos:Além disso,
Como é "óbvio" (brincando) que algumas dessas equações são rápidas no primeiro sistema e algumas melhores no segundo - é uma boa ideia escolher a melhor das que dependem
N
. Mas isso exigiria uma operação de módulo rápida para 2 e 3. Aqui está porque a base dupla entra - você pode basicamente fazer a operação de módulo rápido para ambos, dando-lhe um sistema combinado:Leia o artigo para uma melhor explicação, pois não sou um especialista nesta área.
fonte
RadixSort pode usar várias bases numéricas. http://en.wikipedia.org/wiki/Radix_sort Implementação muito interessante de um bucketSort.
fonte
aqui está uma boa postagem sobre o uso de números ternários para resolver o problema da "moeda falsa" (onde você deve detectar uma única moeda falsa em um saco de moedas normais, usando um saldo o mínimo de vezes possível)
fonte
Sequências de hash (por exemplo, no algoritmo Rabin-Karp ) geralmente avaliam a sequência como um número de base b consistindo de n dígitos (onde n é o comprimento da sequência e b é alguma base escolhida que é grande o suficiente). Por exemplo, a string "ABCD" pode ser hash como:
Substituindo valores ASCII por caracteres e considerando b como 256, isso se torna,
Porém, na maioria das aplicações práticas, o valor resultante é considerado módulo de algum número de tamanho razoável para manter o resultado suficientemente pequeno.
fonte
A exponenciação por quadrado é baseada na representação binária do expoente.
fonte
No
Hackers Delight
(um livro que todo programador deveria conhecer aos meus olhos), há um capítulo completo sobre bases nãousais, como -2 como base (sim, bases negativas direitas) ou -1 + i (i como unidade imaginária sqrt (-1)) como base. Também faço um bom cálculo de qual é a melhor base (em termos de design de hardware, para todos que não querem ler: a solução da equação é e, então você pode ir com 2 ou 3, 3 seria um pouco melhor (fator 1.056 vezes melhor que 2) - mas é técnico mais prático).Outras coisas que me vêm à mente são o contador cinza (quando você conta neste sistema apenas mudanças de 1 bit, você costuma usar essa propriedade no design de hardware para reduzir problemas de metaestabilidade) ou a generalização da já mencionada codificação de Huffmann - a codificação aritmética.
fonte
A criptografia faz uso extensivo de anéis inteiros (aritmática modular) e também de campos finitos, cujas operações são intuitivamente baseadas no comportamento de polinômios com coeficientes inteiros.
fonte
Eu realmente gosto deste para converter números binários em códigos Gray: http://www.matrixlab-examples.com/gray-code.html
fonte
Ótima pergunta. A lista é realmente longa. A hora de dizer é uma instância simples de bases mistas (dias | horas | minutos | segundos | manhã / tarde)
Eu criei uma estrutura de n-tupla de enumeração de meta-base se você estiver interessado em ouvir sobre isso. É um açúcar sintático muito doce para sistemas de numeração de base. Ainda não foi lançado. Email meu nome de usuário (no gmail).
fonte
Um dos meus favoritos usando a base 2 é a codificação aritmética . É incomum porque a estrutura do algoritmo usa representações de números entre 0 e 1 em binário.
fonte
Pode ser que AKS seja o caso.
fonte