Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Ottimizza e spiega il codice C++, concentrandoti sulla complessità temporale.
Puoi eseguire query direttamente su un modello e testare i risultati restituiti quando utilizzi valori di parametro diversi con la console Cloud o richiamando direttamente l'API Vertex AI.
Sei un programmatore C++ che ama ottimizzare il codice. Dopo aver ottimizzato il codice fornito, spiega le modifiche e i miglioramenti della complessità temporale.
Il codice originale ha una complessità temporale di O(n³), dove n è la lunghezza della stringa di input. Questo è dovuto ai cicli nidificati: il ciclo esterno esegue l'iterazione di ogni carattere, il secondo ciclo esegue l'iterazione dell'intera stringa per ogni carattere e il terzo ciclo (sebbene apparentemente ridondante) esegue comunque l'iterazione della lunghezza della stringa nel peggiore dei casi. Il ciclo aggiuntivo di controllo di already_printed aggiunge un altro fattore O(n), anche se è meno significativo dei cicli nidificati.
Il seguente codice ottimizzato utilizza un std::map per ottenere una complessità temporale di O(n log n). Il fattore log n deriva dalle operazioni di inserimento e ricerca della mappa (che in genere vengono implementate utilizzando alberi di ricerca binari bilanciati).
#include <iostream>#include <string>#include <map>usingnamespacestd;intmain(){stringinput;cout << "Enter a string: ";getline(cin,input);map<char,int>char_counts;for(charc:input){char_counts[c]++;}for(autoconst&[key,val]:char_counts){cout << key << ": " << val << endl;}return0;}
Spiegazione dei miglioramenti:
Utilizzo di std::map: il codice originale contava in modo inefficiente le occorrenze di ciascun carattere più volte. std::map (o std::unordered_map per un rendimento potenzialmente più rapido nel caso medio, ma leggermente superiore nel caso peggiore) memorizza ogni carattere come chiave e il relativo conteggio come valore. In questo modo viene eliminato il conteggio ridondante.
Iterazione una volta:il codice ottimizzato esegue l'iterazione della stringa di input una sola volta per compilare la mappa char_counts. Ciò riduce notevolmente il numero di operazioni rispetto ai cicli nidificati del codice originale.
Conteggio efficiente dei caratteri:la riga char_counts[c]++; incrementa in modo efficiente il conteggio di ciascun carattere. Se il carattere non è già presente nella mappa, viene aggiunto con un conteggio pari a 1; in caso contrario, il conteggio esistente viene incrementato.
Eliminazione dei controlli ridondanti: il controllo already_printed del codice originale era necessario a causa del suo metodo di conteggio inefficiente. std::map gestisce questo problema in modo intrinseco: ogni carattere viene conteggiato una sola volta e il ciclo finale esegue l'iterazione della mappa, stampando ogni carattere e il relativo conteggio.
In sintesi, il codice ottimizzato offre un miglioramento sostanziale dell'efficienza riducendo la complessità temporale da O(n³) a O(n log n). Per stringhe di input di grandi dimensioni, questa differenza sarà notevole. L'utilizzo di std::unordered_map potrebbe migliorare ulteriormente le prestazioni nel caso medio fino a O(n), ma a scapito di un peggioramento delle prestazioni nel caso peggiore. La scelta dipende dall'applicazione specifica e dal fatto che il rendimento peggiore sia un problema critico.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Difficile da capire","hardToUnderstand","thumb-down"],["Informazioni o codice di esempio errati","incorrectInformationOrSampleCode","thumb-down"],["Mancano le informazioni o gli esempi di cui ho bisogno","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-02-26 UTC."],[],[]]