Voglio creare un array molto grande su cui scrivo '0 e' 1. Sto cercando di simulare un processo fisico chiamato adsorbimento sequenziale casuale, in cui unità di lunghezza 2, dimeri, sono depositate su un reticolo n-dimensionale in una posizione casuale, senza sovrapporsi l'un l'altro. Il processo si interrompe quando non vi è più spazio sul reticolo per il deposito di più dimeri (il reticolo è bloccato).Come definire e lavorare con una serie di bit in C?
Inizialmente comincio con un reticolo di zeri, e i dimeri sono rappresentati da una coppia di "1". Quando ogni dimero viene depositato, il sito sulla sinistra del dimero viene bloccato, poiché i dimeri non possono sovrapporsi. Quindi simulo questo processo depositando una tripla di "1" sul reticolo. Devo ripetere l'intera simulazione un gran numero di volte e poi calcolare la percentuale di copertura media.
L'ho già fatto utilizzando una serie di caratteri per reticoli 1D e 2D. Al momento sto cercando di rendere il codice il più efficiente possibile, prima di lavorare sul problema 3D e su generalizzazioni più complicate.
Questo è fondamentalmente ciò che il codice è simile a 1D, semplificata:
int main()
{
/* Define lattice */
array = (char*)malloc(N * sizeof(char));
total_c = 0;
/* Carry out RSA multiple times */
for (i = 0; i < 1000; i++)
rand_seq_ads();
/* Calculate average coverage efficiency at jamming */
printf("coverage efficiency = %lf", total_c/1000);
return 0;
}
void rand_seq_ads()
{
/* Initialise array, initial conditions */
memset(a, 0, N * sizeof(char));
available_sites = N;
count = 0;
/* While the lattice still has enough room... */
while(available_sites != 0)
{
/* Generate random site location */
x = rand();
/* Deposit dimer (if site is available) */
if(array[x] == 0)
{
array[x] = 1;
array[x+1] = 1;
count += 1;
available_sites += -2;
}
/* Mark site left of dimer as unavailable (if its empty) */
if(array[x-1] == 0)
{
array[x-1] = 1;
available_sites += -1;
}
}
/* Calculate coverage %, and add to total */
c = count/N
total_c += c;
}
Per il progetto vero e proprio che sto facendo, si tratta non solo dimeri ma trimeri, quadrimers, e tutti i tipi di forme e dimensioni (per 2D e 3D).
Speravo che sarei stato in grado di lavorare con singoli bit anziché byte, ma ho letto e fino a quando posso dire che puoi cambiare solo 1 byte alla volta, quindi ho bisogno di fai qualche indicizzazione complicata o c'è un modo più semplice per farlo?
Grazie per le vostre risposte
Nota per una volta che stai lavorando su singoli bit: se l'efficienza è vitale, avrai probabl si desidera, ove possibile, applicare le operazioni su almeno un byte alla volta (ad es. guarda più coordinate contemporaneamente), poiché così facendo, se fatto bene, non costa nulla in più. Probabilmente non vale la seccatura per farlo, tranne nelle parti di bottleneck del codice. – Brian