Я только что закончил домашнюю проблему для Computer Science 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;
}
Сделать более эффективным, означает ли это изменение поиска в каком-либо другом виде поиска или вы хотите использовать линейный поиск? – alternative
Это очень удивительно. Если совпадают два числа (сначала 'if'), вы продолжаете искать один и тот же номер' i' ('break;'). Ожидаете ли вы, что в списке есть дубликаты? Это не то, как лотерея работает в моем состоянии. Второй «если» тоже трудно понять. Мне кажется, что 'j -' есть, чтобы отменить 'j ++', который будет вызван' continue; ', но, честно говоря, я предпочел бы вид чистой 'goto', чем этот вид трюк. –
во внутреннем цикле вы можете остановиться, когда увидите число больше, чем ticketnum [i]. так как вы знаете, что для линейного поиска, например, требуется время O (n * n), где n - количество номеров лотереи. так как O (C * n * n) одинаково для любой константы C, вы не будете изменять сложность, останавливаясь, когда увидите большее число, но вы уменьшите константу C, тем самым запустив ее быстрее. также мне не нравится стиль, если вы не возражаете, чтобы я так сказал. я бы не изменил индексы цикла внутри цикла. он не читается. – akonsu