Podcast
Questions and Answers
Quale tra le seguenti affermazioni descrive meglio il concetto di 'modularizzazione' nella progettazione del software?
Quale tra le seguenti affermazioni descrive meglio il concetto di 'modularizzazione' nella progettazione del software?
- Il processo di scrittura del codice sorgente in un linguaggio di programmazione specifico.
- L'ottimizzazione delle prestazioni del software attraverso l'uso di algoritmi avanzati.
- La suddivisione di un problema complesso in unità più piccole e gestibili. (correct)
- La creazione di interfacce utente grafiche intuitive per facilitare l'interazione con il software.
Qual è il beneficio principale derivante dal riuso di componenti software già esistenti e verificate?
Qual è il beneficio principale derivante dal riuso di componenti software già esistenti e verificate?
- Limita la flessibilità del software, rendendolo meno adattabile a nuovi requisiti.
- Riduce i tempi di sviluppo e aumenta l'affidabilità del software. (correct)
- Aumenta la complessità del codice, rendendolo più difficile da comprendere.
- Richiede una profonda conoscenza dei dettagli implementativi dei componenti riusati.
Cosa si intende per 'astrazione funzionale' nel contesto dello sviluppo di software?
Cosa si intende per 'astrazione funzionale' nel contesto dello sviluppo di software?
- L'utilizzo di funzioni di ordine superiore per manipolare altre funzioni come dati.
- L'ottimizzazione del codice delle funzioni per migliorare le prestazioni del software.
- La capacità di nascondere i dettagli implementativi di una funzione, concentrandosi sul suo comportamento esterno. (correct)
- La creazione di funzioni che eseguono compiti specifici senza effetti collaterali.
In che modo l'astrazione aiuta a gestire la complessità nello sviluppo di sistemi informatici di grandi dimensioni?
In che modo l'astrazione aiuta a gestire la complessità nello sviluppo di sistemi informatici di grandi dimensioni?
Considerando i principi di astrazione e information hiding, quale delle seguenti strategie architetturali li implementa al meglio?
Considerando i principi di astrazione e information hiding, quale delle seguenti strategie architetturali li implementa al meglio?
Cosa succede se !q
o q->numel==MAXPQ
nella funzione insert
?
Cosa succede se !q
o q->numel==MAXPQ
nella funzione insert
?
Qual è lo scopo principale della funzione sali
?
Qual è lo scopo principale della funzione sali
?
In un grafo orientato, cosa rappresenta l'insieme A?
In un grafo orientato, cosa rappresenta l'insieme A?
Cosa rappresenta la condizione pos > 1
all'interno del ciclo while
nella funzione sali
?
Cosa rappresenta la condizione pos > 1
all'interno del ciclo while
nella funzione sali
?
Considerando l'esempio di grafo orientato fornito, quale delle seguenti affermazioni è corretta riguardo agli archi?
Considerando l'esempio di grafo orientato fornito, quale delle seguenti affermazioni è corretta riguardo agli archi?
Quale delle seguenti affermazioni descrive correttamente un albero in informatica?
Quale delle seguenti affermazioni descrive correttamente un albero in informatica?
Nella funzione sali
, perché la variabile i
è inizializzata come pos/2
?
Nella funzione sali
, perché la variabile i
è inizializzata come pos/2
?
Supponendo di avere una PQueue q
con q->vet = {0, 3, 7, 5, 1}
e q->numel = 4
, cosa succederebbe immediatamente dopo l'esecuzione di sali(q)
all'interno della funzione insert
con una nuova key = 9
?
Supponendo di avere una PQueue q
con q->vet = {0, 3, 7, 5, 1}
e q->numel = 4
, cosa succederebbe immediatamente dopo l'esecuzione di sali(q)
all'interno della funzione insert
con una nuova key = 9
?
Qual è la caratteristica distintiva della radice in un albero?
Qual è la caratteristica distintiva della radice in un albero?
Cosa rappresenta la 'foglia' in un albero?
Cosa rappresenta la 'foglia' in un albero?
Come è definito il 'cammino' in un albero?
Come è definito il 'cammino' in un albero?
Cosa indica il 'livello' di un nodo in un albero?
Cosa indica il 'livello' di un nodo in un albero?
Come si calcola l'altezza di un albero?
Come si calcola l'altezza di un albero?
Quale delle seguenti affermazioni descrive correttamente un sottoalbero?
Quale delle seguenti affermazioni descrive correttamente un sottoalbero?
In un albero binario, quale distinzione fondamentale viene fatta tra i figli di un nodo?
In un albero binario, quale distinzione fondamentale viene fatta tra i figli di un nodo?
Considerando un albero in cui ogni nodo ha un'etichetta numerica, e sapendo che l'altezza dell'albero è $h$, qual è il numero massimo di nodi che l'albero può contenere, assumendo che ogni livello sia completamente pieno?
Considerando un albero in cui ogni nodo ha un'etichetta numerica, e sapendo che l'altezza dell'albero è $h$, qual è il numero massimo di nodi che l'albero può contenere, assumendo che ogni livello sia completamente pieno?
Qual il contenuto del riferimento nell'ultimo nodo di una lista concatenata?
Qual il contenuto del riferimento nell'ultimo nodo di una lista concatenata?
Qual uno dei principali vantaggi delle liste concatenate rispetto agli array?
Qual uno dei principali vantaggi delle liste concatenate rispetto agli array?
Qual uno svantaggio principale delle liste concatenate rispetto agli array nell'accesso agli elementi?
Qual uno svantaggio principale delle liste concatenate rispetto agli array nell'accesso agli elementi?
Come si inserisce un nuovo elemento in testa a una lista concatenata?
Come si inserisce un nuovo elemento in testa a una lista concatenata?
Qual la complessit temporale per accedere all'i-esimo elemento in una lista concatenata?
Qual la complessit temporale per accedere all'i-esimo elemento in una lista concatenata?
In una lista concatenata, quale operazione generalmente pi efficiente rispetto agli array quando si tratta di modificare la struttura della collezione?
In una lista concatenata, quale operazione generalmente pi efficiente rispetto agli array quando si tratta di modificare la struttura della collezione?
Supponendo di avere una lista concatenata semplice, non ordinata, quale sarebbe la complessit temporale nel caso peggiore per cercare un elemento specifico nella lista?
Supponendo di avere una lista concatenata semplice, non ordinata, quale sarebbe la complessit temporale nel caso peggiore per cercare un elemento specifico nella lista?
Se si dovesse invertire una lista concatenata semplice, qual la complessit spaziale aggiuntiva minima che si pu ottenere in un algoritmo iterativo?
Se si dovesse invertire una lista concatenata semplice, qual la complessit spaziale aggiuntiva minima che si pu ottenere in un algoritmo iterativo?
Considera una lista concatenata in cui ogni nodo ha un puntatore al nodo successivo e un puntatore al nodo precedente (lista doppiamente concatenata). Come influisce questo sulla complessit temporale per cancellare un nodo arbitrario (non la testa o la coda) conoscendo il puntatore a quel nodo?
Considera una lista concatenata in cui ogni nodo ha un puntatore al nodo successivo e un puntatore al nodo precedente (lista doppiamente concatenata). Come influisce questo sulla complessit temporale per cancellare un nodo arbitrario (non la testa o la coda) conoscendo il puntatore a quel nodo?
Supponiamo di avere due liste concatenate ordinate, lista1
e lista2
, di lunghezza m
e n
rispettivamente. Qual la complessit temporale ottimale per fondere (merge) le due liste in una nuova lista concatenata ordinata?
Supponiamo di avere due liste concatenate ordinate, lista1
e lista2
, di lunghezza m
e n
rispettivamente. Qual la complessit temporale ottimale per fondere (merge) le due liste in una nuova lista concatenata ordinata?
Quale delle seguenti affermazioni descrive correttamente la funzione newStack()
?
Quale delle seguenti affermazioni descrive correttamente la funzione newStack()
?
Cosa restituisce la funzione emptyStack(stack s)
?
Cosa restituisce la funzione emptyStack(stack s)
?
Qual è il valore di ritorno della funzione push(item val, stack s)
se lo stack è pieno?
Qual è il valore di ritorno della funzione push(item val, stack s)
se lo stack è pieno?
Qual è lo scopo della funzione top(stack s)
?
Qual è lo scopo della funzione top(stack s)
?
Cosa succede se si chiama pop(stack s)
su uno stack vuoto?
Cosa succede se si chiama pop(stack s)
su uno stack vuoto?
Considerando l'implementazione dello stack basata su array, quale operazione potrebbe causare un errore di 'stack overflow'?
Considerando l'implementazione dello stack basata su array, quale operazione potrebbe causare un errore di 'stack overflow'?
Qual è il risultato della verifica di bilanciamento delle parentesi per la stringa (a + b[c - d]) * {e / f}
?
Qual è il risultato della verifica di bilanciamento delle parentesi per la stringa (a + b[c - d]) * {e / f}
?
Nella funzione verifica(char *expr)
, cosa succede se l'espressione expr
è NULL
?
Nella funzione verifica(char *expr)
, cosa succede se l'espressione expr
è NULL
?
Data l'espressione ()[{}]
, quale sarà il contenuto dello stack S
immediatamente prima che la funzione verifica
restituisca il valore finale?
Data l'espressione ()[{}]
, quale sarà il contenuto dello stack S
immediatamente prima che la funzione verifica
restituisca il valore finale?
Quale modifica all'implementazione dello stack basata su array permetterebbe di evitare la limitazione di MAXSTACK
(insanely difficult)?
Quale modifica all'implementazione dello stack basata su array permetterebbe di evitare la limitazione di MAXSTACK
(insanely difficult)?
Nell'implementazione dello stack basata su array dinamico, quale sequenza di eventi si verifica esattamente quando la funzione push
viene chiamata con uno stack pieno (s->top == s->size
) e la realloc
fallisce?
Nell'implementazione dello stack basata su array dinamico, quale sequenza di eventi si verifica esattamente quando la funzione push
viene chiamata con uno stack pieno (s->top == s->size
) e la realloc
fallisce?
Considerando l'implementazione dello stack con liste collegate, cosa accadrebbe se, all'interno della funzione pop
, la riga s->top = s->top->next;
venisse eseguita prima dell'assegnazione di s->top
a temp
?
Considerando l'implementazione dello stack con liste collegate, cosa accadrebbe se, all'interno della funzione pop
, la riga s->top = s->top->next;
venisse eseguita prima dell'assegnazione di s->top
a temp
?
Nell'implementazione dello stack con array dinamico, se volessimo implementare una funzione clearStack(stack s)
che svuota lo stack e rilascia la memoria allocata, quale sarebbe l'implementazione più corretta per evitare memory leak e dangling pointers?
Nell'implementazione dello stack con array dinamico, se volessimo implementare una funzione clearStack(stack s)
che svuota lo stack e rilascia la memoria allocata, quale sarebbe l'implementazione più corretta per evitare memory leak e dangling pointers?
Si consideri l'implementazione dello stack basata su lista concatenata. Quale delle seguenti affermazioni descrive accuratamente la complessità temporale nel caso peggiore per una sequenza di $n$ operazioni push
seguite da $n$ operazioni pop
?
Si consideri l'implementazione dello stack basata su lista concatenata. Quale delle seguenti affermazioni descrive accuratamente la complessità temporale nel caso peggiore per una sequenza di $n$ operazioni push
seguite da $n$ operazioni pop
?
Supponiamo di voler estendere l'implementazione dello stack basata su array dinamico per includere una funzione duplicateStack(stack s)
che crea una copia profonda dello stack originale. Quale delle seguenti implementazioni garantirebbe la corretta gestione della memoria e l'indipendenza tra lo stack originale e la copia?
Supponiamo di voler estendere l'implementazione dello stack basata su array dinamico per includere una funzione duplicateStack(stack s)
che crea una copia profonda dello stack originale. Quale delle seguenti implementazioni garantirebbe la corretta gestione della memoria e l'indipendenza tra lo stack originale e la copia?
In un'implementazione di posItem
(versione ricorsiva), quali implicazioni deriverebbero da una gestione impropria della ricorsione terminale (tail recursion) in termini di consumo di risorse?
In un'implementazione di posItem
(versione ricorsiva), quali implicazioni deriverebbero da una gestione impropria della ricorsione terminale (tail recursion) in termini di consumo di risorse?
Considerando l'implementazione iterativa di posItem
, quale sarebbe l'effetto di sostituire l = tailList(l)
con l = newList()
all'interno del ciclo while
, assumendo che newList()
crei una nuova lista vuota?
Considerando l'implementazione iterativa di posItem
, quale sarebbe l'effetto di sostituire l = tailList(l)
con l = newList()
all'interno del ciclo while
, assumendo che newList()
crei una nuova lista vuota?
Nell'implementazione di getItem
, quale sarebbe l'impatto di invertire l'ordine delle condizioni nel ciclo while
in while (!emptyList(l) && i < pos)
?
Nell'implementazione di getItem
, quale sarebbe l'impatto di invertire l'ordine delle condizioni nel ciclo while
in while (!emptyList(l) && i < pos)
?
Considerando la funzione reverseList
, quale sarebbe la complessità computazionale nel caso in cui la funzione consList
avesse una complessità temporale di $O(n)$, dove $n$ è la lunghezza della lista?
Considerando la funzione reverseList
, quale sarebbe la complessità computazionale nel caso in cui la funzione consList
avesse una complessità temporale di $O(n)$, dove $n$ è la lunghezza della lista?
Supponendo di avere una lista lst1
contenente stringhe, e che la funzione output_item(val)
stampi la stringa val
. Se lst1
contiene le stringhe {"alfa", "beta", "gamma"}, in quale ordine verrebbero stampate le stringhe utilizzando la funzione outputList
?
Supponendo di avere una lista lst1
contenente stringhe, e che la funzione output_item(val)
stampi la stringa val
. Se lst1
contiene le stringhe {"alfa", "beta", "gamma"}, in quale ordine verrebbero stampate le stringhe utilizzando la funzione outputList
?
Data l'implementazione di reverseList
, se la lista originale l
condividesse alcuni elementi (in memoria) con un'altra lista l2
, quale sarebbe l'effetto collaterale potenziale sull'altra lista dopo l'esecuzione di reverseList(l)
?
Data l'implementazione di reverseList
, se la lista originale l
condividesse alcuni elementi (in memoria) con un'altra lista l2
, quale sarebbe l'effetto collaterale potenziale sull'altra lista dopo l'esecuzione di reverseList(l)
?
Nell'implementazione ricorsiva di posItem
, supponendo che la lista l
sia ciclica, cosa accadrebbe all'esecuzione della funzione?
Nell'implementazione ricorsiva di posItem
, supponendo che la lista l
sia ciclica, cosa accadrebbe all'esecuzione della funzione?
Considerando una variante di outputList
che utilizzi la ricorsione terminale per la visualizzazione degli elementi, quale ottimizzazione specifica del compilatore potrebbe prevenire lo stack overflow per liste estremamente lunghe?
Considerando una variante di outputList
che utilizzi la ricorsione terminale per la visualizzazione degli elementi, quale ottimizzazione specifica del compilatore potrebbe prevenire lo stack overflow per liste estremamente lunghe?
In una implementazione alternativa di reverseList
che modifica in-place la lista originale (senza creare una nuova lista), quale sarebbe la complessità spaziale di tale algoritmo?
In una implementazione alternativa di reverseList
che modifica in-place la lista originale (senza creare una nuova lista), quale sarebbe la complessità spaziale di tale algoritmo?
Supponiamo di voler modificare la funzione getItem
per supportare l'accesso a elementi con indice negativo, dove un indice negativo -k
indica il $k$-esimo elemento a partire dalla fine della lista. Come si dovrebbe modificare l'implementazione per gestire correttamente gli indici negativi mantenendo l'efficienza?
Supponiamo di voler modificare la funzione getItem
per supportare l'accesso a elementi con indice negativo, dove un indice negativo -k
indica il $k$-esimo elemento a partire dalla fine della lista. Come si dovrebbe modificare l'implementazione per gestire correttamente gli indici negativi mantenendo l'efficienza?
Considerando l'implementazione dell'ADT Btree fornita, quale implicazione critica scaturisce dall'indipendenza del tipo item
e come influisce sulla polimorfizzazione dell'ADT stesso?
Considerando l'implementazione dell'ADT Btree fornita, quale implicazione critica scaturisce dall'indipendenza del tipo item
e come influisce sulla polimorfizzazione dell'ADT stesso?
Nell'implementazione di consBtree
, la gestione della memoria tramite malloc
e la successiva assegnazione di valori ai campi left
e right
del nuovo nodo possono potenzialmente portare a scenari problematici in sistemi con risorse limitate. Quale tra le seguenti strategie di gestione della memoria risulterebbe più efficace per mitigare tali problematiche, preservando al contempo la corretta semantica dell'ADT?
Nell'implementazione di consBtree
, la gestione della memoria tramite malloc
e la successiva assegnazione di valori ai campi left
e right
del nuovo nodo possono potenzialmente portare a scenari problematici in sistemi con risorse limitate. Quale tra le seguenti strategie di gestione della memoria risulterebbe più efficace per mitigare tali problematiche, preservando al contempo la corretta semantica dell'ADT?
Data l'implementazione dell'ADT Btree fornita, e ipotizzando di voler estendere l'interfaccia con una funzione altezzaBtree(Btree T)
che calcola l'altezza dell'albero, quale delle seguenti implementazioni risulterebbe la più efficiente in termini di complessità computazionale, considerando il caso di un albero degenere (ovvero, un albero in cui ogni nodo ha al più un figlio)?
Data l'implementazione dell'ADT Btree fornita, e ipotizzando di voler estendere l'interfaccia con una funzione altezzaBtree(Btree T)
che calcola l'altezza dell'albero, quale delle seguenti implementazioni risulterebbe la più efficiente in termini di complessità computazionale, considerando il caso di un albero degenere (ovvero, un albero in cui ogni nodo ha al più un figlio)?
Si consideri l'implementazione fornita e si ipotizzi di voler aggiungere all'ADT Btree la funzionalità di ricerca di un nodo con un determinato valore item
. Quale tra le seguenti strategie di ricerca risulterebbe la meno efficiente in termini di complessità temporale nel caso medio, assumendo che l'albero non sia ordinato e che la funzione di confronto tra item
abbia complessità $O(1)$?
Si consideri l'implementazione fornita e si ipotizzi di voler aggiungere all'ADT Btree la funzionalità di ricerca di un nodo con un determinato valore item
. Quale tra le seguenti strategie di ricerca risulterebbe la meno efficiente in termini di complessità temporale nel caso medio, assumendo che l'albero non sia ordinato e che la funzione di confronto tra item
abbia complessità $O(1)$?
Nell'implementazione dell'ADT Btree basata su puntatori, quale meccanismo di protezione avanzata potrebbe essere integrato per prevenire vulnerabilità legate a dangling pointers o double free, considerando che l'ambiente di esecuzione non fornisce garbage collection automatica?
Nell'implementazione dell'ADT Btree basata su puntatori, quale meccanismo di protezione avanzata potrebbe essere integrato per prevenire vulnerabilità legate a dangling pointers o double free, considerando che l'ambiente di esecuzione non fornisce garbage collection automatica?
Si consideri lo scenario in cui sia necessario serializzare un albero binario (Btree) implementato secondo l'ADT fornito, al fine di trasferirlo su una rete o memorizzarlo su disco. Quale tra i seguenti approcci di serializzazione risulterebbe più robusto e versatile per gestire alberi binari di forma arbitraria, inclusi quelli sbilanciati o degeneri, garantendo al contempo una deserializzazione corretta e efficiente?
Si consideri lo scenario in cui sia necessario serializzare un albero binario (Btree) implementato secondo l'ADT fornito, al fine di trasferirlo su una rete o memorizzarlo su disco. Quale tra i seguenti approcci di serializzazione risulterebbe più robusto e versatile per gestire alberi binari di forma arbitraria, inclusi quelli sbilanciati o degeneri, garantendo al contempo una deserializzazione corretta e efficiente?
Supponendo di voler parallelizzare l'algoritmo di visita di un albero binario (Btree) implementato secondo l'ADT fornito, con l'obiettivo di massimizzare l'utilizzo delle risorse di un'architettura multi-core, quale tra le seguenti strategie di parallelizzazione risulterebbe più efficace, considerando che la funzione getItem(node *N)
potrebbe avere effetti collaterali (side effects) non trascurabili?
Supponendo di voler parallelizzare l'algoritmo di visita di un albero binario (Btree) implementato secondo l'ADT fornito, con l'obiettivo di massimizzare l'utilizzo delle risorse di un'architettura multi-core, quale tra le seguenti strategie di parallelizzazione risulterebbe più efficace, considerando che la funzione getItem(node *N)
potrebbe avere effetti collaterali (side effects) non trascurabili?
In un'implementazione di una coda (queue) basata su lista concatenata, quale tra le seguenti situazioni provocherebbe una perdita di memoria (memory leak) non immediatamente evidente durante ripetute operazioni di enqueue
e dequeue
?
In un'implementazione di una coda (queue) basata su lista concatenata, quale tra le seguenti situazioni provocherebbe una perdita di memoria (memory leak) non immediatamente evidente durante ripetute operazioni di enqueue
e dequeue
?
Considerando l'implementazione di una coda con array circolari, in quale scenario specifico l'operazione di enqueue
fallirebbe anche se q->size < MAXQUEUE-1
, e come si potrebbe correggere?
Considerando l'implementazione di una coda con array circolari, in quale scenario specifico l'operazione di enqueue
fallirebbe anche se q->size < MAXQUEUE-1
, e come si potrebbe correggere?
In un sistema embedded con risorse di memoria estremamente limitate, quale tra le seguenti ottimizzazioni complesse nell'implementazione di una coda basata su lista concatenata potrebbe ridurre significativamente l'overhead di memoria, pur mantenendo la funzionalità?
In un sistema embedded con risorse di memoria estremamente limitate, quale tra le seguenti ottimizzazioni complesse nell'implementazione di una coda basata su lista concatenata potrebbe ridurre significativamente l'overhead di memoria, pur mantenendo la funzionalità?
Considerando una coda implementata con un array circolare di dimensione MAXQUEUE
, quale combinazione di operazioni di enqueue
e dequeue
porterebbe alla situazione più critica in termini di frammentazione dello spazio nell'array, rendendo difficile il riutilizzo efficiente dello spazio anche se la coda non è piena?
Considerando una coda implementata con un array circolare di dimensione MAXQUEUE
, quale combinazione di operazioni di enqueue
e dequeue
porterebbe alla situazione più critica in termini di frammentazione dello spazio nell'array, rendendo difficile il riutilizzo efficiente dello spazio anche se la coda non è piena?
In un'implementazione concorrente di una coda, dove più thread eseguono operazioni di enqueue
e dequeue
simultaneamente, quale meccanismo di sincronizzazione avanzato sarebbe il più appropriato per garantire l'assenza di starvation e la massimizzazione della throughput, minimizzando la contesa?
In un'implementazione concorrente di una coda, dove più thread eseguono operazioni di enqueue
e dequeue
simultaneamente, quale meccanismo di sincronizzazione avanzato sarebbe il più appropriato per garantire l'assenza di starvation e la massimizzazione della throughput, minimizzando la contesa?
Data un'implementazione di coda basata su array con prestazioni degradanti a causa di frequenti spostamenti di elementi (quando head
si avvicina alla fine dell'array), quale strategia di ristrutturazione dinamica della coda risulterebbe più efficace per mitigare questo problema senza introdurre latenza inaspettata nelle operazioni di base?
Data un'implementazione di coda basata su array con prestazioni degradanti a causa di frequenti spostamenti di elementi (quando head
si avvicina alla fine dell'array), quale strategia di ristrutturazione dinamica della coda risulterebbe più efficace per mitigare questo problema senza introdurre latenza inaspettata nelle operazioni di base?
In un contesto di simulazione ad eventi discreti, dove è necessario gestire una coda di eventi ordinati per tempo di esecuzione, quale struttura dati ibrida combinerebbe i vantaggi di una coda e di un albero di ricerca bilanciato per ottimizzare sia l'inserimento (enqueue) che l'estrazione (dequeue) dell'evento con il tempo di esecuzione più imminente?
In un contesto di simulazione ad eventi discreti, dove è necessario gestire una coda di eventi ordinati per tempo di esecuzione, quale struttura dati ibrida combinerebbe i vantaggi di una coda e di un albero di ricerca bilanciato per ottimizzare sia l'inserimento (enqueue) che l'estrazione (dequeue) dell'evento con il tempo di esecuzione più imminente?
Considerando un'applicazione real-time in cui la latenza massima di un'operazione di dequeue
è critica, quale implementazione di coda, combinata con quale strategia di prevenzione della frammentazione della memoria, offrirebbe la garanzia più rigorosa di rispetto dei vincoli temporali?
Considerando un'applicazione real-time in cui la latenza massima di un'operazione di dequeue
è critica, quale implementazione di coda, combinata con quale strategia di prevenzione della frammentazione della memoria, offrirebbe la garanzia più rigorosa di rispetto dei vincoli temporali?
In un sistema distribuito dove le operazioni di enqueue
e dequeue
avvengono su nodi differenti e la consistenza della coda deve essere garantita in presenza di guasti, quale protocollo di consenso distribuito e quale struttura dati tollerante ai guasti sarebbero più appropriati per implementare una coda distribuita ad alta affidabilità?
In un sistema distribuito dove le operazioni di enqueue
e dequeue
avvengono su nodi differenti e la consistenza della coda deve essere garantita in presenza di guasti, quale protocollo di consenso distribuito e quale struttura dati tollerante ai guasti sarebbero più appropriati per implementare una coda distribuita ad alta affidabilità?
Nell'analisi asintotica della complessità computazionale, quale combinazione di implementazione di coda e pattern di utilizzo renderebbe più evidente la differenza tra la complessità teorica e le prestazioni reali a causa di effetti di cache e branch prediction?
Nell'analisi asintotica della complessità computazionale, quale combinazione di implementazione di coda e pattern di utilizzo renderebbe più evidente la differenza tra la complessità teorica e le prestazioni reali a causa di effetti di cache e branch prediction?
Considerando la specifica semantica dell'operatore removeItem(l, e)
, quale delle seguenti affermazioni descrive con la maggiore precisione il comportamento in caso di molteplici occorrenze dell'elemento e
nella lista l
?
Considerando la specifica semantica dell'operatore removeItem(l, e)
, quale delle seguenti affermazioni descrive con la maggiore precisione il comportamento in caso di molteplici occorrenze dell'elemento e
nella lista l
?
Nell'implementazione dell'ADT Lista, se si volesse estendere la funzionalit base per includere un operatore concatList(list l1, list l2)
che concateni due liste, creando una nuova lista contenente gli elementi di l1
seguiti da quelli di l2
, quale sarebbe l'approccio pi efficiente in termini di complessit temporale, assumendo che le liste non siano ordinate e che si voglia preservare l'ordine originale degli elementi?
Nell'implementazione dell'ADT Lista, se si volesse estendere la funzionalit base per includere un operatore concatList(list l1, list l2)
che concateni due liste, creando una nuova lista contenente gli elementi di l1
seguiti da quelli di l2
, quale sarebbe l'approccio pi efficiente in termini di complessit temporale, assumendo che le liste non siano ordinate e che si voglia preservare l'ordine originale degli elementi?
Si consideri una lista concatenata implementata con le funzioni consList
, tailList
, getFirst
ed emptyList
. Si vuole implementare una funzione filterList(list l, boolean (*filter)(item))
che restituisca una nuova lista contenente solo gli elementi di l
per cui la funzione filter(item)
restituisce true
. Quale delle seguenti implementazioni garantisce la preservazione dell'ordine originale degli elementi filtrati e minimizza l'uso di memoria aggiuntiva?
Si consideri una lista concatenata implementata con le funzioni consList
, tailList
, getFirst
ed emptyList
. Si vuole implementare una funzione filterList(list l, boolean (*filter)(item))
che restituisca una nuova lista contenente solo gli elementi di l
per cui la funzione filter(item)
restituisce true
. Quale delle seguenti implementazioni garantisce la preservazione dell'ordine originale degli elementi filtrati e minimizza l'uso di memoria aggiuntiva?
Supponendo di avere accesso solo agli operatori di base dell'ADT lista ( newList
, emptyList
, consList
, headList
, tailList
), come implementeresti in modo efficiente una funzione reverseList_inplace(list l)
che inverta la lista data modificandola direttamente, senza allocare nuova memoria per i nodi della lista (cio, senza creare nuovi nodi)?
Supponendo di avere accesso solo agli operatori di base dell'ADT lista ( newList
, emptyList
, consList
, headList
, tailList
), come implementeresti in modo efficiente una funzione reverseList_inplace(list l)
che inverta la lista data modificandola direttamente, senza allocare nuova memoria per i nodi della lista (cio, senza creare nuovi nodi)?
Si consideri una variante dell'ADT lista in cui ogni nodo contiene, oltre al valore dell'elemento e al puntatore al nodo successivo, un puntatore a una funzione di confronto int (*compare)(item a, item b)
. Come influirebbe la presenza di tale funzione sull'implementazione di un operatore sortList(list l)
che ordina la lista sul posto (cio, senza allocare nuova memoria per i nodi), e quale algoritmo di ordinamento sarebbe pi appropriato in questo contesto, considerando che non si possono usare array temporanei?
Si consideri una variante dell'ADT lista in cui ogni nodo contiene, oltre al valore dell'elemento e al puntatore al nodo successivo, un puntatore a una funzione di confronto int (*compare)(item a, item b)
. Come influirebbe la presenza di tale funzione sull'implementazione di un operatore sortList(list l)
che ordina la lista sul posto (cio, senza allocare nuova memoria per i nodi), e quale algoritmo di ordinamento sarebbe pi appropriato in questo contesto, considerando che non si possono usare array temporanei?
In un'implementazione dell'ADT lista, si supponga di voler aggiungere una funzionalit di 'undo' che permetta di ripristinare lo stato della lista a un certo punto precedente nel tempo. Quale tra le seguenti strategie sarebbe pi appropriata per minimizzare l'impatto sulla performance delle operazioni di base (aggiunta, rimozione, accesso) e sull'utilizzo di memoria, considerando che la funzionalit di 'undo' non deve essere persistente (cio, lo stato pu essere perso alla chiusura del programma)?
In un'implementazione dell'ADT lista, si supponga di voler aggiungere una funzionalit di 'undo' che permetta di ripristinare lo stato della lista a un certo punto precedente nel tempo. Quale tra le seguenti strategie sarebbe pi appropriata per minimizzare l'impatto sulla performance delle operazioni di base (aggiunta, rimozione, accesso) e sull'utilizzo di memoria, considerando che la funzionalit di 'undo' non deve essere persistente (cio, lo stato pu essere perso alla chiusura del programma)?
Si consideri una lista doppiamente concatenata in cui ogni nodo ha puntatori sia al nodo successivo (next
) che al nodo precedente (prev
). Se si volesse implementare una funzione moveNode(node* nodeToMove, list* destList)
che sposta un nodo arbitrario nodeToMove da una lista ad un'altra destList, garantendo che tutte le operazioni di aggiornamento dei puntatori siano eseguite in tempo costante ($O(1)$), quale delle seguenti implementazioni minimizzerebbe il rischio di errori (come puntatori pendenti o liste corrotte) e massimizzerebbe la robustezza del codice?
Si consideri una lista doppiamente concatenata in cui ogni nodo ha puntatori sia al nodo successivo (next
) che al nodo precedente (prev
). Se si volesse implementare una funzione moveNode(node* nodeToMove, list* destList)
che sposta un nodo arbitrario nodeToMove da una lista ad un'altra destList, garantendo che tutte le operazioni di aggiornamento dei puntatori siano eseguite in tempo costante ($O(1)$), quale delle seguenti implementazioni minimizzerebbe il rischio di errori (come puntatori pendenti o liste corrotte) e massimizzerebbe la robustezza del codice?
Si consideri un'applicazione che utilizza l'ADT Lista per rappresentare una sequenza di transazioni finanziarie. A causa di requisiti normativi, necessario garantire che la lista delle transazioni sia immutabile: una volta creata, non pu essere modificata. Tuttavia, necessario supportare operazioni di filtraggio (selezionare transazioni in un certo intervallo di date) e aggregazione (calcolare la somma delle transazioni per categoria). Quale tra le seguenti combinazioni di tecniche di implementazione sarebbe pi adatta per soddisfare questi requisiti, ottimizzando al contempo le prestazioni per le operazioni di filtraggio e aggregazione?
Si consideri un'applicazione che utilizza l'ADT Lista per rappresentare una sequenza di transazioni finanziarie. A causa di requisiti normativi, necessario garantire che la lista delle transazioni sia immutabile: una volta creata, non pu essere modificata. Tuttavia, necessario supportare operazioni di filtraggio (selezionare transazioni in un certo intervallo di date) e aggregazione (calcolare la somma delle transazioni per categoria). Quale tra le seguenti combinazioni di tecniche di implementazione sarebbe pi adatta per soddisfare questi requisiti, ottimizzando al contempo le prestazioni per le operazioni di filtraggio e aggregazione?
Data una lista concatenata che rappresenta un polinomio, dove ogni nodo contiene il coefficiente e l'esponente di un termine (es. $3x^2$ sarebbe un nodo con coefficiente 3 ed esponente 2), e sapendo che la lista ordinata per esponente decrescente, quale algoritmo sarebbe pi efficiente per valutare il polinomio per un dato valore di $x$, minimizzando le operazioni aritmetiche e l'uso di memoria aggiuntiva?
Data una lista concatenata che rappresenta un polinomio, dove ogni nodo contiene il coefficiente e l'esponente di un termine (es. $3x^2$ sarebbe un nodo con coefficiente 3 ed esponente 2), e sapendo che la lista ordinata per esponente decrescente, quale algoritmo sarebbe pi efficiente per valutare il polinomio per un dato valore di $x$, minimizzando le operazioni aritmetiche e l'uso di memoria aggiuntiva?
Considerando l'implementazione iterativa di posItem
, cosa accadrebbe se la condizione !emptyList(l) && !found
venisse modificata in !found && !emptyList(l)
?
Considerando l'implementazione iterativa di posItem
, cosa accadrebbe se la condizione !emptyList(l) && !found
venisse modificata in !found && !emptyList(l)
?
Nell'implementazione ricorsiva di posItem
, cosa succederebbe se si omettesse il controllo if emptyList(l) return -1;
?
Nell'implementazione ricorsiva di posItem
, cosa succederebbe se si omettesse il controllo if emptyList(l) return -1;
?
Nella funzione getItem
, se la condizione pos < 0
fosse omessa, quale sarebbe il comportamento della funzione quando pos
un numero negativo?
Nella funzione getItem
, se la condizione pos < 0
fosse omessa, quale sarebbe il comportamento della funzione quando pos
un numero negativo?
Supponiamo di voler modificare getItem
per gestire posizioni superiori alla lunghezza della lista, restituendo l'ultimo elemento anzich NULLITEM
. Come si dovrebbe modificare la funzione?
Supponiamo di voler modificare getItem
per gestire posizioni superiori alla lunghezza della lista, restituendo l'ultimo elemento anzich NULLITEM
. Come si dovrebbe modificare la funzione?
Nella funzione reverseList
, cosa succederebbe se la riga l = tailList(l)
venisse omessa all'interno del ciclo while
?
Nella funzione reverseList
, cosa succederebbe se la riga l = tailList(l)
venisse omessa all'interno del ciclo while
?
Supponendo che la funzione consList
abbia una complessit temporale di $O(1)$, qual la complessit temporale della funzione reverseList
?
Supponendo che la funzione consList
abbia una complessit temporale di $O(1)$, qual la complessit temporale della funzione reverseList
?
Nella funzione outputList
, cosa accadrebbe se la riga i++;
venisse spostata prima della chiamata a output_item(val)
?
Nella funzione outputList
, cosa accadrebbe se la riga i++;
venisse spostata prima della chiamata a output_item(val)
?
Si consideri una variante di outputList
in cui si desidera interrompere la visualizzazione dopo un certo numero di elementi, ad esempio 5. Quale modifica sarebbe necessaria per implementare questa funzionalit?
Si consideri una variante di outputList
in cui si desidera interrompere la visualizzazione dopo un certo numero di elementi, ad esempio 5. Quale modifica sarebbe necessaria per implementare questa funzionalit?
Qual è la differenza fondamentale tra un file header (.h) e un file di implementazione (.c) in un modulo C?
Qual è la differenza fondamentale tra un file header (.h) e un file di implementazione (.c) in un modulo C?
Quale dei seguenti è un vantaggio chiave dell'utilizzo di moduli in C per l'implementazione di astrazioni funzionali?
Quale dei seguenti è un vantaggio chiave dell'utilizzo di moduli in C per l'implementazione di astrazioni funzionali?
Dove dovrebbero essere inseriti i commenti relativi alla specifica di una funzione in un modulo C?
Dove dovrebbero essere inseriti i commenti relativi alla specifica di una funzione in un modulo C?
Considerando un modulo vettore
con funzioni come ordina_array
e ricerca_array
, e un programma principale ordina_array.c
che utilizza questo modulo, quale direttiva #include
è necessaria in ordina_array.c
per utilizzare le funzioni del modulo vettore
?
Considerando un modulo vettore
con funzioni come ordina_array
e ricerca_array
, e un programma principale ordina_array.c
che utilizza questo modulo, quale direttiva #include
è necessaria in ordina_array.c
per utilizzare le funzioni del modulo vettore
?
Nell'esempio fornito, la funzione minimo_i
è dichiarata nel file vettore.c
, ma non nel file vettore.h
. Cosa implica questo?
Nell'esempio fornito, la funzione minimo_i
è dichiarata nel file vettore.c
, ma non nel file vettore.h
. Cosa implica questo?
Se il modulo utile
contiene una funzione scambia
e il modulo vettore
necessita di utilizzare scambia
, come dovrebbe essere gestita l'inclusione dei file header?
Se il modulo utile
contiene una funzione scambia
e il modulo vettore
necessita di utilizzare scambia
, come dovrebbe essere gestita l'inclusione dei file header?
Quale delle seguenti affermazioni descrive meglio lo scopo del file header di un modulo C dal punto di vista del "cliente" del modulo?
Quale delle seguenti affermazioni descrive meglio lo scopo del file header di un modulo C dal punto di vista del "cliente" del modulo?
Un modulo client include il file header di un altro modulo. Se quest'ultimo modulo viene aggiornato con nuove funzioni o modifiche implementative, quale tra le seguenti azioni non è generalmente necessaria nel modulo client, assumendo che l'interfaccia pubblica (dichiarazioni nell'header file) rimanga compatibile?
Un modulo client include il file header di un altro modulo. Se quest'ultimo modulo viene aggiornato con nuove funzioni o modifiche implementative, quale tra le seguenti azioni non è generalmente necessaria nel modulo client, assumendo che l'interfaccia pubblica (dichiarazioni nell'header file) rimanga compatibile?
Considerando l'implementazione dello stack con array, quale svantaggio principale emerge quando si raggiunge la capacità massima MAXSTACK
?
Considerando l'implementazione dello stack con array, quale svantaggio principale emerge quando si raggiunge la capacità massima MAXSTACK
?
Nella specifica semantica dell'ADT Stack, cosa rappresenta l'elemento 'nil'?
Nella specifica semantica dell'ADT Stack, cosa rappresenta l'elemento 'nil'?
Secondo la specifica semantica dell'operatore push(e, s) → s'
, cosa implica la condizione s = <a1, a2, ..., an>
e s' = <e, a1, a2, ..., an>
?
Secondo la specifica semantica dell'operatore push(e, s) → s'
, cosa implica la condizione s = <a1, a2, ..., an>
e s' = <e, a1, a2, ..., an>
?
Supponendo di avere uno stack s = <5, 8, 2>
, quale sarà il risultato dell'operazione top(s)
?
Supponendo di avere uno stack s = <5, 8, 2>
, quale sarà il risultato dell'operazione top(s)
?
Nell'implementazione di uno stack con array, cosa indica il valore della variabile top
?
Nell'implementazione di uno stack con array, cosa indica il valore della variabile top
?
Considerando uno stack implementato con un array di dimensione MAXSTACK
, in quale momento preciso l'operazione push
fallisce?
Considerando uno stack implementato con un array di dimensione MAXSTACK
, in quale momento preciso l'operazione push
fallisce?
Quale tra le seguenti affermazioni descrive meglio l'utilità dell'header file stack.h
in un'implementazione di stack in C?
Quale tra le seguenti affermazioni descrive meglio l'utilità dell'header file stack.h
in un'implementazione di stack in C?
Se si volesse modificare l'implementazione dello stack per supportare tipi di dati diversi da item
, pur mantenendo l'indipendenza dal tipo, quale approccio sarebbe più appropriato?
Se si volesse modificare l'implementazione dello stack per supportare tipi di dati diversi da item
, pur mantenendo l'indipendenza dal tipo, quale approccio sarebbe più appropriato?
Quale tra le seguenti descrizioni rappresenta meglio il concetto di 'astrazione sui dati'?
Quale tra le seguenti descrizioni rappresenta meglio il concetto di 'astrazione sui dati'?
In che modo il concetto di 'information hiding' contribuisce alla realizzazione di alti livelli di astrazione?
In che modo il concetto di 'information hiding' contribuisce alla realizzazione di alti livelli di astrazione?
Qual è la differenza fondamentale tra 'astrazione' e 'information hiding' nella progettazione di un sistema software?
Qual è la differenza fondamentale tra 'astrazione' e 'information hiding' nella progettazione di un sistema software?
Quale delle seguenti affermazioni descrive meglio la funzione di un'interfaccia di un modulo?
Quale delle seguenti affermazioni descrive meglio la funzione di un'interfaccia di un modulo?
In un modulo software, qual è lo scopo principale della sezione implementativa (body)?
In un modulo software, qual è lo scopo principale della sezione implementativa (body)?
Come si realizza tipicamente il concetto di modulo nel linguaggio di programmazione C, considerando che C non ha un costrutto esplicito per i moduli?
Come si realizza tipicamente il concetto di modulo nel linguaggio di programmazione C, considerando che C non ha un costrutto esplicito per i moduli?
Qual è la funzione principale di un header file (.h) in C quando viene utilizzato per definire l'interfaccia di un modulo?
Qual è la funzione principale di un header file (.h) in C quando viene utilizzato per definire l'interfaccia di un modulo?
Per accedere alle risorse (funzioni, variabili, tipi di dato) esportate da un modulo in C, cosa è necessario fare?
Per accedere alle risorse (funzioni, variabili, tipi di dato) esportate da un modulo in C, cosa è necessario fare?
Nel contesto del codice fornito, quale delle seguenti affermazioni descrive meglio lo scopo della funzione input_punti
?
Nel contesto del codice fornito, quale delle seguenti affermazioni descrive meglio lo scopo della funzione input_punti
?
Considerando la funzione coppie_vicine
, cosa accadrebbe se il ciclo for
interno fosse modificato in for(j=0; j < n; j++)
?
Considerando la funzione coppie_vicine
, cosa accadrebbe se il ciclo for
interno fosse modificato in for(j=0; j < n; j++)
?
Quale delle seguenti modifiche al codice punto.h comprometterebbe la compilazione del file vicini.c senza alterare l'interfaccia pubblica (nomi e parametri delle funzioni)?
Quale delle seguenti modifiche al codice punto.h comprometterebbe la compilazione del file vicini.c senza alterare l'interfaccia pubblica (nomi e parametri delle funzioni)?
Se la funzione creaPunto
non allocasse memoria dinamicamente utilizzando malloc
, quale problema si verificherebbe nel programma principale?
Se la funzione creaPunto
non allocasse memoria dinamicamente utilizzando malloc
, quale problema si verificherebbe nel programma principale?
Supponendo che la funzione distanza
venisse modificata per calcolare il quadrato della distanza invece della distanza effettiva (rimuovendo la sqrt
), come influenzerebbe il risultato finale del programma?
Supponendo che la funzione distanza
venisse modificata per calcolare il quadrato della distanza invece della distanza effettiva (rimuovendo la sqrt
), come influenzerebbe il risultato finale del programma?
Nell'esercizio proposto sull'ADT Vettore, se si utilizzasse un array statico (anziché allocazione dinamica) per implementare il vettore, quale sarebbe la principale limitazione?
Nell'esercizio proposto sull'ADT Vettore, se si utilizzasse un array statico (anziché allocazione dinamica) per implementare il vettore, quale sarebbe la principale limitazione?
Quale delle seguenti modifiche minime al codice renderebbe la funzione coppie_vicine
più efficiente in termini di prestazioni, specialmente per un grande numero di punti?
Quale delle seguenti modifiche minime al codice renderebbe la funzione coppie_vicine
più efficiente in termini di prestazioni, specialmente per un grande numero di punti?
Se si volesse estendere l'ADT punto con una funzione traslaPunto(punto p, float dx, float dy)
che trasla il punto di dx
e dy
, quale sarebbe l'implementazione corretta mantenendo l'incapsulamento?
Se si volesse estendere l'ADT punto con una funzione traslaPunto(punto p, float dx, float dy)
che trasla il punto di dx
e dy
, quale sarebbe l'implementazione corretta mantenendo l'incapsulamento?
In un programma che utilizza l'ADT Vettore, se dopo aver allocato dinamicamente un vettore con malloc
, non si deallocasse la memoria con free
quando il vettore non è più necessario, quale problema si presenterebbe?
In un programma che utilizza l'ADT Vettore, se dopo aver allocato dinamicamente un vettore con malloc
, non si deallocasse la memoria con free
quando il vettore non è più necessario, quale problema si presenterebbe?
Considerando l'importanza dell'astrazione, quale beneficio non è direttamente ottenuto dall'uso di un ADT (Abstract Data Type) ben progettato, come l'ADT punto?
Considerando l'importanza dell'astrazione, quale beneficio non è direttamente ottenuto dall'uso di un ADT (Abstract Data Type) ben progettato, come l'ADT punto?
Quale delle seguenti affermazioni descrive meglio il comportamento della funzione top(stack s)
quando lo stack s
è vuoto?
Quale delle seguenti affermazioni descrive meglio il comportamento della funzione top(stack s)
quando lo stack s
è vuoto?
Considerando l'implementazione dello stack basata su array, cosa succede se si tenta di inserire un elemento in uno stack già pieno?
Considerando l'implementazione dello stack basata su array, cosa succede se si tenta di inserire un elemento in uno stack già pieno?
Nella funzione verifica(char *expr)
, quale condizione implica che l'espressione contiene parentesi sbilanciate?
Nella funzione verifica(char *expr)
, quale condizione implica che l'espressione contiene parentesi sbilanciate?
Cosa rappresenta la funzione corrisp(char a, char b)
?
Cosa rappresenta la funzione corrisp(char a, char b)
?
Se la funzione verifica
riceve in input la stringa (a+b[c-d
, cosa accadrà?
Se la funzione verifica
riceve in input la stringa (a+b[c-d
, cosa accadrà?
Quale è il ruolo della funzione newStack()
?
Quale è il ruolo della funzione newStack()
?
Cosa si intende quando si dice che l'espressione (4 + a) * {[1 – (2/x)] * (8 – a)}
è ben bilanciata?
Cosa si intende quando si dice che l'espressione (4 + a) * {[1 – (2/x)] * (8 – a)}
è ben bilanciata?
Nell'implementazione fornita, qual è la complessità temporale della funzione push
?
Nell'implementazione fornita, qual è la complessità temporale della funzione push
?
Nell'implementazione dell'ADT stack con array, quale modifica sarebbe necessaria per gestire dinamicamente la dimensione massima dello stack ( MAXSTACK
)?
Nell'implementazione dell'ADT stack con array, quale modifica sarebbe necessaria per gestire dinamicamente la dimensione massima dello stack ( MAXSTACK
)?
Perché nella progettazione dell'algoritmo di verifica del bilanciamento delle parentesi si suggerisce di 'estrarre dall’espressione solo le parentesi, cancellando tutto il resto'?
Perché nella progettazione dell'algoritmo di verifica del bilanciamento delle parentesi si suggerisce di 'estrarre dall’espressione solo le parentesi, cancellando tutto il resto'?
Cosa cambierebbe nell'algoritmo di verifica del bilanciamento se si volesse considerare una priorità tra i tipi di parentesi (es. le parentesi tonde devono essere chiuse prima delle quadre)?
Cosa cambierebbe nell'algoritmo di verifica del bilanciamento se si volesse considerare una priorità tra i tipi di parentesi (es. le parentesi tonde devono essere chiuse prima delle quadre)?
Se l'espressione da analizzare contenesse caratteri diversi dalle parentesi (es. lettere, numeri, operatori), quale delle seguenti scelte sarebbe la più efficiente in termini di prestazioni?
Se l'espressione da analizzare contenesse caratteri diversi dalle parentesi (es. lettere, numeri, operatori), quale delle seguenti scelte sarebbe la più efficiente in termini di prestazioni?
Cosa si dovrebbe fare per implementare uno stack che non abbia una dimensione massima fissa?
Cosa si dovrebbe fare per implementare uno stack che non abbia una dimensione massima fissa?
Quale tra queste affermazioni è vera riguardo all'uso di malloc
nella funzione newStack()
?
Quale tra queste affermazioni è vera riguardo all'uso di malloc
nella funzione newStack()
?
Supponendo di voler modificare l'implementazione dello stack per supportare un numero illimitato di elementi, quale sarebbe la principale implicazione in termini di gestione della memoria?
Supponendo di voler modificare l'implementazione dello stack per supportare un numero illimitato di elementi, quale sarebbe la principale implicazione in termini di gestione della memoria?
In un ADT Lista, quale tra le seguenti affermazioni descrive meglio la relazione tra l'operatore tailList(l)
e la lista originale l
dopo l'esecuzione dell'operazione, considerando che l
non sia vuota?
In un ADT Lista, quale tra le seguenti affermazioni descrive meglio la relazione tra l'operatore tailList(l)
e la lista originale l
dopo l'esecuzione dell'operazione, considerando che l
non sia vuota?
Quale delle seguenti affermazioni descrive completamente le implicazioni dell'uso di un tipo item
generico nella specifica dell'ADT Lista?
Quale delle seguenti affermazioni descrive completamente le implicazioni dell'uso di un tipo item
generico nella specifica dell'ADT Lista?
Si consideri una lista concatenata l
implementata secondo l'ADT fornito, contenente $n$ elementi. Qual è la complessità computazionale minima nel caso peggiore per inserire un nuovo elemento in una posizione specifica (diversa dall'inizio) della lista, se non si ha un riferimento diretto al nodo precedente?
Si consideri una lista concatenata l
implementata secondo l'ADT fornito, contenente $n$ elementi. Qual è la complessità computazionale minima nel caso peggiore per inserire un nuovo elemento in una posizione specifica (diversa dall'inizio) della lista, se non si ha un riferimento diretto al nodo precedente?
Considerando l'implementazione di una coda con liste collegate, quale tra le seguenti operazioni richiederebbe una gestione specialmente attenta per evitare race conditions in un ambiente multithreaded?
Considerando l'implementazione di una coda con liste collegate, quale tra le seguenti operazioni richiederebbe una gestione specialmente attenta per evitare race conditions in un ambiente multithreaded?
Nell'implementazione di una lista concatenata, quale tra le seguenti strategie sarebbe più efficace per minimizzare il rischio di memory leak e dangling pointer durante l'eliminazione di un nodo, specialmente in un ambiente senza garbage collection automatica?
Nell'implementazione di una lista concatenata, quale tra le seguenti strategie sarebbe più efficace per minimizzare il rischio di memory leak e dangling pointer durante l'eliminazione di un nodo, specialmente in un ambiente senza garbage collection automatica?
Supponendo di voler implementare una funzione concatList(list l1, list l2)
che concateni due liste immutabili l1
e l2
, creando una nuova lista l3
contenente gli elementi di l1
seguiti da quelli di l2
, quale tra le seguenti implementazioni sarebbe più efficiente in termini di complessità temporale e spaziale, garantendo al contempo che le liste originali l1
e l2
rimangano inalterate (cioè, preservando l'immutabilità)?
Supponendo di voler implementare una funzione concatList(list l1, list l2)
che concateni due liste immutabili l1
e l2
, creando una nuova lista l3
contenente gli elementi di l1
seguiti da quelli di l2
, quale tra le seguenti implementazioni sarebbe più efficiente in termini di complessità temporale e spaziale, garantendo al contempo che le liste originali l1
e l2
rimangano inalterate (cioè, preservando l'immutabilità)?
Data un'implementazione di coda tramite array circolari, quale sequenza di operazioni porterebbe più rapidamente a una situazione in cui la coda risulta piena, ma in realtà presenta ancora spazio disponibile a causa della natura circolare dell'array?
Data un'implementazione di coda tramite array circolari, quale sequenza di operazioni porterebbe più rapidamente a una situazione in cui la coda risulta piena, ma in realtà presenta ancora spazio disponibile a causa della natura circolare dell'array?
In un'implementazione di coda basata su array, quale condizione aggiuntiva deve essere verificata per determinare se la coda è vuota, oltre al semplice confronto tra gli indici head
e tail
?
In un'implementazione di coda basata su array, quale condizione aggiuntiva deve essere verificata per determinare se la coda è vuota, oltre al semplice confronto tra gli indici head
e tail
?
Nell'implementazione dell'ADT Queue con liste concatenate, come si adatterebbe la gestione della memoria se si volesse supportare una politica di "coda persistente", in cui ogni operazione di enqueue
o dequeue
non modifica la coda originale, ma ne crea una nuova versione?
Nell'implementazione dell'ADT Queue con liste concatenate, come si adatterebbe la gestione della memoria se si volesse supportare una politica di "coda persistente", in cui ogni operazione di enqueue
o dequeue
non modifica la coda originale, ma ne crea una nuova versione?
In un sistema real-time in cui si utilizza una coda per gestire task con priorità diverse e stringenti vincoli temporali sull'esecuzione, quale tra le seguenti modifiche all'implementazione standard dell'ADT Queue non sarebbe appropriata?
In un sistema real-time in cui si utilizza una coda per gestire task con priorità diverse e stringenti vincoli temporali sull'esecuzione, quale tra le seguenti modifiche all'implementazione standard dell'ADT Queue non sarebbe appropriata?
Quale delle seguenti affermazioni descrive correttamente la differenza fondamentale tra la visita in preordine e la visita in postordine di un albero binario?
Quale delle seguenti affermazioni descrive correttamente la differenza fondamentale tra la visita in preordine e la visita in postordine di un albero binario?
Nella visita simmetrica (inorder) di un albero binario, quale tra le seguenti è la sequenza corretta di operazioni?
Nella visita simmetrica (inorder) di un albero binario, quale tra le seguenti è la sequenza corretta di operazioni?
Considerando l'implementazione ricorsiva della funzione inputBtree()
, quale condizione determina il caso base della ricorsione, arrestando la costruzione di un ramo dell'albero?
Considerando l'implementazione ricorsiva della funzione inputBtree()
, quale condizione determina il caso base della ricorsione, arrestando la costruzione di un ramo dell'albero?
Durante la costruzione ricorsiva di un albero binario tramite la funzione inputBtree()
, in quale ordine preciso vengono richieste le informazioni all'utente?
Durante la costruzione ricorsiva di un albero binario tramite la funzione inputBtree()
, in quale ordine preciso vengono richieste le informazioni all'utente?
Volendo implementare una funzione iterativa per la visita in preordine di un albero binario, quale struttura dati si rivela fondamentale per mantenere traccia dei nodi da visitare?
Volendo implementare una funzione iterativa per la visita in preordine di un albero binario, quale struttura dati si rivela fondamentale per mantenere traccia dei nodi da visitare?
Considerando che le visite in preordine, inordine e postordine possono essere implementate sia ricorsivamente che iterativamente, quale delle seguenti affermazioni descrive accuratamente una differenza chiave tra i due approcci in termini di gestione della memoria?
Considerando che le visite in preordine, inordine e postordine possono essere implementate sia ricorsivamente che iterativamente, quale delle seguenti affermazioni descrive accuratamente una differenza chiave tra i due approcci in termini di gestione della memoria?
Nel contesto dell'ADT Lista, quale delle seguenti affermazioni cattura l'essenza del concetto di sequenza?
Nel contesto dell'ADT Lista, quale delle seguenti affermazioni cattura l'essenza del concetto di sequenza?
Quale tra le seguenti è una limitazione intrinseca del tipo astratto di dato (ADT) Lista, rispetto ad altre strutture dati come gli alberi o i grafi?
Quale tra le seguenti è una limitazione intrinseca del tipo astratto di dato (ADT) Lista, rispetto ad altre strutture dati come gli alberi o i grafi?
In una lista concatenata, quale tra le seguenti operazioni ha la complessità temporale più alta nel caso peggiore?
In una lista concatenata, quale tra le seguenti operazioni ha la complessità temporale più alta nel caso peggiore?
Si consideri l'inserimento di un nuovo nodo in testa a una lista concatenata. Quale sequenza di operazioni è strettamente necessaria per garantire che la lista rimanga coerente e accessibile?
Si consideri l'inserimento di un nuovo nodo in testa a una lista concatenata. Quale sequenza di operazioni è strettamente necessaria per garantire che la lista rimanga coerente e accessibile?
In una lista concatenata, quale delle seguenti affermazioni descrive correttamente la relazione tra la flessibilità della lista e l'accesso agli elementi?
In una lista concatenata, quale delle seguenti affermazioni descrive correttamente la relazione tra la flessibilità della lista e l'accesso agli elementi?
Se si dovesse progettare una struttura dati che combini la flessibilità delle liste concatenate con la capacità di accesso rapido agli elementi tipica degli array, quale delle seguenti strutture dati ibride sarebbe la più appropriata, considerando l'overhead di spazio e la complessità di implementazione?
Se si dovesse progettare una struttura dati che combini la flessibilità delle liste concatenate con la capacità di accesso rapido agli elementi tipica degli array, quale delle seguenti strutture dati ibride sarebbe la più appropriata, considerando l'overhead di spazio e la complessità di implementazione?
In una lista concatenata che rappresenta una coda, dove gli elementi vengono aggiunti alla fine e rimossi dall'inizio, quale sarebbe l'impatto sull'efficienza dell'operazione di dequeue
se la lista fosse implementata senza un puntatore alla coda (ultimo elemento)?
In una lista concatenata che rappresenta una coda, dove gli elementi vengono aggiunti alla fine e rimossi dall'inizio, quale sarebbe l'impatto sull'efficienza dell'operazione di dequeue
se la lista fosse implementata senza un puntatore alla coda (ultimo elemento)?
Quale delle seguenti affermazioni descrive correttamente la distinzione fondamentale tra la specifica sintattica e la specifica semantica di un tipo di dato astratto?
Quale delle seguenti affermazioni descrive correttamente la distinzione fondamentale tra la specifica sintattica e la specifica semantica di un tipo di dato astratto?
Considerando il tipo di dato astratto 'libro', quale delle seguenti asserzioni rappresenta correttamente una possibile estensione della specifica semantica dell'operatore creaLibro
con una precondizione?
Considerando il tipo di dato astratto 'libro', quale delle seguenti asserzioni rappresenta correttamente una possibile estensione della specifica semantica dell'operatore creaLibro
con una precondizione?
Nell'esempio del tipo di dato astratto 'libro', le postcondizioni degli operatori autore
, titolo
, editore
e anno
sono tutte nella forma Post: lb = (aut, tit, ed, an)
. Quale delle seguenti interpretazioni descrive al meglio il significato di queste postcondizioni?
Nell'esempio del tipo di dato astratto 'libro', le postcondizioni degli operatori autore
, titolo
, editore
e anno
sono tutte nella forma Post: lb = (aut, tit, ed, an)
. Quale delle seguenti interpretazioni descrive al meglio il significato di queste postcondizioni?
Supponiamo di voler aggiungere un operatore modificaAnno(libro, intero)
al tipo di dato astratto 'libro'. Quale delle seguenti coppie precondizione/postcondizione descrive correttamente il comportamento di un operatore che modifica l'anno di pubblicazione solo se l'anno fornito è valido (positivo)?
Supponiamo di voler aggiungere un operatore modificaAnno(libro, intero)
al tipo di dato astratto 'libro'. Quale delle seguenti coppie precondizione/postcondizione descrive correttamente il comportamento di un operatore che modifica l'anno di pubblicazione solo se l'anno fornito è valido (positivo)?
Nel contesto della realizzazione di un tipo di dato astratto, quale dei seguenti aspetti è primariamente gestito dai meccanismi di programmazione modulare?
Nel contesto della realizzazione di un tipo di dato astratto, quale dei seguenti aspetti è primariamente gestito dai meccanismi di programmazione modulare?
Considerando l'astrazione del tipo di dato 'libro', se volessimo aggiungere un operatore confrontaLibri(libro lb1, libro lb2)
che restituisce un valore booleano indicando se due libri sono uguali (stesso autore, titolo, editore e anno), quale sarebbe la specifica semantica più completa per questo operatore?
Considerando l'astrazione del tipo di dato 'libro', se volessimo aggiungere un operatore confrontaLibri(libro lb1, libro lb2)
che restituisce un valore booleano indicando se due libri sono uguali (stesso autore, titolo, editore e anno), quale sarebbe la specifica semantica più completa per questo operatore?
Supponiamo di avere una realizzazione del tipo di dato astratto 'libro' in cui l'anno è rappresentato come una stringa anziché un intero. Quale impatto avrebbe questo cambiamento principalmente sulla specifica del tipo di dato?
Supponiamo di avere una realizzazione del tipo di dato astratto 'libro' in cui l'anno è rappresentato come una stringa anziché un intero. Quale impatto avrebbe questo cambiamento principalmente sulla specifica del tipo di dato?
In termini di information hiding nella realizzazione del tipo di dato astratto 'libro', quale delle seguenti scelte progettuali supporta meglio questo principio?
In termini di information hiding nella realizzazione del tipo di dato astratto 'libro', quale delle seguenti scelte progettuali supporta meglio questo principio?
Se la precondizione di un operatore in un tipo di dato astratto non è soddisfatta al momento della chiamata, quale fra le seguenti è la conseguenza più appropriata in termini di progettazione e robustezza del software?
Se la precondizione di un operatore in un tipo di dato astratto non è soddisfatta al momento della chiamata, quale fra le seguenti è la conseguenza più appropriata in termini di progettazione e robustezza del software?
Nell'ambito della manutenzione e dell'evoluzione di un tipo di dato astratto, quale tra le seguenti modifiche sarebbe meno problematica per i client che utilizzano il tipo di dato, assumendo che le specifiche sintattiche e semantiche degli operatori rimangano invariate?
Nell'ambito della manutenzione e dell'evoluzione di un tipo di dato astratto, quale tra le seguenti modifiche sarebbe meno problematica per i client che utilizzano il tipo di dato, assumendo che le specifiche sintattiche e semantiche degli operatori rimangano invariate?
Nell'implementazione dinamica dello stack (senza dimensione massima fissa), cosa accadrebbe se la funzione realloc
in push
restituisse NULL
?
Nell'implementazione dinamica dello stack (senza dimensione massima fissa), cosa accadrebbe se la funzione realloc
in push
restituisse NULL
?
Nell'implementazione dello stack basata su array dinamico, perché è necessario utilizzare realloc
anziché malloc
per aumentare la dimensione dell'array?
Nell'implementazione dello stack basata su array dinamico, perché è necessario utilizzare realloc
anziché malloc
per aumentare la dimensione dell'array?
In una implementazione di stack basata su array dinamico, se si verificasse un errore durante la realloc
nella funzione push
, quale sarebbe la migliore strategia per la gestione della memoria al fine di prevenire memory leaks?
In una implementazione di stack basata su array dinamico, se si verificasse un errore durante la realloc
nella funzione push
, quale sarebbe la migliore strategia per la gestione della memoria al fine di prevenire memory leaks?
Nell'implementazione dello stack con lista concatenata, quale operazione deve essere eseguita prima di modificare s->top
nella funzione pop
per evitare memory leaks?
Nell'implementazione dello stack con lista concatenata, quale operazione deve essere eseguita prima di modificare s->top
nella funzione pop
per evitare memory leaks?
In una implementazione di stack basata su lista concatenata, quale sarebbe l'effetto più probabile di non decrementare il campo numel
nella funzione pop
dopo aver rimosso un elemento?
In una implementazione di stack basata su lista concatenata, quale sarebbe l'effetto più probabile di non decrementare il campo numel
nella funzione pop
dopo aver rimosso un elemento?
Considerando l'implementazione dello stack basata su liste collegate, cosa accadrebbe se nella funzione push
la riga nuovo->next = s->top;
venisse omessa?
Considerando l'implementazione dello stack basata su liste collegate, cosa accadrebbe se nella funzione push
la riga nuovo->next = s->top;
venisse omessa?
Nel contesto dell'implementazione dello stack con lista concatenata, quale è il principale svantaggio in termini di overhead di memoria rispetto all'implementazione con array dinamico?
Nel contesto dell'implementazione dello stack con lista concatenata, quale è il principale svantaggio in termini di overhead di memoria rispetto all'implementazione con array dinamico?
Se si volesse implementare una funzione clearStack(stack s)
per l'implementazione dello stack basata su lista concatenata, quale sarebbe l'implementazione più corretta per evitare memory leaks?
Se si volesse implementare una funzione clearStack(stack s)
per l'implementazione dello stack basata su lista concatenata, quale sarebbe l'implementazione più corretta per evitare memory leaks?
Nell'implementazione dello stack basata sul modulo lista, cosa cambierebbe fondamentalmente nel comportamento dello stack se si decidesse di utilizzare una lista coda (con puntatori sia alla testa che alla coda) invece di una lista semplice?
Nell'implementazione dello stack basata sul modulo lista, cosa cambierebbe fondamentalmente nel comportamento dello stack se si decidesse di utilizzare una lista coda (con puntatori sia alla testa che alla coda) invece di una lista semplice?
Considerando l'implementazione dello stack basata sull'uso del modulo lista fornito, e supponendo di voler aggiungere una funzione sizeStack(stack s)
che restituisca il numero di elementi nello stack, quale delle seguenti affermazioni è più accurata riguardo alla sua implementazione e complessità?
Considerando l'implementazione dello stack basata sull'uso del modulo lista fornito, e supponendo di voler aggiungere una funzione sizeStack(stack s)
che restituisca il numero di elementi nello stack, quale delle seguenti affermazioni è più accurata riguardo alla sua implementazione e complessità?
Flashcards
GRAFO
GRAFO
Struttura dati che include LISTE e ALBERI.
ALBERO (struttura dati)
ALBERO (struttura dati)
Struttura informativa per rappresentare partizioni, gerarchie e processi decisionali.
Radice (albero)
Radice (albero)
Un nodo senza archi entranti in un albero.
Foglia (albero)
Foglia (albero)
Signup and view all the flashcards
Cammino (in un albero)
Cammino (in un albero)
Signup and view all the flashcards
Grado di un nodo
Grado di un nodo
Signup and view all the flashcards
Livello di un nodo
Livello di un nodo
Signup and view all the flashcards
Cos'è 'sali' in un heap?
Cos'è 'sali' in un heap?
Signup and view all the flashcards
Cosa fa la funzione insert
?
Cosa fa la funzione insert
?
Signup and view all the flashcards
Altezza dell'albero
Altezza dell'albero
Signup and view all the flashcards
Albero Binario
Albero Binario
Signup and view all the flashcards
Cos'è un grafo orientato?
Cos'è un grafo orientato?
Signup and view all the flashcards
Cosa sono i nodi (N)?
Cosa sono i nodi (N)?
Signup and view all the flashcards
Cosa sono gli archi (A)?
Cosa sono gli archi (A)?
Signup and view all the flashcards
Cos'è un Grafo?
Cos'è un Grafo?
Signup and view all the flashcards
Cos'è 'scendi' in un heap?
Cos'è 'scendi' in un heap?
Signup and view all the flashcards
Progettazione
Progettazione
Signup and view all the flashcards
Modularizzazione
Modularizzazione
Signup and view all the flashcards
Modulo
Modulo
Signup and view all the flashcards
Astrazione
Astrazione
Signup and view all the flashcards
Astrazione funzionale
Astrazione funzionale
Signup and view all the flashcards
Riferimento dell'ultimo nodo
Riferimento dell'ultimo nodo
Signup and view all the flashcards
Lista concatenata
Lista concatenata
Signup and view all the flashcards
Accesso sequenziale
Accesso sequenziale
Signup and view all the flashcards
Inserimento in testa (lista)
Inserimento in testa (lista)
Signup and view all the flashcards
Creazione nuovo nodo L
Creazione nuovo nodo L
Signup and view all the flashcards
Collegamento al record iniziale
Collegamento al record iniziale
Signup and view all the flashcards
Tempo di accesso array
Tempo di accesso array
Signup and view all the flashcards
Tempo di accesso lista concatenata
Tempo di accesso lista concatenata
Signup and view all the flashcards
Vantaggio di memoria liste
Vantaggio di memoria liste
Signup and view all the flashcards
newStack(void)
newStack(void)
Signup and view all the flashcards
emptyStack(stack s)
emptyStack(stack s)
Signup and view all the flashcards
pop(stack s)
pop(stack s)
Signup and view all the flashcards
push(item val, stack s)
push(item val, stack s)
Signup and view all the flashcards
top(stack s)
top(stack s)
Signup and view all the flashcards
MAXSTACK
MAXSTACK
Signup and view all the flashcards
Parentesi bilanciate
Parentesi bilanciate
Signup and view all the flashcards
corrisp(char a, char b)
corrisp(char a, char b)
Signup and view all the flashcards
verifica(char *expr)
verifica(char *expr)
Signup and view all the flashcards
Stack senza dimensione max
Stack senza dimensione max
Signup and view all the flashcards
newBtree(void)
newBtree(void)
Signup and view all the flashcards
emptyBtree(Btree T)
emptyBtree(Btree T)
Signup and view all the flashcards
getRoot(Btree T)
getRoot(Btree T)
Signup and view all the flashcards
consBtree(item val, Btree sx, Btree dx)
consBtree(item val, Btree sx, Btree dx)
Signup and view all the flashcards
figlioSX(Btree T)
figlioSX(Btree T)
Signup and view all the flashcards
figlioDX(Btree T)
figlioDX(Btree T)
Signup and view all the flashcards
Visita di un albero
Visita di un albero
Signup and view all the flashcards
newList(void)
newList(void)
Signup and view all the flashcards
emptyList(list l)
emptyList(list l)
Signup and view all the flashcards
tailList(list l)
tailList(list l)
Signup and view all the flashcards
consList(item val, list l)
consList(item val, list l)
Signup and view all the flashcards
getFirst(list l)
getFirst(list l)
Signup and view all the flashcards
sizeList(list l)
sizeList(list l)
Signup and view all the flashcards
posItem(list l, item val)
posItem(list l, item val)
Signup and view all the flashcards
searchItem(list l, item e)
searchItem(list l, item e)
Signup and view all the flashcards
removeItem(list l, item e)
removeItem(list l, item e)
Signup and view all the flashcards
STARTSIZE
STARTSIZE
Signup and view all the flashcards
ADDSIZE
ADDSIZE
Signup and view all the flashcards
emptyList(l)
emptyList(l)
Signup and view all the flashcards
getFirst(l)
getFirst(l)
Signup and view all the flashcards
tailList(l)
tailList(l)
Signup and view all the flashcards
posItem(l, val)
posItem(l, val)
Signup and view all the flashcards
posItem (vers.Ricorsiva)
posItem (vers.Ricorsiva)
Signup and view all the flashcards
getItem(l, pos)
getItem(l, pos)
Signup and view all the flashcards
reverseList(l)
reverseList(l)
Signup and view all the flashcards
newList()
newList()
Signup and view all the flashcards
consList(val, l)
consList(val, l)
Signup and view all the flashcards
outputList(l)
outputList(l)
Signup and view all the flashcards
Cos'è una Coda (Queue)?
Cos'è una Coda (Queue)?
Signup and view all the flashcards
Cos'è queue
(typedef)?
Cos'è queue
(typedef)?
Signup and view all the flashcards
Cosa fa newQueue()
?
Cosa fa newQueue()
?
Signup and view all the flashcards
Cosa fa emptyQueue(queue q)
?
Cosa fa emptyQueue(queue q)
?
Signup and view all the flashcards
Cosa fa dequeue(queue q)
?
Cosa fa dequeue(queue q)
?
Signup and view all the flashcards
Cosa fa enqueue(item val, queue q)
?
Cosa fa enqueue(item val, queue q)
?
Signup and view all the flashcards
Valore di ritorno di enqueue
?
Valore di ritorno di enqueue
?
Signup and view all the flashcards
Coda con lista concatenata
Coda con lista concatenata
Signup and view all the flashcards
Coda con array
Coda con array
Signup and view all the flashcards
Operatore %
in coda array
Operatore %
in coda array
Signup and view all the flashcards
posItem (iterativa)
posItem (iterativa)
Signup and view all the flashcards
posItem (ricorsiva)
posItem (ricorsiva)
Signup and view all the flashcards
reverseList
reverseList
Signup and view all the flashcards
outputList
outputList
Signup and view all the flashcards
Cos'è uno Stack (Pila)?
Cos'è uno Stack (Pila)?
Signup and view all the flashcards
Cos'è 'stack' (tipo)?
Cos'è 'stack' (tipo)?
Signup and view all the flashcards
newStack()
newStack()
Signup and view all the flashcards
push(item, stack)
push(item, stack)
Signup and view all the flashcards
Stack con array
Stack con array
Signup and view all the flashcards
Ordinamento di un array
Ordinamento di un array
Signup and view all the flashcards
Astrazione sui dati
Astrazione sui dati
Signup and view all the flashcards
Astrazione sul controllo
Astrazione sul controllo
Signup and view all the flashcards
Information Hiding
Information Hiding
Signup and view all the flashcards
Information hiding
Information hiding
Signup and view all the flashcards
Interfaccia (di un modulo)
Interfaccia (di un modulo)
Signup and view all the flashcards
Cos'è 'a' nel main?
Cos'è 'a' nel main?
Signup and view all the flashcards
Cosa fa input_punti
?
Cosa fa input_punti
?
Signup and view all the flashcards
Cosa fa coppie_vicine
?
Cosa fa coppie_vicine
?
Signup and view all the flashcards
Cosa fa creaPunto
?
Cosa fa creaPunto
?
Signup and view all the flashcards
Cosa fa distanza(p1, p2)
?
Cosa fa distanza(p1, p2)
?
Signup and view all the flashcards
Cos'è punto
?
Cos'è punto
?
Signup and view all the flashcards
Cos'è typedef struct pto *punto
?
Cos'è typedef struct pto *punto
?
Signup and view all the flashcards
Cosa fa CreaVettore?
Cosa fa CreaVettore?
Signup and view all the flashcards
Cosa fa LeggiVettore?
Cosa fa LeggiVettore?
Signup and view all the flashcards
Cosa fa ScriviVettore?
Cosa fa ScriviVettore?
Signup and view all the flashcards
Cos'è un modulo?
Cos'è un modulo?
Signup and view all the flashcards
Cosa fa #include
?
Cosa fa #include
?
Signup and view all the flashcards
Cos'è un header file?
Cos'è un header file?
Signup and view all the flashcards
Cos'è 'information hiding'?
Cos'è 'information hiding'?
Signup and view all the flashcards
Cosa sono i commenti?
Cosa sono i commenti?
Signup and view all the flashcards
Cosa fa scambia(int *x, int *y)
?
Cosa fa scambia(int *x, int *y)
?
Signup and view all the flashcards
Cos'è un modulo client?
Cos'è un modulo client?
Signup and view all the flashcards
Cos'è una 'dichiarazione locale static'?
Cos'è una 'dichiarazione locale static'?
Signup and view all the flashcards
item
item
Signup and view all the flashcards
Valore di ritorno di push/pop
Valore di ritorno di push/pop
Signup and view all the flashcards
Bilanciamento parentesi
Bilanciamento parentesi
Signup and view all the flashcards
top (stack)
top (stack)
Signup and view all the flashcards
Semplificazione espressione
Semplificazione espressione
Signup and view all the flashcards
Lista vuota
Lista vuota
Signup and view all the flashcards
Lista (ADT)
Lista (ADT)
Signup and view all the flashcards
consList(item, list)
consList(item, list)
Signup and view all the flashcards
Riferimento ultimo nodo
Riferimento ultimo nodo
Signup and view all the flashcards
Accesso elemento lista
Accesso elemento lista
Signup and view all the flashcards
Visita in pre-ordine
Visita in pre-ordine
Signup and view all the flashcards
Visita in post-ordine
Visita in post-ordine
Signup and view all the flashcards
Visita simmetrica (in-ordine)
Visita simmetrica (in-ordine)
Signup and view all the flashcards
inputBtree()
inputBtree()
Signup and view all the flashcards
Caso base inputBtree()
Caso base inputBtree()
Signup and view all the flashcards
Funzione consBtree()
Funzione consBtree()
Signup and view all the flashcards
Lista (tipo astratto)
Lista (tipo astratto)
Signup and view all the flashcards
Il tipo astratto Lista
Il tipo astratto Lista
Signup and view all the flashcards
Cosa fa enqueue(item e, queue q)
?
Cosa fa enqueue(item e, queue q)
?
Signup and view all the flashcards
STARTSIZE (stack)
STARTSIZE (stack)
Signup and view all the flashcards
ADDSIZE (stack)
ADDSIZE (stack)
Signup and view all the flashcards
struct c_stack
struct c_stack
Signup and view all the flashcards
newStack() (array)
newStack() (array)
Signup and view all the flashcards
push(item val, stack s) (array)
push(item val, stack s) (array)
Signup and view all the flashcards
realloc(s->vet, ...)
realloc(s->vet, ...)
Signup and view all the flashcards
pop(stack s) (array)
pop(stack s) (array)
Signup and view all the flashcards
top(stack s) (array)
top(stack s) (array)
Signup and view all the flashcards
newStack() (lista)
newStack() (lista)
Signup and view all the flashcards
Specifica (astrazione dati)
Specifica (astrazione dati)
Signup and view all the flashcards
Realizzazione (astrazione dati)
Realizzazione (astrazione dati)
Signup and view all the flashcards
Specifica sintattica
Specifica sintattica
Signup and view all the flashcards
Specifica semantica
Specifica semantica
Signup and view all the flashcards
Precondizione
Precondizione
Signup and view all the flashcards
Postcondizione
Postcondizione
Signup and view all the flashcards
Tipo di dato astratto libro
Tipo di dato astratto libro
Signup and view all the flashcards
creaLibro(stringa, stringa, stringa, intero) -> libro
creaLibro(stringa, stringa, stringa, intero) -> libro
Signup and view all the flashcards
autore(libro) -> stringa
autore(libro) -> stringa
Signup and view all the flashcards
Effetto Postcondizioni invarianti
Effetto Postcondizioni invarianti
Signup and view all the flashcards
Study Notes
Ottimo lavoro con gli appunti di studio! Ecco le modifiche e le aggiunte basate sul un nuovo testo fornito:
Operazioni: deleteNode()
(Implementazione in C)
- La funzione
deleteNode()
rimuove un nodo specificatoitem elem
da un albero binario di ricercaBST T
, l'implementazione è ricorsiva. - Gestisce diversi casi: nodo foglia, nodo con un solo figlio o nodo con entrambi i figli.
- L'implementazione comporta la ricerca e la sostituzione con il successore in ordine (elemento più piccolo nel sottoalbero destro) o il predecessore in ordine (elemento più grande nel sottoalbero sinistro).
- Se il nodo da eliminare è vuoto, la funzione restituisce la radice senza modifiche.
- Se la chiave da eliminare è minore della radice, si prosegue a sinistra, altrimenti, se è maggiore, si prosegue a destra.
- Se la chiave corrisponde alla radice, ci sono tre casi: il successore in ordine prende il posto della radice.
- Se il nodo ha un figlio destro \Sinistro allora diventa suo erede
Header File BST.h
(Struttura e Prototipi)
- Definisce la struttura di base per un albero binario di ricerca.
- Include
typedef struct node *BST
. - Include prototipi per funzioni cruciali come creazione, controllo dello stato vuoto, accesso ai figli e operazioni di inserimento/cancellazione.
- Le funzioni lavorano su un tipo
BST
(puntatore a nodo).
Realizzazione del modulo BST (file BST.c
)
- La funzione
newBST
crea un nuovo albero BST vuoto, restituisceNULL
. - Funzione
emptyBST
che controlla se un albero BST è vuoto, restituisceT == NULL
. - La funzione ricorsiva
contains
verifica la presenza di un elemento, controllando seT == NULL
, se coincide con la radice, o se è minore/maggiore, spostandosi nel sottoalbero appropriato. - Le funzioni
insert
edeleteNode
sono dichiarate ma la loro implementazione è presentata in seguito. - Le funzioni
getItem
esetItem
permettono rispettivamente di ottenere e impostare il valore di un nodo.
Realizzazione di insert()
e creaFoglia()
(Implementazione in C)
- La funzione
insert
utilizzacreaFoglia
se l'albero è vuoto, creando un nuovo nodo foglia con l'elemento. - Altrimenti, ricorsivamente inserisce il nodo a destra o a sinistra del nodo attuale in base a se il nodo \ elemento è "minore o maggiore".
- La funzione
creaFoglia
alloca la memoria per il nuovo nodo foglia, imposta l'elemento, e inizializza i puntatori sinistro e destro aNULL
.
Realizzazione di deleteNode()
(Implementazione in C)
- Se il nodo da eliminare è vuoto, la funzione restituisce la radice senza modifiche.
- Se la chiave da eliminare è minore della radice, si prosegue a sinistra.
- Altrimenti, se è maggiore, si prosegue a destra.
- Se la chiave corrisponde alla radice, ci sono tre casi: il successore in ordine prende il posto della radice.
- Se il nodo ha un figlio destro, allora diventa suo erede.
- Se il nodo ha entrambi i sottoalberi, si ricerca l'elemento massimo nel sottoalbero sinistro o l'elemento minimo nel sottoalbero destro.
Alberi perfettamente bilanciati e alberi A bilanciati
- Le operazioni sull'albero di ricerca binaria hanno complessità logaritmica se l'albero è bilanciato.
- In un albero bilanciato tutti i nodi interni hanno entrambi i sottoalberi e le foglie sono a livello massimo.
- Se l'albero ha n nodi l'altezza dell'albero è log2 n
- Un albero di ricerca binaria si dice A bilanciato se per ogni nodo accade che la differenza (in valore assoluto) tra le altezze dei suoi due sottoalberi è minore o uguale a Δ.
- L'altezza dell'albero bilanciato secondo Δ è △ + log2 n.
Alberi AVL
- Se il bilanciamento Δ = 1 si parla di alberi AVL
- Prendono il nome dei loro ideatori: Adel'son, Vel'skii e Landis
- Per ogni nodo è necessario aggiungere un "indicatore" che può essere -1, 0 o +1
- L'indicatore -1, se l'altezza del sottoalbero sinistro è maggiore (di 1) dell'altezza del sottoalbero destro
- L'indicatore è 0, se l'altezza del sottoalbero sinistro è uguale all'altezza del sottoalbero destro.
- L'indicatore è +1, se l'altezza del sottoalbero sinistro è minore (di 1) dell'altezza del sottoalbero destro.
Ribilanciamento di alberi AVL
- Un inserimento di una foglia può provocare uno sbilanciamento dell'albero.
- In tal caso bisogna ribilanciare l'albero con operazioni di rotazione (semplice o doppia) agendo sul nodo x a profondità massima che presenta un non bilanciamento.
- Tale nodo viene detto nodo critico e si trova sul percorso che va dalla radice al nodo foglia inserito.
- La rotazione può essere semplice o doppia
- Considerazioni simili si possono fare anche per la rimozione di un nodo .
Struttura dati: Albero binario (ADT)
- Operatori: figlioSX, figlioDX e consBtree.
- Albero binario in se' : puntatore a Nodo ( che e la Root=radice)
Algoritmi di visita
- void inOrder() visita sotto SX -> getItem( raiz) - sotto DX -> get item radice
- Le visite di binari (sia in pre-ordine, post-ordine o simmetrica) consistono nel seguire una rotta di viaggio che ne consenta l'esame di ogni nodo una sola volta.
- Visita in pre-ordine: l'analisi della radice dell'albero e, poi, la visita, effettuata con lo stesso metodo, dei due sottoalberi, prima il sinistro, poi il destro
- Visita in post-ordine: richiede dapprima la visita, effettuata con lo stesso metodo, dei sottoalberi, prima il sinistro e poi il destro, e, in seguito, l'analisi della radice dell'albero
- Visita simmetrica: richiede prima la visita del sottoalbero sinistro (effettuata sempre con lo stesso metodo), poi l'analisi della radice, e poi la visita del sottoalbero destro
Realizzazione di code a priorità tramite heap
- Il codice seguente viene considerate solo le chiavi( key), senza il valore di esse associato cioè numerici
- Inclusa la Funzione void scendi (PQueue q)
- Static void sali( PQueue q)
Code a priorita rappresentato da array
- La struct include Pqueue q, Q == NULL
- restituisce valore 0 solo in caso fallisca la richiesta ( insert o deleteMax)
- le altre restituiscono 1 . In Caso positivo
Rimozione code
- Se l'albero a un entita , nessun problema
- Se è una solo"" a dx - prende solo il valore
- Se""e a Sin - Prende solo il valore di Sin
- Se possiede anche un dx < Prende il valore + Max" Alternativamente prende elemento MINIMO in sottoAll destro"
Alberi binari (Realizzazione)
- L'insieme di operatori così definiti costituisce minino di un albero E frequente "arricchhire il tipo B con altri operatori"
Alberi (Realizzazione)
- Gli alberi Binaria sono realizzati tramite "STRUTURA A Punt"
- Pointer Sx
- Poiunter DX
- Etichetta < usa sempre Item>
Algorietmo binaria ( file : Btree)
la visuta a un abero B consiste nel segure una "Rotta di Viaggio" (albero visitato solo 1 volta)
ADT ALbero Binario : Realizazione
- Realizzazione ADT e' nel file bst con file bst .h" Realizzazione ADT albero e tipo - e " punt" ad etichetta
- Strut node
- Int val; Struct pointer_ Sinistro Struct POiter _Dist
< B tree""Punt <<<<N"""""" "" "" "" """
Code implement ad avec file C
//// File item h e implementa la struttura typedef int , e include i parametri //Q perche non abbiamo code in C //PQUeue Code Restituire valore zero “” Solo a CASO FAILS a, altrimenti 1 <<
Liste concatenate>> e "implementabile"" tramite HEEPP"" come da ""Traccia"" e.
*Pile *Implementazione <>
Struct NODE node" ”””””” Item vaue
-
struct*Node right"" - File “H Implementatz”
-
- B TREE *” Pointer b tre” L"ADT <Code prioritaria”“e realt in modo ( simple)Item *” “”Val””””” key “”
<“”PQueue Code “”>
- L-ADT restituire “”Val =""0 (Zero) solo nel""CASO Falli ”””Altrim . 1"",1;
“”
- Static “”sali “” e “”S""Code” """( pointer QCode<<
“”Queue“” " implement à ad con //// <> “”VET T massim "" ""dimens (SIZE CodeQ ="", pointer Q” ////"Strut (Size of struct ) Pointer To Head ""code Q" Implement Item“”" Restit Q""
C Implementi A C Code * FILE *
- Restituire () Q head pointer -> Q HEAD """ <> A Strut Item VET
"""" Head
“”Int Queue”""" L""ADT (Code prioritaria""e realt in modo (simple)Item *” “”Val””””” key
""""<P”" + Q ""Code
Con ""Qhead""""<> <>“”Q"" restit <>"" if non ""verificat""""
Pointer to queue code implements Head “”“” int Queue implement a pointer ""val""""<> if != NULL Pointer “””” + ""Implement""
File Item per ""tipoGenerco ""definisce un oggetto ""valuechiave/Key""""
Punt - > head <>Non implemente""""
e con ""Q_head""""
""Realiizazione delle ADTree in Lenguage C
- Q"" restituisce "", l '' operatoere
Lista strutt""Pointer Code”""" <> Head " “Val
""Val=Val”""" *Strada per Item """Val”""""
Altrimenti=""0"
Code implement implement and code () e” ""C* File *
- Struttura" Item* Vett “”Massim Q”” ""Size"" Pointer to head (numElem) <> //Pointer strut“”
- L-ADT <“><Code prioritaria”“e realt in modo (simple)Item *” “”Val””””” key Altrimenti
""<“”PQueue Code”
<> restit Q""""Head Q "" //""Se Q_head """
Code implement
Studying That Suits You
Use AI to generate personalized quizzes and flashcards to suit your learning preferences.