Che cosa vuol dire dicendo "asintoticamente più efficiente"?


12

Cosa significa quando diciamo che un algoritmo è asintoticamente più efficiente di ?YXY

  • X sarà una scelta migliore per tutti gli input.
  • X sarà una scelta migliore per tutti gli ingressi tranne quelli piccoli.
  • X sarà una scelta migliore per tutti gli ingressi tranne quelli di grandi dimensioni.
  • Y sarà una scelta migliore per piccoli input.

Il link per questa domanda è qui.

http://quiz.geeksforgeeks.org/algorithms-analysis-of-algorithms-question-16/


Ho pensato che un algoritmo più asintoticamente efficiente dovrebbe funzionare per tutti gli input, ma non sto ottenendo il motivo "Funziona con tutti gli input tranne quelli piccoli".


input di grandi dimensioni espone il collo di bottiglia in algoritmo. È quello che vorrei mettere in termini di ingegneria.
Apiwat Chantawibul,

Risposte:


14

Prima di tutto, entrambi gli algoritmi "funzionano" per tutti gli input. La domanda riguarda le prestazioni.

Le risposte a questa domanda sono piuttosto scadenti. Un modo per dire che un algoritmo è asintoticamente più efficiente di un altro è se ci sono delle dimensioni di input (specifiche del problema) in modo tale che per qualsiasi dimensione di input più grande l'algoritmo più efficiente prenderà meno "passi computazionali", di solito con una misura astratta, ad es. numero di confronti.

L'idea delle risposte è che un algoritmo asintoticamente più efficiente potrebbe richiedere ancora più passaggi prima di quella dimensione di input. Esso può essere il caso che l'algoritmo asintoticamente più efficiente richiede meno operazioni per tutti gli ingressi, ma non ha bisogno di essere il caso e in pratica di solito non è. Quindi una migliore formulazione della risposta "corretta" sarebbe " sarà una scelta migliore per tutti gli input tranne possibilmente piccoli input".X

Tuttavia, la formulazione non è poi così eccezionale. Prima di tutto, molti altri fattori vanno a decidere quale algoritmo sia una "scelta migliore", ma darò loro che l'intento è abbastanza chiaro in questo caso. Il vero problema è "piccolo" e "grande". Uno dei miei articoli preferiti è l'algoritmo più veloce e più breve per tutti i problemi ben definiti . Questo documento descrive un algoritmo che ha fornito qualsiasi specifica di una funzione e una prova che può essere calcolata in tempo polinomiale calcolerà quella funzione in una complessità temporale ottimale entro un fattore più un termine additivo. Ad esempio, se gli fornissi un'implementazione di bubble sort come specifica della funzione e la semplice prova che eraO ( n 2 ) O ( n lg n ) 5 c n lg n + o ( n lg n ) c o ( n lg n )5O(n2), produrrebbe un algoritmo di ordinamento che era . In effetti, produrrebbe un algoritmo che era cui era il fattore costante dell'algoritmo asintoticamente * ottimale. Questo è fantastico C'è solo un problema: il termine costante - nascosto inO(nlgn)5cnlgn+o(nlgn)co(nlgn)in questo esempio - rende l'algoritmo quasi certamente del tutto impossibile praticamente per qualsiasi problema reale. Cosa intendo con "completamente impossibile"? Voglio dire, la morte per calore dell'universo accadrà molte volte prima che quell'algoritmo venga completato. Tuttavia, per input opportunamente "grandi" sarà più veloce dell'ordinamento a bolle. Il mio punto è che quasi certamente non è fisicamente possibile annotare in alcun modo un input "adeguatamente ampio", figuriamoci calcolare su di esso.

Ad ogni modo, come direi la risposta corretta sarebbe: " richiede meno passaggi di su input sufficientemente grandi". Questo è ancora un po 'vago in quanto vi sono più nozioni di "step" che potrebbero essere applicate e un algoritmo potrebbe essere asintoticamente più efficiente di una metrica e meno efficiente di un'altra. Questa formulazione evita il giudizio di valore di "scelta migliore"; ci sono molte ragioni per scegliere algoritmi asintoticamente meno efficienti o anche algoritmi meno efficienti quando vengono specificati fattori / termini costanti come efficienza della cache o semplicità di implementazione.YXY

* C'è una sottigliezza qui. L'algoritmo asintoticamente ottimale può avere un fattore costante peggiore, , di un algoritmo asintoticamente non ottimale. Penso che avrà il miglior valore di per qualsiasi algoritmo asintoticamente ottimale, ma è ipotizzabile che per ottenere un leggero guadagno nell'efficienza asintotica, si aggiunga un'enorme complessità che aumenta significativamente il fattore costante.ccc


2

Ciò che le persone generalmente intendono quando dicono qualcosa del genere è:

Se e sono le due funzioni di costo di degli algoritmi e nel modello X, rispettivamente, quindi .T B A B T Ao ( T B )TUNTBUNBTUNo(TB)

Qui si applicano molti avvertimenti: deve essere specificato e dobbiamo definire esattamente cosa significa "costo del tempo di funzionamento". Il tempo non è quasi mai oggetto di indagine. Esistono molte altre misure di costo. Non è chiaro se la notazione di Landau faccia qualche dichiarazione utile sull'efficienza. E così via.X

In particolare, nessuna delle affermazioni da te proposte segue, anche se le persone spesso suggeriscono che il secondo sia vero.

Purtroppo, la più ampia comunità di persone che si occupano di algoritmi abbraccia la terminologia che rasenta il vuoto per motivi di semplicità. (Fare dichiarazioni precise e utili sugli algoritmi è difficile!)

Potresti essere interessato alle nostre domande di riferimento .


Si dice che un algoritmo X è asintoticamente migliore di Y se X impiega un tempo minore di y per tutte le dimensioni di input n maggiore di un valore n0 dove n0> 0.

Nota come questa non è la solita definizione! Se e , non diremmo che è "asintoticamente migliore". Date tutte le avvertenze di un'analisi che riduce le prestazioni di un algoritmo fino a un singolo numero, non si può sostenere che uno sia "migliore" dell'altro.T B ( n ) = nTUN(n)=n+1TB(n)=n

Ti consiglio di imparare l'informatica dalle risorse CS, non dai programmatori che hanno letto una volta cose su Wikipedia. (Sì, è duro, ma ho visto troppe falsità propagate nei circoli dei programmatori, anche su SO.)


2

"Asintoticamente più efficiente" significa "più efficiente per tutti i problemi al di sopra di una certa dimensione". Non dice quale sia la "certa dimensione" e non dice cosa succede prima di quella "certa dimensione".

Quindi tutte le risposte, tranne la seconda, sono chiaramente sbagliate, perché "Asintoticamente più efficiente" non dice nulla sulle piccole dimensioni degli input. Ma anche il secondo è problematico.

Attualmente non esiste alcun hardware in grado di memorizzare un array di numeri interi, quindi chiaramente numeri interi sarebbero considerati "input di grandi dimensioni". Ma posso facilmente creare un algoritmo di ordinamento asintoticamente più efficiente di Bubblesort, ma solo per input di o più numeri interi. Quindi prendi la risposta due, cambia "grande" in "abbastanza grande", e diventa corretto.103010301040

In pratica, è spesso una buona idea verificare per quale dimensione di input un algoritmo asintoticamente migliore è effettivamente più veloce e quale sia il tempo richiesto per input in cui è più veloce, e talvolta un algoritmo sarà più veloce solo per dimensioni di problemi che non possono praticamente essere risolto comunque. Se l'algoritmo A batte l'algoritmo B, ma solo per problemi in cui ciascuno richiede anni o più, A non è molto utile.1015

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.