Hvordan bestemmes længden af ​​en matrix i C?


Bedste svar

Det er lidt uklart, hvad du spørger, men jeg antager, at spørgsmålet er, at der gives en matrix , hvordan bestemmer du dens længde.

C har flere typer arrays: arrays af ukendt størrelse, arrays med kendt konstant størrelse og arrays med variabel længde.

For en matrix af konstant størrelse, størrelsen er en del af sin type: længden af ​​en matrix, hvis type er int[10] er den meget 10. C har ingen mekanisme til at udtrække det direkte fra typen (i modsætning til C ++ ), men du kan gøre det indirekte gennem størrelsen af:

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 længde kan også beregnes med sizeof med identisk kode. I så fald udføres det ved kørselstid:

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

int a[x];

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

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

Endelig har arrays med ukendt bundet, pr. definition ukendt størrelse. Du bliver nødt til at få det gennem programlogikken

extern int a[];

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

Én advarsel kan selvfølgelig ikke nøgne arrays i C overføres til funktioner, og derfor skal størrelser beregnes på den, der ringer op, 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);

medlemsarrays kan naturligvis overføres til funktioner efter værdi:

struct a10 {int a[10];};

void f(struct a10 s) {

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

}

Svar

Et stort spørgsmål er, vil du søge flere gange? I så fald skal du oprette en hash-tabel eller et andet indeks en gang for at finde ting hurtigt. En hash-tabel kunne genereres på samme tid, hvor dataene læses fra disken (hvis det er her de kommer fra).

Hvis dette er en engangs ting, og data indlæses fra disken, skal du gøre søgningen overlappede med IO. Der kan bruges 2 eller flere buffere.

Et andet spørgsmål er, om du bare er interesseret i at vide, om noget er til stede, eller er der tilknyttede data, du vil hente? Hvis du bare vil vide, om et tal er til stede, kan et bit array muligvis bruges til en mere kompakt repræsentation.

Bortset fra det er inline C-kode, der bruger den hurtigste sammenligning, bedst; Brug alle de optimeringsmuligheder, som kompilatoren giver. Nogle kompilatorer genererer muligvis den samme hurtige kode, uanset om du bruger pegepinde, tællere 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 overveje at snyde at bede kompilatoren om at sende en assembler-kilde for at få en idé om, hvad den laver, men mindre compilere kan kræve det, hvis du virkelig er bekymret for ydeevne - bare for at se, hvilken form for C-kode der genereres det bedste resultat.

Så er der andre ting, du kan gøre, såsom at bruge flere tråde: Hvis du har 8 kerner til rådighed, kan du opdele arrayet i 8 sektioner og starte en tråd til hver sektion. Men omkostningerne ved at starte trådene kan være for høje, hvis sammenligningsomkostningerne er lave.

Arrayet kan være stort, så virtuel hukommelsesudskiftning kan bremse tingene. Brug af din egen hukommelseskortede filbacking muligvis giver dig mulighed for at kontrollere kortlægning og unmapping dig selv for at holde den fysiske hukommelsesforbrug lav. Du kan fjerne kortlægningen af ​​et afsnit, du lige er færdig med at søge, så hukommelsen kan bruges til senere sektioner.

Bare nogle ideer. Held og lykke.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *