Beste Antwort
Es ist etwas unklar, was Sie fragen, aber ich gehe davon aus, dass die Frage die eines gegebenen Arrays ist Wie bestimmen Sie die Länge?
C verfügt über verschiedene Arten von Arrays: Arrays unbekannter Größe, Arrays bekannter konstanter Größe und Arrays variabler Länge.
Für ein Array von konstante Größe, die Größe ist Teil seines Typs: Die Länge eines Arrays mit dem Typ int[10]
ist genau 10. C hat keinen Mechanismus, um dies direkt aus dem Typ zu extrahieren (im Gegensatz zu C ++ ), aber Sie können dies indirekt über sizeof tun:
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);
Die Größe eines Arrays variabler Länge kann auch mit sizeof mit identischem Code berechnet werden. In diesem Fall wird es zur Laufzeit ausgeführt:
scanf("\%d", &x);
int a[x];
size\_t sz = sizeof a / sizeof *a;
printf("size = \%zu\n", sz);
Schließlich haben Arrays unbekannter Grenzen Folgendes: per definitionem unbekannte größe. Sie müssten es durch die Programmlogik
extern int a[];
size\_t sz = something\_from\_the\_module\_that\_defines\_a();
Eine Einschränkung: Nackte Arrays in C können natürlich nicht an Funktionen übergeben werden. Daher müssen die Größen auf der Anruferseite berechnet und separat übergeben werden:
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);
Mitgliedsarrays können natürlich nach Wert an Funktionen übergeben werden:
struct a10 {int a[10];};
void f(struct a10 s) {
size\_t sz = sizeof s.a / sizeof *s.a;
}
Antwort
Eine wichtige Frage ist, ob Sie mehrmals suchen werden. Wenn ja, erstellen Sie einmal eine Hash-Tabelle oder einen anderen Index, um die Dinge schnell zu finden. Eine Hash-Tabelle kann zur gleichen Zeit generiert werden, zu der die Daten von der Festplatte gelesen werden (sofern sie von dort stammen).
Wenn dies einmalig ist und Daten von der Festplatte geladen werden, tun Sie dies Die Suche überschnitt sich mit dem IO. Es können 2 oder mehr Puffer verwendet werden.
Eine andere Frage ist, ob Sie nur wissen möchten, ob etwas vorhanden ist, oder ob zugehörige Daten abgerufen werden sollen. Wenn Sie nur wissen möchten, ob eine Zahl vorhanden ist, kann ein Bit-Array für eine kompaktere Darstellung verwendet werden.
Abgesehen davon ist Inline-C-Code mit dem schnellsten Vergleich am besten. Verwenden Sie alle vom Compiler bereitgestellten Optimierungsoptionen. Einige Compiler generieren möglicherweise denselben schnellen Code, unabhängig davon, ob Sie Zeiger, Zähler oder Indizierungen verwenden:
int * first = ..., * last = ...;
for ( ; first <= last; ++first ) if ( *first == target ) ...
oder
int * first = ..., count = ...;
for ( ; count-- > 0; ++first ) if ( *first == target ) ...
oder
int * first = ..., count = ..., index = ...;
for ( ; index < count; ++index ) if ( first[index] == target ) ...
Es könnte betrügerisch sein, den Compiler zu bitten, die Assembler-Quelle auszugeben, um eine Vorstellung davon zu bekommen, was er tut. Geringere Compiler benötigen dies jedoch möglicherweise, wenn Sie sich wirklich Gedanken über die Leistung machen - nur um zu sehen, welche Form von C-Code generiert wird Das beste Ergebnis.
Dann können Sie auch andere Threads verwenden: Wenn 8 Kerne verfügbar sind, können Sie das Array in 8 Abschnitte aufteilen und für jeden Abschnitt einen Thread starten. Die Kosten für das Starten der Threads sind jedoch möglicherweise zu hoch, wenn die Vergleichskosten niedrig sind.
Das Array ist möglicherweise groß, sodass das Austauschen des virtuellen Speichers die Arbeit verlangsamen kann. Wenn Sie Ihre eigene Speicherzuordnung verwenden, können Sie möglicherweise die Zuordnung steuern und die Zuordnung aufheben, um die physische Speichernutzung gering zu halten. Sie können die Zuordnung eines Abschnitts aufheben, den Sie gerade abgeschlossen haben, damit der Speicher für spätere Abschnitte verwendet werden kann.
Nur einige Ideen. Viel Glück.