Quali sono gli algoritmi che voi persone trovate di avere un'analisi della complessità sorprendente (dura, strana) in termini di entrambi - Notazione O risultante e unicità nel modo in cui vengono analizzati?Algoritmi per Big O Analysis
risposta
La complessità non deterministica del polinomio ottiene il mio voto, specialmente con la possibilità (improbabilmente considerata improbabile) che possa rivelarsi uguale al polinomio. Allo stesso modo, tutto ciò che può teoricamente beneficiare del calcolo quantistico (N.B. questo insieme non è affatto tutti gli algoritmi).
L'altro che otterrebbe il mio voto sarebbe operazioni matematiche comuni su numeri arbitrari di precisione: è qui che devi considerare che moltiplicare i numeri grandi è più costoso che moltiplicare quelli piccoli. C'è una grande quantità di analisi su Knuth (che non dovrebbe essere una novità per nessuno). Il metodo di Karatsuba è abbastanza accurato: taglia i due fattori a metà per cifra (A1; A2) (B1; B2) e moltiplica A1 B1, A1 B2, A2 B1, A2 B2 separatamente e poi combina i risultati. Recurse se desiderato ...
Il metodo di Karatsuba è elegante, questo è vero. Tuttavia, poiché una trasformata di Fourier veloce esegue una convoluzione, può essere utilizzata per eseguire le moltiplicazioni più veloci conosciute, supponendo che i numeri siano abbastanza grandi da giustificare l'aggravamento della scrittura di un FFT di input misto e la sua sintonizzazione. –
Hmm, dovrò cercarlo. Quanto sono precisi i componenti per garantire la moltiplicazione esatta di interi? – Edmund
Come ho capito, hai semplicemente bisogno di precisione sufficiente per contenere il numero finale. Sebbene la tecnica di moltiplicazione FFT possa essere utilizzata direttamente anche sui tipi interi, è sempre possibile fornire risposte precise. Non ho la mia copia di Knuth qui, ma penso che menziona la tecnica e ci passa sopra. –
Questo è un po 'semplice ma Comb Sort mi soffia un po' la mente.
http://en.wikipedia.org/wiki/Comb_sort
Si tratta di un semplice algoritmo come per la maggior parte si legge come un troppo complicato bubble sort, ma è O (n * log [n]). Trovo che sia leggermente impressionante.
Anche la pletora di algoritmi per le trasformate di Fourier veloci è impressionante, la matematica che dimostra la loro validità è entusiasmante ed è stato divertente provare a provarne alcuni da solo.
http://en.wikipedia.org/wiki/Fast_Fourier_transform
posso abbastanza facilmente capire la radice primaria, più radix primo, e gli algoritmi radix contrastanti, ma uno che lavora sui set le cui dimensioni sono primi è piuttosto fresco.
ho (abbastanza) alcuni esempi:
- La struttura dei dati union-find, che supporta le operazioni in (ammortizzato) inversa tempo Ackermann. È particolarmente bello perché la struttura dei dati è incredibilmente facile da codificare.
- Splay trees, che sono alberi binari autoequilibranti (ovvero, nessuna informazione aggiuntiva è memorizzata diversa dalla BST - nessuna informazione rosso/nero. Amortized analysis è stato essenzialmente inventato per dimostrare i limiti per gli alberi di diffusione; gli alberi di diffusione eseguiti in ammortizzato tempo logaritmico, ma nel caso peggiore tempo lineare. le prove sono freddi.
- Fibonacci heaps, che svolgono la maggior parte delle operazioni di coda di priorità in ammortizzato tempo costante, migliorando così il tempo di esecuzione Dijkstra's algorithm e altri problemi. Come con albero splay, ci Sono pronte le prove di "potenziale funzione"
- l'algoritmo di Bernard Chazelle per il calcolo di spanning tree minimi in tempi lineari tempo ermann. L'algoritmo utilizza soft heaps, una variante del tradizionale priority queue, tranne che potrebbe verificarsi un "danneggiamento" e le query potrebbero non ricevere una risposta corretta.
- Mentre sul tema degli MST: un algoritmo ottimale è stato given by Pettie and Ramachandran, ma non sappiamo il tempo di esecuzione!
- Un sacco di algoritmi randomizzati hanno analisi interessate.Citerò solo un esempio: la triangolazione di Delaunay può essere calcolata in tempo O (n log n) previsto per incrementally adding points; l'analisi è apparentemente intricata, anche se non l'ho vista.
- Gli algoritmi che utilizzano "trucchi bit" possono essere accurati, ad es. sorting in O(n log log n) tempo (e spazio lineare) - esatto, rompe la barriera di O (n log n) usando più di un semplice confronto.
- Cache-oblivious algorithms spesso hanno analisi interessanti. Ad esempio, cache-oblivious priority queues (vedere pagina 3) utilizzare i livelli log log n di dimensioni n, n 2/3, n 4/9 e così via.
- (statico) Le query minime sugli array sono chiare. Lo standard proof verifica i propri limiti rispetto alla riduzione: le query minime di intervallo vengono ridotte al minimo antenato comune negli alberi, che viene a sua volta ridotto a un intervallo minimo di query in uno specifico tipo di matrici. Il passo finale usa anche un trucco carino.
L'analisi di ricerca ordinata in 2D è piuttosto interessante. Hai una matrice numerica bidimensionale di numeri NxN in cui ogni riga è ordinata da sinistra a destra e ogni colonna è ordinata dall'alto in basso. L'attività è trovare un numero particolare nell'array.
L'algoritmo ricorsivo: selezionare l'elemento nel mezzo, confrontare con il numero di destinazione, scartare un quarto dell'array (a seconda del risultato del confronto), applicare ricorsivamente ai restanti 3 trimestri è piuttosto interessante da analizzare.
Tipo di shell. Ci sono un sacco di varianti con vari incrementi, la maggior parte dei quali non ha alcun beneficio se non quello di fare il complexity analysis simpler.
È un algoritmo? – shoosh
@ p Probabilmente questa risposta va bene, anche se è solo link. "La funzione di Ackermann" è sufficiente per trovarla su Internet e la domanda - che è probabilmente fuori tema - richiede solo algoritmi, non spiegazioni. – royhowie