Mejor respuesta
No está claro lo que estás preguntando, pero supongo que la pregunta es que dada una matriz , ¿cómo se determina su longitud?
C tiene varios tipos de matrices: matrices de tamaño desconocido, matrices de tamaño constante conocido y matrices de longitud variable.
Para una matriz de tamaño constante, el tamaño es parte de su tipo: la longitud de una matriz cuyo tipo es int[10]
es muy 10. C no tiene ningún mecanismo para extraer eso directamente del tipo (a diferencia de C ++ ), pero puede hacerlo indirectamente a través de sizeof:
int a[] = {1,2,3,4,5,6,7,8,9,0};
size\_t sz = sizeof a / sizeof *a; // or .../sizeof a[0], same thing
printf("size = \%zu\n", sz);
El tamaño de una matriz de longitud variable también se puede calcular con sizeof, con código idéntico. En ese caso, se ejecuta en tiempo de ejecución:
scanf("\%d", &x);
int a[x];
size\_t sz = sizeof a / sizeof *a;
printf("size = \%zu\n", sz);
Finalmente, las matrices de límite desconocido tienen, por definición, tamaño desconocido. Debería obtenerlo a través de la lógica del programa
extern int a[];
size\_t sz = something\_from\_the\_module\_that\_defines\_a();
Una advertencia, por supuesto, las matrices desnudas en C no se pueden pasar a las funciones, por lo que los tamaños deben calcularse en el lado del llamador y pasarse por separado:
void f(int *a, size\_t sz);
int a[] = {1,2,3,4,5,6,7,8,9,0};
f(a, sizeof a / sizeof *a);
Por supuesto, las matrices de miembros se pueden pasar a funciones por valor:
struct a10 {int a[10];};
void f(struct a10 s) {
size\_t sz = sizeof s.a / sizeof *s.a;
}
Respuesta
Una pregunta importante es ¿realizarás búsquedas varias veces? Si es así, cree una tabla hash u otro índice una vez para encontrar las cosas rápidamente. Se podría generar una tabla hash al mismo tiempo que se leen los datos desde el disco (si es de ahí de donde provienen).
Si esto es algo que se realiza una sola vez y los datos se cargan desde el disco, haga la búsqueda se superpuso con el IO. Se pueden usar 2 o más búferes.
Otra pregunta es, ¿está interesado en saber si hay algo presente o hay datos asociados que desea recuperar? Si solo quiere saber si hay un número, se puede usar una matriz de bits para una representación más compacta.
Aparte de eso, el código C en línea que usa la comparación más rápida es lo mejor; Utilice todas las opciones de optimización que proporciona el compilador. Algunos compiladores pueden generar el mismo código rápido independientemente de si usa punteros, contadores o indexación:
int * first = ..., * last = ...;
for ( ; first <= last; ++first ) if ( *first == target ) ...
o
int * first = ..., count = ...;
for ( ; count-- > 0; ++first ) if ( *first == target ) ...
o
int * first = ..., count = ..., index = ...;
for ( ; index < count; ++index ) if ( first[index] == target ) ...
Puede considerar que es una trampa pedirle al compilador que genere la fuente del ensamblador para tener una idea de lo que está haciendo, pero los compiladores menores pueden requerirlo si está realmente preocupado por el rendimiento, solo para ver qué forma de código C genera el mejor resultado.
Luego, hay otras cosas que puede hacer, como usar varios subprocesos: si tiene 8 núcleos disponibles, puede dividir la matriz en 8 secciones y lanzar un subproceso para cada sección. Pero el costo de iniciar los subprocesos puede ser demasiado alto si el costo de comparación es bajo.
La matriz puede ser grande, por lo que el intercambio de memoria virtual podría ralentizar las cosas. El uso de su propia copia de seguridad de archivos mapeados en memoria puede permitirle controlar el mapeo y anular la asignación para mantener bajo el uso de la memoria física. Puede desasignar una sección en la que acaba de terminar de buscar para que la memoria se pueda usar para secciones posteriores.
Solo algunas ideas. Buena suerte.