Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Mengoptimalkan dan menjelaskan kode C++, dengan berfokus pada kompleksitas waktu.
Anda dapat membuat kueri model secara langsung dan menguji hasil yang ditampilkan saat menggunakan
parameter value yang berbeda dengan Konsol Cloud, atau dengan memanggil
Vertex AI API secara langsung.
Anda adalah programmer C++ yang suka mengoptimalkan kode. Setelah mengoptimalkan kode yang diberikan, Anda menjelaskan perubahan dan peningkatan dalam kompleksitas waktu.
Kode asli memiliki kompleksitas waktu O(n³), dengan n adalah panjang string input. Hal ini karena loop bertingkat: loop luar melakukan iterasi melalui setiap karakter, loop kedua melakukan iterasi melalui seluruh string untuk setiap karakter, dan loop ketiga (meskipun tampaknya berlebihan) masih melakukan iterasi melalui panjang string dalam kasus terburuk. Pemeriksaan loop tambahan untuk already_printed menambahkan faktor O(n) lainnya, meskipun kurang signifikan dibandingkan loop bertingkat.
Kode yang dioptimalkan berikut menggunakan std::map untuk mencapai kompleksitas waktu O(n log n). Faktor log n berasal dari operasi penyisipan dan pencarian peta (yang biasanya diterapkan menggunakan hierarki penelusuran biner seimbang).
#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;}
Penjelasan Peningkatan:
Menggunakan std::map: Kode asli menghitung kemunculan setiap karakter beberapa kali secara tidak efisien. std::map (atau std::unordered_map untuk performa kasus rata-rata yang berpotensi lebih cepat, tetapi kasus terburuknya sedikit lebih tinggi) menyimpan setiap karakter sebagai kunci dan jumlahnya sebagai nilai. Hal ini menghilangkan penghitungan yang berlebihan.
Iterasi Satu Kali: Kode yang dioptimalkan melakukan iterasi melalui string input hanya sekali untuk mengisi peta char_counts. Hal ini secara signifikan mengurangi jumlah operasi dibandingkan dengan loop bertingkat kode asli.
Penghitungan Karakter yang Efisien: Baris char_counts[c]++; menambahkan jumlah untuk setiap karakter secara efisien. Jika karakter belum ada di peta, karakter tersebut akan ditambahkan dengan jumlah 1; jika tidak, jumlah yang ada akan bertambah.
Menghapus Pemeriksaan yang Tidak Diperlukan: Pemeriksaan already_printed kode asli diperlukan karena metode penghitungannya yang tidak efisien. std::map secara inheren menangani hal ini; setiap karakter dihitung hanya sekali, dan loop terakhir melakukan iterasi melalui peta, mencetak setiap karakter dan jumlahnya.
Singkatnya, kode yang dioptimalkan memberikan peningkatan efisiensi yang signifikan dengan mengurangi kompleksitas waktu dari O(n³) menjadi O(n log n). Untuk string input yang besar, perbedaan ini akan sangat signifikan. Penggunaan std::unordered_map dapat lebih meningkatkan performa kasus rata-rata menjadi O(n), tetapi dengan mengorbankan performa kasus terburuk yang sedikit lebih tinggi. Pilihannya bergantung pada aplikasi tertentu dan apakah performa terburuk merupakan masalah penting.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","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"],["Masalah terjemahan","translationIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2024-12-18 UTC."],[],[]]