Acabo de terminar un problema de tarea para Informática 1 (sí, es tarea, pero ¡escúchame!). Ahora, la tarea está 100% completa y funcionando, por lo que no necesito ayuda. Mi pregunta involucra la eficiencia de un algoritmo que estoy usando (no estamos calificados en la eficiencia algorítmica aún, solo tengo mucha curiosidad).Optimización de algoritmo de búsqueda lineal
La función que voy a presentar actualmente utiliza una versión modificada del algoritmo de búsqueda lineal (que yo mismo ideé) para verificar cuántos números en un boleto de lotería determinado coinciden con los números ganadores , suponiendo que tanto los números en el boleto como los números extraídos están en orden ascendente. Me preguntaba, ¿hay alguna manera de hacer que este algoritmo sea más eficiente?
/*
* 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;
}
Por hacer más eficiente, ¿eso significa cambiar la búsqueda a algún otro tipo de búsqueda, o desea todavía utilizar una búsqueda lineal? – alternative
Es muy sorprendente. Si dos números coinciden (primero 'si'), sigue buscando el mismo número' i' ('break;'). ¿Esperas que cualquiera de las listas tenga duplicados? Así no es como funciona la lotería en mi estado. El segundo 'si' también es difícil de entender. Me parece que el 'j -' está ahí para deshacer el 'j ++' que va a ser causado por 'continue;', pero francamente, preferiría ver un 'goto' limpio que este tipo de truco. –
en el ciclo interno, puede detenerse cuando vea un número mayor que el número de ticket [i]. como usted sabe, la búsqueda lineal como esta toma el tiempo O (n * n), donde n es el número de números de lotería. dado que O (C * n * n) es el mismo para cualquier constante C, no cambiará la complejidad al detenerse cuando vea el número mayor, pero reducirá la constante C, lo que hará que corra más rápido. tampoco me gusta el estilo si no te importa que lo diga. No cambiaría los índices de bucle dentro del bucle. no es legible – akonsu