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
i diversi valori dei parametri con la console Cloud o chiamando il metodo
l'API Vertex AI in modo diretto.
Sei un programmatore C++ a cui piace 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(n3), dove n è la lunghezza della stringa di input. Questo accade a causa dei 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 controllo dei loop aggiuntivi per already_printed aggiunge un altro fattore O(n), anche se è meno significativo dei loop nidificati.
Il codice ottimizzato riportato di seguito utilizza un std::map per raggiungere 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:
Con std::map: il codice originale ha raccontato più volte in modo inefficiente le occorrenze di ogni carattere. std::map (o std::unordered_map per prestazioni medie potenzialmente più rapide, ma nel peggiore dei casi leggermente più elevate) 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 il conteggio di ogni carattere in modo efficiente. Se il carattere non è già presente nella mappa, viene aggiunto contando 1. altrimenti, il conteggio esistente viene incrementato.
Eliminazione dei controlli ridondanti: il controllo already_printed del codice originale è stato necessario a causa del suo metodo di conteggio inefficiente. std::map gestisce intrinsecamente tutto questo: ogni carattere viene contato una sola volta e il ciclo finale ripercorre la 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 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"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2024-10-14 UTC."],[],[]]