Perché lo string :: substr() implementato da C++ non utilizza l'algoritmo KMP (e non viene eseguito in O (N + M)) e viene eseguito in O (N * M)?
suppongo che voi dire find()
, piuttosto che substr()
che non ha bisogno di cercare e dovrebbe essere eseguito in tempo lineare (e solo perché deve copiare il risultato in una nuova stringa).
Lo standard C++ non specifica i dettagli dell'implementazione e in alcuni casi specifica solo i requisiti di complessità. Gli unici requisiti di complessità delle operazioni std::string
sono che size()
, max_size()
, operator[]
, , c_str()
e data()
sono tutti costanti. La complessità di qualsiasi altra cosa dipende dalle scelte fatte da chiunque abbia implementato la libreria che stai utilizzando.
Il motivo più probabile per scegliere una ricerca semplice su qualcosa come KMP è evitare di richiedere ulteriore spazio di archiviazione. A meno che la stringa da trovare sia molto lunga e la stringa da cercare contenga molte corrispondenze parziali, il tempo impiegato per allocare e liberare sarebbe probabilmente molto più del costo della complessità extra.
È corretto in C++ 0x?
No, C++ 11 non aggiunge alcun requisito di complessità a std::string
e sicuramente non aggiunge dettagli di implementazione obbligatori.
Se la complessità del substr attuale non è O (N * M), che cos'è?
Questa è la complessità peggiore, quando la stringa da cercare contiene molte corrispondenze parziali lunghe. Se i personaggi hanno una distribuzione abbastanza uniforme, la complessità media sarebbe più vicina a O(N)
. Quindi, scegliendo un algoritmo con la migliore complessità del caso peggiore, è possibile rendere molto più lenti i casi più tipici.
fonte
2012-01-15 12:42:07
Forse intendete 'string :: find'? –
'substr' non esegue alcuna ricerca. Ti riferisci a 'find'? – Mat
scusate, si significo 'find' – Farzam