【发布时间】:2016-12-18 16:29:52
【问题描述】:
我正在创建一个非常简单的程序,该程序使用贪心算法确定您需要多少硬币才能将零钱返还给客户。 该算法非常明显,您只需要确定您可以使用哪个更大的硬币,从零钱中减去它的值并更新硬币计数器。
我想到了两个非常相似的实现。
注意:changeInt 是变化,乘以 100 转化为整数。
1) 单个“复杂”循环
while(changeInt != 0) {
if(changeInt - 25 >= 0){
changeInt -= 25;
coins++;
}
else if(changeInt - 10 >= 0){
changeInt -= 10;
coins++;
}
else if(changeInt - 5 >= 0){
changeInt -= 5;
coins++;
}
else if(changeInt - 1 >= 0){
changeInt -= 1;
coins++;
}
}
2) 多个简单循环
while(changeInt - 25 >= 0)
{
changeInt -= 25;
coins++;
}
while(changeInt - 10 >= 0)
{
changeInt -= 10;
coins++;
}
while(changeInt - 5 >= 0)
{
changeInt -= 5;
coins++;
}
while(changeInt - 1 >= 0)
{
changeInt -= 1;
coins++;
}
现在,我知道两种情况下的性能可能相似,因为算法相同,但我想知道哪种方法更好。
单循环是我的第一个想法,后来我想到了第二种方法,直觉上我觉得更好。
我并不真正关心我的确切场景,我对一般场景更感兴趣(几个简单的循环与几个更复杂的循环)
1) 就性能而言,哪种方法更好?
2) 差异是否明显,至少在处理大量数字时?
3) 一种方法是否比另一种方法更具可读性? (不知道我是否可以在这里问)
谢谢!
【问题讨论】:
-
@mauroSabella:为什么是
chageInt - X >= 0而不是changeInt >= X?它们是等价的,所以这真的只是一个风格问题吗?你为什么选择这样做? -
@trincot 你是什么意思?我得到相同的结果。为什么说算法不一样?据我所知,两者都以完全相同的顺序做同样的事情。
-
你的作业是不是跑得太慢了,或者你为什么关心初步优化?专注于编写 可读* 代码,直到您真正遇到问题。然后分析您的代码并仅优化热点。
-
就个人而言,我发现第二个代码更具可读性,但是 YMMV。
-
@mauroSabella 这不仅仅是比较的风格问题。对于像这样的小数字,这不是问题,但对于大数字,减法可能会使值超出类型的范围。直接对比一下,更容易阅读,对处理器的工作量更少,更安全。双赢。
标签: c algorithm performance readability