发送反馈
代码优化说明
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
优化和解释 C++ 代码,重点关注时间复杂度。
在对 Cloud 控制台使用不同参数值时,或通过直接调用 Vertex AI API,您可以直接查询模型,并测试返回的结果。
系统指令
您是一位热衷于优化代码的 C++ 程序员。优化所提供的代码后,您需要说明时间复杂度的变化和改进。
我有一个 C++ 代码,用于输出字符在字符串中出现的次数,但有人告诉我这种做法效率不高。
您能否使用地图提高效率?
#include <iostream>
#include <string>
using namespace std ;
int main () {
string input ;
cout << "Enter a string: " ;
getline ( cin , input );
for ( int i = 0 ; i < input . length (); ++ i ) {
char current_character = input [ i ];
int count = 0 ;
for ( int j = 0 ; j < input . length (); ++ j ) {
for ( int k = 0 ; k < input . length (); ++ k ) {
if ( input [ j ] == current_character && j == k ) {
++ count ;
}
}
}
bool already_printed = false ;
for ( int k = 0 ; k < i ; ++ k ) {
if ( input [ k ] == current_character ) {
already_printed = true ;
break ;
}
}
if ( ! already_printed ) {
cout << current_character << ": " << count << endl ;
}
}
return 0 ;
}
响应
原始代码的时间复杂度为 O(n³),其中 n 是输入字符串的长度。这是因为嵌套循环:外层循环会迭代每个字符,第二个循环会迭代每个字符的整个字符串,第三个循环(虽然看似多余)在最坏的情况下仍会迭代字符串的长度。对 already_printed
进行额外的循环检查会增加另一个 O(n) 因子,但其重要性不如嵌套循环。
以下优化后的代码使用 std::map
实现了 O(n log n) 的时间复杂度。log n
因子来自映射的插入和查找操作(通常使用平衡二叉搜索树实现)。
#include <iostream>
#include <string>
#include <map>
using namespace std ;
int main () {
string input ;
cout << "Enter a string: " ;
getline ( cin , input );
map<char , int > char_counts ;
for ( char c : input ) {
char_counts [ c ] ++ ;
}
for ( auto const & [ key , val ] : char_counts ) {
cout << key << ": " << val << endl ;
}
return 0 ;
}
改进说明 :
使用 std::map
:原始代码会多次重复计算每个字符的出现次数,效率不高。std::map
(或 std::unordered_map
,平均性能可能更快,但最坏情况下略高)会将每个字符存储为键,并将其计数存储为值。这样可以避免重复计数。
迭代一次 :经过优化的代码仅迭代一次输入字符串,以填充 char_counts
映射。与原始代码的嵌套循环相比,这可以显著减少操作次数。
高效统计字符数 :char_counts[c]++;
行会高效地增加每个字符的计数。如果该字符尚未添加到映射中,则会以 1 的计数添加该字符;否则,其现有计数会递增。
消除冗余检查 :由于原始代码的计数方法效率低下,因此需要进行 already_printed
检查。std::map
固有地处理此问题;每个字符只会计数一次,最后一个循环会遍历映射,输出每个字符及其计数。
总而言之,经过优化的代码将时间复杂度从 O(n³) 降低到 O(n log n),从而显著提高了效率。对于较大的输入字符串,这种差异会非常明显。使用 std::unordered_map
可以进一步将平均性能提升到 O(n),但代价是极端情况的性能略有提高。选择取决于具体应用以及最差性能是否是关键问题。
型号:
gemini-1.5-flash-002
温度:
0.2
输出令牌数量上限:
8192
TopK:
40.0
TopP:
0.95
发送反馈
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可 获得了许可,并且代码示例已根据 Apache 2.0 许可 获得了许可。有关详情,请参阅 Google 开发者网站政策 。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-12-05。
需要向我们提供更多信息?
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","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"],["翻译问题","translationIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2024-12-05。"],[],[]]