DSA

Ordinamento di unione simultaneo nella memoria condivisa
2026

Ordinamento di unione simultaneo nella memoria condivisa

Dato un numero 'n' e n numeri, ordinare i numeri utilizzando l'ordinamento simultaneo. (Suggerimento: prova a utilizzare le chiamate di sistema shmget, shmat). Parte 1: l'algoritmo (COME?) Crea ricorsivamente due processi secondari, uno per la metà sinistra, uno per la metà destra. Se il numero di elementi nell'array per un processo è inferiore a 5, eseguire un ordinamento per inserimento. Il genitore dei due figli unisce quindi il risultato e ritorna al genitore e così via. Ma come renderlo simultaneo?Parte 2: La logica (PERCHÉ?) La parte importante della soluzione a questo problema non è algoritmica, ma spiegare i concetti di sistema operativo e kernel. Per ottenere un ordinamento simultaneo, abbiamo bisogno di un modo per far sì che due processi funzionino contemporaneamente sullo stesso array. Per rendere le cose più semplici Linux fornisce molte chiamate di sistema tramite semplici endpoint API. Due di essi sono shmget() (per l'allocazione della memoria condivisa) e shmat() (per le operazioni sulla memoria condivisa). Creiamo uno spazio di memoria condiviso tra il processo figlio che forziamo. Ogni segmento è diviso in figlio sinistro e figlio destro che vengono ordinati, la parte interessante è che lavorano contemporaneamente! shmget() richiede al kernel di allocare una pagina condivisa per entrambi i processi. Perché il tradizionale fork() non funziona? La risposta sta in ciò che fa effettivamente fork(). Dalla documentazione, "fork() crea un nuovo processo duplicando il processo chiamante". Il processo figlio e il processo genitore vengono eseguiti in spazi di memoria separati. Al momento di fork() entrambi gli spazi di memoria hanno lo stesso contenuto. Le scritture in memoria, le modifiche al descrittore di file (fd), ecc., eseguite da uno dei processi non influiscono sull'altro. Quindi abbiamo bisogno di un segmento di memoria condivisa.

Trova il costo minimo di aggiustamento di un array
2026

Trova il costo minimo di aggiustamento di un array

Dato un array di numeri interi positivi, sostituire ciascun elemento dell'array in modo tale che la differenza tra gli elementi adiacenti nell'array sia inferiore o uguale a un dato obiettivo. Dobbiamo minimizzare il costo di aggiustamento, cioè la somma delle differenze tra i nuovi e i vecchi valori. Fondamentalmente dobbiamo minimizzare ?|A[i] - Anew[i]| dove 0? io ? n-1, n è la dimensione di A[] e Anew[] è l'array con differenza adiacente inferiore o uguale alla destinazione. Supponiamo che tutti gli elementi dell'array siano inferiori alla costante M = 100.

Riorganizzare un dato elenco in modo che consista di elementi minimi massimi alternati
2026

Riorganizzare un dato elenco in modo che consista di elementi minimi massimi alternati

Data una lista di numeri interi, riorganizzare la lista in modo che consista nell'alternanza di elementi minimi massimi utilizzando solo operazioni di lista. Il primo elemento dell'elenco dovrebbe essere il minimo e il secondo elemento dovrebbe essere il massimo di tutti gli elementi presenti nell'elenco. Allo stesso modo, il terzo elemento sarà il successivo elemento minimo e il quarto elemento sarà il successivo elemento massimo e così via. Non è consentito l'utilizzo di spazi aggiuntivi. Esempi:

Celle attive e inattive dopo k giorni
2026

Celle attive e inattive dopo k giorni

Dato un array binario di dimensione n dove n > 3. Un valore vero (o 1) nell'array significa attivo e falso (o 0) significa inattivo. Dato un numero k, il compito è trovare il conteggio delle celle attive e inattive dopo k giorni. Dopo ogni giorno, lo stato della cella i-esima diventa attivo se le celle sinistra e destra non sono le stesse e inattivo se la cella sinistra e destra sono uguali (entrambi 0 o entrambi 1).

Ricerca per interpolazione
2026

Ricerca per interpolazione

Dato un array ordinato di n valori distribuiti uniformemente arr[], scrivere una funzione per cercare un particolare elemento x nell'array. La ricerca lineare trova l'elemento in tempo O(n), la ricerca per salto richiede tempo O(n) e la ricerca binaria richiede tempo O(log n). La ricerca per interpolazione rappresenta un miglioramento rispetto alla ricerca binaria per le istanze, in cui i valori in un array ordinato sono distribuiti uniformemente. L'interpolazione costruisce nuovi punti dati all'interno dell'intervallo di un insieme discreto di punti dati noti. La ricerca binaria va sempre all'elemento centrale per verificare. D'altra parte, la ricerca per interpolazione può andare in posizioni diverse a seconda del valore della chiave da cercare. Ad esempio, se il valore della chiave è più vicino all'ultimo elemento, è probabile che la ricerca per interpolazione inizi la ricerca verso il lato finale. Per trovare la posizione da cercare, utilizza la seguente formula.

Energia iniziale minima richiesta per attraversare la strada
2026

Energia iniziale minima richiesta per attraversare la strada

Dato un array contenente numeri positivi e negativi. La matrice rappresenta i checkpoint da un'estremità all'altra della strada. I valori positivi e negativi rappresentano la quantità di energia in quel punto di controllo. I numeri positivi aumentano l’energia mentre i numeri negativi la diminuiscono. Trova l'energia iniziale minima richiesta per attraversare la strada in modo tale che il livello di energia non diventi mai 0 o inferiore a 0.