Hvordan bestemmes lengden på en matrise i C?


Beste svaret

Det er litt uklart hva du spør, men jeg antar at spørsmålet er at gitt en matrise , hvordan bestemmer du lengden.

C har flere typer matriser: matriser med ukjent størrelse, matriser med kjent konstant størrelse og matriser med variabel lengde.

For en rekke konstant størrelse, størrelsen er en del av sin type: lengden på en matrise hvis type er int[10] er den veldig 10. C har ingen mekanisme for å trekke ut den direkte fra typen (i motsetning til C ++ ), men du kan gjøre det indirekte gjennom størrelsen på:

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);

Størrelsen på et array med variabel lengde kan også beregnes med sizeof, med identisk kode. I så fall kjøres det ved kjøretid:

scanf("\%d", &x);

int a[x];

size\_t sz = sizeof a / sizeof *a;

printf("size = \%zu\n", sz);

Endelig har matriser med ukjent bundet, per definisjon, ukjent størrelse. Du må få det gjennom programlogikken

extern int a[];

size\_t sz = something\_from\_the\_module\_that\_defines\_a();

En advarsel, selvfølgelig, kan ikke nakne matriser i C overføres til funksjoner, og derfor må størrelser beregnes på innringersiden og sendes separat:

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);

medlemsarrayer kan selvfølgelig overføres til funksjoner etter verdi:

struct a10 {int a[10];};

void f(struct a10 s) {

size\_t sz = sizeof s.a / sizeof *s.a;

}

Svar

Et viktig spørsmål er om du søker flere ganger? Bygg i så fall en hash-tabell eller annen indeks en gang for å finne ting raskt. En hash-tabell kan genereres samtidig dataene leses fra disken (hvis det er der de kommer fra).

Hvis dette er en engangs ting, og data lastes fra disk, gjør søket overlappet med IO. Det kan brukes to eller flere buffere.

Et annet spørsmål er om du bare er interessert i å vite om noe er tilstede, eller er det tilknyttede data du vil hente? Hvis du bare vil vite om et tall er til stede, kan en bitmatrise brukes til en mer kompakt representasjon.

Bortsett fra det, er inline C-kode som bruker den raskeste sammenligningen best; Bruk alle optimaliseringsalternativene Compiler tilbyr. Noen kompilatorer kan generere den samme raske koden uansett om du bruker pekere, tellere eller indeksering:

int * first = ..., * last = ...;

for ( ; first <= last; ++first ) if ( *first == target ) ...

eller

int * first = ..., count = ...;

for ( ; count-- > 0; ++first ) if ( *first == target ) ...

eller

int * first = ..., count = ..., index = ...;

for ( ; index < count; ++index ) if ( first[index] == target ) ...

Du kan vurdere det som juks å be kompilatoren om å sende ut samlerkilden for å få en ide om hva den gjør, men mindre kompilatorer kan kreve det hvis du er veldig opptatt av ytelse - bare for å se hvilken form for C-kode som genereres det beste resultatet.

Så er det andre ting du kan gjøre, for eksempel å bruke flere tråder: Hvis du har 8 kjerner tilgjengelig, kan du dele matrisen i åtte seksjoner og starte en tråd for hver seksjon. Men kostnadene ved å starte trådene kan være for høye hvis sammenligningskostnaden er lav.

Matrisen kan være stor, så bytte av virtuelt minne kan redusere sakene. Ved å bruke din egen minnekartede filbakgrunn kan du kontrollere kartlegging og kartlegging av deg selv for å holde fysisk minnebruk lav. Du kan kartlegge en del du nettopp har søkt etter, slik at minnet kan brukes til senere seksjoner.

Bare noen ideer. Lykke til.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *