Algoritmi basati su sistemi di base numerica? [chiuso]


87

Ho notato di recente che ci sono moltissimi algoritmi là fuori basati in parte o interamente su usi intelligenti dei numeri in basi creative. Per esempio:

  • Gli heap binomiali si basano su numeri binari e gli heap binomiali inclinati più complessi si basano su numeri binari obliqui.
  • Alcuni algoritmi per la generazione di permutazioni ordinate lessicograficamente si basano sul sistema numerico fattoriale.
  • I tentativi possono essere pensati come alberi che guardano una cifra della stringa alla volta, per una base appropriata.
  • Gli alberi di codifica di Huffman sono progettati per avere ogni bordo dell'albero codificando uno zero o uno in una rappresentazione binaria.
  • La codifica di Fibonacci viene utilizzata nella ricerca di Fibonacci e per invertire alcuni tipi di logaritmi.

La mia domanda è: quali altri algoritmi esistono là fuori che usano un sistema numerico intelligente come passaggio chiave della loro intuizione o prova? . Sto pensando di mettere insieme un discorso sull'argomento, quindi più esempi devo attingere, meglio è.


5
Anche a me piace la domanda, ma come scegli la risposta "corretta"? Dovrebbe essere un wiki della comunità?
vlad

14
Questo dovrebbe essere il wiki della comunità
BlueRaja - Danny Pflughoeft

18
@close elettore: se una domanda sugli algoritmi è fuori tema in SO, non so cosa sia in argomento qui. Domande da principiante idiote sui CSS? "posso Haz regex plzz"? "plz email teh codez 4 mi hoemwok"?
MAK

2
Guida galattica per autostoppisti: qual è la risposta alla vita, all'universo e a tutto? Risposta di Deep Thought: 42. La Terra come macchina per trovare la domanda: cos'è 9 x 6? ed è per questo che è tutto così fottuto. Visto su una maglietta: 9 (base 13) x 6 (base 13) = 42 (base 13). QED.
Chris Walton

"Quali altri algoritmi esistono là fuori che utilizzano un sistema numerico intelligente come passaggio chiave della loro intuizione o prova?" Stack Overflow non è un motore di raccomandazione , un elenco di tutte le cose o una link farm . Algoritmi per risolvere domande pratiche di programmazione, assolutamente. Clearinghouse per algoritmi intelligenti, no. Potresti chiedere al meta di Mathematics se lo vogliono.

Risposte:


39

Chris Okasaki ha un ottimo capitolo nel suo libro Purely Functional Data Structures che discute "Rappresentazioni numeriche": essenzialmente, prendi una rappresentazione di un numero e convertila in una struttura dati. Per dare un sapore, ecco le sezioni di quel capitolo:

  1. Sistemi numerici posizionali
  2. Numeri binari (elenchi binari ad accesso casuale, rappresentazioni senza zero, rappresentazioni pigre, rappresentazioni segmentate)
  3. Numeri binari obliqui (elenchi di accesso casuale binari obliqui, cumuli binomiali inclinati)
  4. Numeri trinari e quaternari

Alcuni dei migliori trucchi, distillati:

  • Distinguere tra rappresentazioni di numeri dense e sparse (di solito lo vedi nelle matrici o nei grafici, ma è applicabile anche ai numeri!)
  • I sistemi numerici ridondanti (sistemi che hanno più di una rappresentazione di un numero) sono utili.
  • Se si dispone la prima cifra in modo che sia diverso da zero o si utilizza una rappresentazione zero zero, il recupero dell'header della struttura dati può essere efficiente.
  • Evita i prestiti a cascata (dal prendere la coda dell'elenco) e i carry (dal contenuto nell'elenco) segmentando la struttura dei dati

Ecco anche l'elenco di riferimento per quel capitolo:

  • Guibas, McCreight, Plass e Roberts: una nuova rappresentazione per elenchi lineari.
  • Myers: uno stack di accesso casuale applicativo
  • Carlsson, Munro, Poblete: una coda binomiale implicita con tempo di inserimento costante.
  • Kaplan, Tarjan: elenchi puramente funzionali con catenazione tramite rallentamento ricorsivo.

2
+1 Ho una copia del libro di Okasaki ... Ho adorato quei capitoli e sono in parte il motivo per cui ho posto questa domanda (gli heap binomiali skew bootstrap sono davvero fantastici!) Non l'ho letto fino in fondo, però forse dovrei. Inoltre, controllerò quei riferimenti; hanno un bell'aspetto.
templatetypedef

La tesi completa di Okasaky è disponibile online: cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi

20

"I numeri ternari possono essere usati per trasmettere strutture auto-simili come un triangolo di Sierpinski o un insieme di Cantor convenientemente." fonte

"I numeri quaternari vengono utilizzati nella rappresentazione delle curve di Hilbert 2D." fonte

"Il sistema numerico quater-immaginario è stato proposto per la prima volta da Donald Knuth nel 1955, in una sottomissione a una ricerca di talenti scientifici nelle scuole superiori. È un sistema numerico posizionale non standard che utilizza il numero immaginario 2i come base. È in grado per rappresentare ogni numero complesso utilizzando solo le cifre 0, 1, 2 e 3. " fonte

"I numeri romani sono un sistema biquinary". fonte

"Il senario può essere considerato utile nello studio dei numeri primi poiché tutti i primi, quando espressi in base sei, diversi da 2 e 3 hanno 1 o 5 come cifra finale." fonte

"Sessagesimale (base 60) è un sistema numerico con sessanta come base. Ha avuto origine negli antichi Sumeri nel III millennio aC, è stato tramandato agli antichi Babilonesi, ed è ancora usato - in forma modificata - per misurare tempo, angoli e coordinate geografiche che sono angoli. " fonte

eccetera...

Questo elenco è un buon punto di partenza.


6
Nessuno di questi è correlato ad algoritmi ..
BlueRaja - Danny Pflughoeft

11
Certo che lo sono. Costruire un triangolo di Sierpinski in ternario o calcolare coordinate geografiche in sessagesimali. Che ne dici di un algoritmo per trasformare i numeri romani in decimali? Che ne dici di algoritmi per la ricerca dei numeri primi basati sul sistema senario?
Benjamin

9

Ho letto la tua domanda l'altro giorno e oggi ho riscontrato un problema: come faccio a generare tutti i partizionamenti di un insieme? La soluzione che mi è venuta in mente e che ho usato (forse a causa della lettura della tua domanda) è stata questa:

Per un set con (n) elementi, in cui ho bisogno di (p) partizioni, conta tutti i numeri (n) cifre in base (p).

Ogni numero corrisponde a un partizionamento. Ogni cifra corrisponde a un elemento dell'insieme e il valore della cifra ti dice in quale partizione inserire l'elemento.

Non è sorprendente, ma è pulito. È completo, non causa ridondanza e utilizza basi arbitrarie. La base utilizzata dipende dal problema di partizionamento specifico.


3
Penso che questo sia stato completamente rubato dal post di templatetypedef, deve essere rimasto bloccato nel mio subconscio. L'ho lasciato solo perché parla di più basi oltre al binario.
Ben Horner

2
Questo genera tutti i partizionamenti con al massimo p partizioni e ha ridondanze. Come si 111222distingue da 222111?
Null Set

7

Recentemente mi sono imbattuto in un fantastico algoritmo per generare sottoinsiemi in ordine lessicografico basato sulle rappresentazioni binarie dei numeri tra 0 e 2 n - 1. Utilizza i bit dei numeri sia per determinare quali elementi dovrebbero essere scelti per l'insieme sia per riordinare localmente i set generati per metterli in ordine lessicografico. Se sei curioso, ho un articolo pubblicato qui .

Inoltre, molti algoritmi si basano sul ridimensionamento (come una versione debolmente polinomiale dell'algoritmo di max-flusso di Ford-Fulkerson), che utilizza la rappresentazione binaria dei numeri nel problema di input per perfezionare progressivamente un'approssimazione approssimativa in una soluzione completa.


2
Questo è il modo più semplice per generare sottoinsiemi :)
st0le

Questo è il modo più semplice di contare nei concetti combinatori.
Saeed Amiri

@ st0le- Penso che questo sia un po 'più complicato della versione standard perché elenca i set in ordine lessicografico, piuttosto che il normale ordinamento che ottieni dalla mappatura uno-a-uno tra i bit e l'inclusione di set.
templatetypedef


6

Ricordo vagamente qualcosa sui sistemi a doppia base per accelerare alcune moltiplicazioni di matrici.

Il sistema a doppia base è un sistema ridondante che utilizza due basi per un numero.

 n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}

Ridondante significa che un numero può essere specificato in molti modi.

Puoi cercare l'articolo "Algoritmo ibrido per il calcolo del polinomio di matrice" di Vassil Dimitrov, Todor Cooklev.

Sto cercando di dare la migliore breve panoramica che posso.

Stavano cercando di calcolare il polinomio della matrice G(N,A) = I + A + ... + A^{N-1}.

Supponendo N è composto G(N,A) = G(J,A) * G(K, A^J), se applichiamo J = 2, otteniamo:

         / (I + A) * G(K, A^2)        , if N = 2K
G(N,A) = |
         \ I + (A + A^2) * G(K, A^2)  , if N = 2K + 1

anche,

         / (I + A + A^2) * G(K, A^3)           , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3)     , if N = 3K + 1
         \ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2

Poiché è "ovvio" (scherzosamente) che alcune di queste equazioni sono veloci nel primo sistema e alcune migliori nel secondo, quindi è una buona idea scegliere la migliore tra quelle che dipendono N. Ma ciò richiederebbe un'operazione modulo veloce sia per 2 che per 3. Ecco perché arriva la doppia base: puoi fondamentalmente eseguire l'operazione modulo velocemente per entrambi dandoti un sistema combinato:

         / (I + A + A^2) * G(K, A^3)       , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
         | (I + A) * G(3K + 1, A^2)        , if N = 2 mod 6
         \ I + (A + A^2) * G(3K + 2, A^2)  , if N = 5 mod 6

Guarda l'articolo per una migliore spiegazione in quanto non sono un esperto in questo settore.



5

ecco un buon post sull'uso dei numeri ternari per risolvere il problema della "moneta contraffatta" (dove devi rilevare una singola moneta contraffatta in una borsa di quelle normali, usando un saldo il minor numero di volte possibile)


Questo è stato un post fantastico e ho finito per usarlo in un discorso che ho tenuto chiamato "Divertimento con i sistemi numerici". Grazie mille per averlo postato!
templatetypedef

benvenuto, e felice che tu abbia potuto usarlo!
Martin DeMello

5

Le stringhe di hash (ad esempio nell'algoritmo Rabin-Karp ) spesso valutano la stringa come un numero in base b composto da n cifre (dove n è la lunghezza della stringa e b è una base scelta che è abbastanza grande). Ad esempio, la stringa "ABCD" può essere sottoposta ad hashing come:

'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0

Sostituendo i valori ASCII per i caratteri e prendendo b come 256 questo diventa,

65*256^3+66*256^2+67*256^1+68*256^0

Tuttavia, nella maggior parte delle applicazioni pratiche, il valore risultante viene assunto in un numero di dimensioni ragionevoli per mantenere il risultato sufficientemente piccolo.



4

In Hackers Delight(un libro che ogni programmatore dovrebbe conoscere ai miei occhi) c'è un capitolo completo sulle basi insolite, come -2 come base (sì, basi negative a destra) o -1 + i (i come unità immaginaria sqrt (-1)) come base. Inoltre ho un bel calcolo quale sia la base migliore (in termini di progettazione hardware, per tutti coloro che non vogliono leggerlo: la soluzione dell'equazione è e, quindi puoi andare con 2 o 3, 3 sarebbe un po 'meglio (fattore 1.056 volte meglio di 2) - ma è tecnico più pratico).

Altre cose che mi vengono in mente sono il contatore grigio (tu quando conti in questo sistema solo 1 bit cambia, usi spesso questa proprietà nella progettazione hardware per ridurre i problemi di metastabilità) o la generalizzazione della già citata codifica Huffmann - la codifica aritmetica.


3

La crittografia fa largo uso di anelli interi (aritmatica modulare) e anche di campi finiti, le cui operazioni sono intuitivamente basate sul comportamento dei polinomi con coefficienti interi.



1

Ottima domanda. L'elenco è davvero lungo. Dire l'ora è un semplice esempio di basi miste (giorni | ore | minuti | secondi | am / pm)

Ho creato un framework n-tuple di enumerazione meta-base se sei interessato a saperne di più. È uno zucchero sintattico molto dolce per i sistemi di numerazione delle basi. Non è ancora stato rilasciato. Invia il mio nome utente tramite posta elettronica (su Gmail).


1
E qualsiasi sistema di calendario: Maya, Lunare, Babilonese ... insieme alla valuta inglese prima del 1971 (LSD). Come dici tu, l'elenco potrebbe continuare.
Chris Walton


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.