【发布时间】:2010-08-29 17:04:45
【问题描述】:
我刚刚完成了计算机科学 1 的作业问题(是的,这是作业,但请听我说!)。现在,该任务已 100% 完成并且正在运行,所以我不需要帮助。我的问题涉及我正在使用的算法的效率(我们还没有对算法效率进行评分,我只是很好奇)。
我要介绍的函数目前使用线性搜索算法的修改版本(我自己想出了!),以检查给定彩票上有多少号码与中奖号码匹配,假设彩票上的号码和抽出的号码都是按升序排列的。我想知道,有什么方法可以让这个算法更高效?
/*
* Function: ticketCheck
*
* @param struct ticket
* @param array winningNums[6]
*
* Takes in a ticket, counts how many numbers
* in the ticket match, and returns the number
* of matches.
*
* Uses a modified linear search algorithm,
* in which the index of the successor to the
* last matched number is used as the index of
* the first number tested for the next ticket value.
*
* @return int numMatches
*/
int ticketCheck( struct ticket ticket, int winningNums[6] )
{
int numMatches = 0;
int offset = 0;
int i;
int j;
for( i = 0; i < 6; i++ )
{
for( j = 0 + offset; j < 6; j++ )
{
if( ticket.ticketNum[i] == winningNums[j] )
{
numMatches++;
offset = j + 1;
break;
}
if( ticket.ticketNum[i] < winningNums[j] )
{
i++;
j--;
continue;
}
}
}
return numMatches;
}
【问题讨论】:
-
提高效率是指将搜索更改为其他类型的搜索,还是仍要使用线性搜索?
-
这很令人惊讶。如果两个号码匹配(第一个
if),您将继续寻找相同的号码i(break;)。您是否希望任何一个列表都有重复项?在我的州,彩票不是这样运作的。第二个if也很难理解。在我看来,j--可以撤消由continue;引起的j++,但坦率地说,我更喜欢看到干净的goto而不是这种技巧。 -
在内部循环中,当您看到大于 ticketnum[i] 的数字时,您可以停止。如您所知,像这样的线性搜索需要 O(nn) 时间,其中 n 是彩票号码的数量。因为 O(Cn*n) 对于任何常数 C 都是相同的,所以当你看到更大的数字时停止不会改变复杂性,但你会减小常数 C,从而使其运行得更快。如果你不介意我这么说,我也不喜欢这种风格。我不会更改循环内的循环索引。它不可读。
-
@Andrew:有一个特别的作业标签,我给你加了。除了在文本中提及作业之外,使用该标签是一种很好的礼貌。
-
@Albin 好的,谢谢!我不是故意忽略它,我只是不知道它存在。我想我试图在帖子正文中明确表明这是一项家庭作业,但如果需要,我将从现在开始使用该标签。
标签: c performance algorithm