Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Algoritmi L31 PEGASO, Prove d'esame di Algoritmi E Strutture Di Dati

Algoritmi risposte PEGASO L31 SCIENZE INFORMATICHE

Tipologia: Prove d'esame

2022/2023

In vendita dal 15/02/2023

Nikki263
Nikki263 🇮🇹

4.5

(859)

1.2K documenti

1 / 1

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Capitolo ID 1: Introduzione agli algoritmi
Cos'è un problema:
qualcosa che siamo chiamati a risolvere
Cos'è una istanza:
un particolare input ad un problema
Cos'è un algoritmo:
una sequenza di istruzioni che istruiscono sull'esecuzione di un determinato compito
Chi è l'esecutore dell'algoritmo:
chi esegue l'algoritmo e conosce il linguaggio con il quale è stato scritto
La seguente frase è "ambigua":
il numero è grande
La pragmatica indica:
lo studio del miglior modo per esprimere un concetto
Il determinismo indica:
stesso risultato indipendentemente dall'esecutore
Nella selezione:
esiste una condizione da valutare e due possibili gruppi di istruzioni da eseguire
L'assegnazione:
modifica il valore di una variabile
Qualunque algoritmo può essere implementato usando le sole seguenti strutture:
sequenza, ciclo e selezione
Nella tesi di Church-Turing:
tutti i linguaggi sufficientemente espressivi sono ugualmente espressivi
La sequenza delle operazioni è rappresentata da:
frecce
Un comando di output:
valuta un'espressione e poi visualizza il risultato sullo schermo
Un comando di input:
legge un input ed immagazzina tale valore in una variabile
Nella selezione, in funzione del valore della condizione, si sceglie un blocco oppure l'altro:
sempre
Nell'assegnazione:
si modifica il valore di una variabile
While {condizione} do {corpo} end while:
indica una iterazione
Fun(arg1, arg2 ...):
indica una funzione
Il seguente pseudocodice (a, b) < - (b,a):
indica uno scambio del valore delle variabili
Il seguente pseudocodice arr[{espr}]:
indica un valore specifico all'interno dell'array
Nella ricerca sequenziale di un elemento in un array di n elementi:
la complessità è proporzionale ad n
Nella ricerca sequenziale di un elemento in un array di n elementi:
l'ordinamento non ha un impatto sulla complessità della ricerca sequenziale
Nella ricerca binaria:
l'array deve essere ordinato
Nella ricerca binaria:
la complessità è logaritmica
Nella ricerca binaria:
l'algoritmo è ricorsivo
Nella ricerca binaria, la procedura ricorsiva:
lavora su sottoinsiemi dell'array
Nell'analisi di un algorimo è importante considerare correttezza, completezza e:
complessità
Un algoritmo è corretto quando:
restituisce sempre una risposta corretta
Fornire la complessità dell'algoritmo corretto:
significa dare almeno un tetto alla complessità del problema risolto dall'algoritmo
Se l'algoritmo trovato non è il migliore per risolvere quel problema:
non avremo risposto alla domanda qual è la complessità del mio problema
Il dato di ingresso soddisfa una certa proprietà:
È un tipo di problema decisionale
Un problema di ottimizzazione:
cerca una soluzione a costo minimo
Stabilire se un grafo è connesso:
È un problema decisionale
Nella programmazione dinamica:
la soluzione viene costruita a partire da un insieme di sotto-problemi potenzialmente ripetuti
Prova a fare qualcosa, se non funziona disfala e prova a farne un'altra:
È tipico del Backtrack
L'approccio bottom-up è tipico di:
programmazione dinamica
La scelta migliore nell'immediata è tipica di:
tecnica greedy
Combina:
È una fase del divide et impera
La ricorsione:
È tipica del divide et impera
Nella torre di Hanoi con 4 dischi il numero di mosse necessarie è:
15
Una delle seguenti non è una operazione elementare:
iterazione
La complessità asintotica:
stima quanto aumenta il tempo di calcolo al crescere della dimensione n dell'input
La notazione Theta rappresenta:
un limite stretto
La notazione asintotica O:
vale per ogni n maggiore o uguale ad un certo valore n con 0
Una funzione polinomiale è:
O(n^2)
Una funzione polinomiale è:
Ω(n^2)
La notazione asintotica Omega:
vale per ogni n maggiore o uguale ad un certo valore n con 0
Nel logaritmo, O(n) ed Ω(n):
non coincidono
Se una funzione è sia O(g(n)) che Ω(g(n):
allora è θ(g(n))
La notazione asintotica Theta ammette che esistano 2 costanti c1 e c2:
per ogni n maggiore o uguale ad un certo valore n con 0
La notazione asintotica O:
rappresenta un limite inferiore asintotico
Il limite superiore di una espressione polinomiale è:
di ordine n^k
Il limite inferiore di una espressione polinomiale è:
di ordine n^k
Se il limite per n tendente all'infinito di f(n)/g(n) è 0:
f(n) è O grande di g(n)
Se il limite per n tendente all'infinito di f(n)/g(n) è infinito:
f(n) è Omega grande di g(n)
Se il limite per n tendente all'infinito di f(n)/g(n) è un numero finito:
f(n) è Theta grande di g(n)
La seguente non è una proprietà dei limiti asintotici:
Sottrattiva
La 'o' piccola implica la 'O' grande:
sempre
O(n·log n) è detta:
complessità pseudolineare
Quale tra le seguenti ha una complessità maggiore al crescere di n:
esponenziale
Nei diagrammi di flusso, il simbolo del rombo è usato per:
selezione
Nella selezione sono possibili:
vero e falso
Nell'iterazione sono possibili esclusivamente:
mentre, fai, per
Nella ripetizione "mentre" è solo possibile specificare:
la condizione
Nella ripetizione "per" è solo possibile specificare come "direzione":
incremento e decremento
In Flowgorithm la ripetizione è identificata da una forma:
di un esagono
Il seguente non è un numero sconnesso:
5757
Un numero è definito come sconnesso se per ogni sua cifra:
la cifra adiacente a destra e a sinistra dista al massimo 1
Il seguente è un numero sconnesso:
34543
Il seguente è un numero sconnesso:
345434543
Il seguente è un numero sconnesso:
121
Il seguente è un numero sconnesso:
101
Replit è un:
SaaS
Gli ambienti di Replit sono chiamati:
workspace
Quale dei seguenti non è un token in Pseudocode:
initialize
Quale dei seguenti non è un token in Pseudocode:
sum
Quale dei seguenti non è un token in Pseudocode:
customtype
In Pseudocode una funzione:
deve restituire un valore
In Pseudocode un array:
può ammettere integer
In Pseudocode le iterazioni ammesse sono:
for e while
In Pseudocode il for necessità:
il next
In Pseudocode il while necessità:
l'endwhile
Un caso medio è:
determinato dalla somma dei tempi d'esecuzione di tutte le istanze dei dati di ingresso, con ogni addendo moltiplicato per la probabilità di occorrenza della relativa istanza dei dati di ingresso
In una sequenza di istruzioni, la complessità è:
O grande del massimo delle funzioni relative a ciascuna sequenza
Nel fattoriale non ricorsivo:
la complessità è O(n)
In Fibonacci non ricorsivo per n = 3:
la complessità è O(n)
In Fibonacci non ricorsivo per n = 2:
la complessità è O(1)
Nel calcolo del massimo non ricorsivo:
la complessità è O(n)
Nel calcolo del massimo non ricorsivo, il caso peggiore ha complessità:
la complessità è O(n)
Nel calcolo del massimo non ricorsivo, il caso migliore ha complessità:
la complessità è O(n)
Nel calcolo del massimo non ricorsivo, avere il massimo in prima posizione:
non comporta vantaggi alla complessità
Nel calcolo del massimo non ricorsivo, avere il massimo in ultima posizione:
non comporta vantaggi alla complessità
Una equazione di ricorrenza esprime il tempo di esecuzione totale di un problema di dimensione n:
in funzione del tempo di esecuzione per input più piccoli
La ricorrenza che si ottiene nel divide et impera è nella forma:
aT (n/b) + D(n) + C(n)
Nel mergesort, T(n):
È logaritmico
Nel divide et impera, D(n) è usato per indicare:
il tempo per dividere il problema in sotto-problemi
Nel divide et impera, C(n) è usato per indicare:
il tempo per combinare i sotto-problemi
Nel metodo di sostituzione:
ipotizziamo un limite e poi usiamo l'induzione matematica per dimostrare che la nostra ipotesi è corretta
L'ipotesi che si ottiene tramite un albero di ricorsione:
può essere usata nel metodo di sostituzione
Consideriamo T(n)=9T(n/3)+n:
T(n)=θ(n^2)
Nel teorema dell'esperto si confronta f(n) con:
n^(logb(a))
Nel teorema dell'esperto si hanno il seguenti numero di casi di analisi:
3
Le strutture nell'ambito della programmazione possono essere definite ad un livello astratto:
come insiemi di elementi dotati di opportune operazioni
Un array è un:
contenitore statico ed omogeneo di valori, variabili o oggetti
Un array è detto statico perché:
i suoi elementi non variano di numero a tempo d'esecuzione
Un array è detto omogeneo perché:
i suoi elementi sono tutti dello stesso tipo
L'operazione di lettura o modifica del valore di un elemento di un array ha complessità asintotica:
O(1)
Gli elementi di un array sono memorizzati:
consecutivamente
In un array, il problema della visita:
significa attraversare tutti i suoi elementi esattamente una volta
Il Python:
non supporta nativamente gli array
Una Python List ammette:
dati non omogenei
Le prestazioni di un array in C++ rispetto ad una analoga Python list:
sono migliori
In C/C++ vi sono a disposizione del programmatore, i seguenti pools di memoria:
static, stack, heap
Tipo di memoria che persiste per l'intera esecuzione del programma ed è utilizzata tipicamente per memorizzare variabili globali:
static
L'heap è gestito:
manualmente dal programmatore
L'allocazione dello stack:
È gestita dal compilatore
Uno dei problemi dello stack è:
memory shortage
L'operatore & nei puntatori è usato:
per ottenere l'indirizzo di un oggetto
L'operatore * nei puntatori è usato:
per accedere all'oggetto riferito
Gli operatori new e delete in C++ sono usati per:
gestire l'allocazione dinamica e la deallocazione degli oggetti
La dichiarazione di un puntatore comporta:
allocazione di memoria per una variabile puntatore, ma non per la variabile puntata
La dichiarazione di un array comporta:
allocazione di memoria non solo per una variabile puntatore, ma anche per l'area puntata
Un array è statico:
sempre
Un array è omogeneo:
sempre
L'algoritmo di visita di un array è:
lineare
L'algoritmo di ricerca lineare in un array è:
lineare
L'algoritmo di ricerca binaria in un array è:
applicabile solo se l'array è ordinato
Il costo di un algoritmo di ricerca binaria è:
lineare
Il costo di un algoritmo di ricerca lineare in C++ e Python è:
identico
Il costo di un algoritmo di ricerca binaria in C++ e Python è:
identico
Un algoritmo di ricerca binaria:
si può implementare in modalità ricorsiva ed iterativa
Gli Unit Tesrs in Python:
non impattano sulla complessità dell'algoritmo
L'ordinamento di una sequenza di informazioni consiste nel disporre:
le stesse informazioni in modo da rispettare una qualche relazione d'ordine di tipo lineare
Un algoritmo di ordinamento è stabile se:
non altera l'ordine relativo di elementi dell'array aventi la stessa chiave
Un algoritmo di ordinamento opera in place se:
la dimensione delle strutture ausiliarie di cui necessita è indipendente dal numero di elementi dell'array da ordinare
Gli algoritmi di Ordinamento Interno:
fanno uso di strutture dati allocate in memoria centrale dell'elaboratore
Gli Algoritmi Semplici di Ordinamento presentano una complessità:
quadratica
Heap sort:
È molto efficiente
Merge sort:
È stabile ma non in place
Insertion sort:
È quadratico
Selection sort:
È quadratico
Bubble sort:
È quadratico
In selection Sort la complessità nel caso migliore è:
quadratica
In selection Sort la complessità ne caso medio è:
quadratica
In selection Sort la complessità ne caso peggiore è:
quadratica
Selection Sort è in generale:
instabile
Selection Sort è in place:
no
Selection Sort nel caso peggiore:
È come Quick Sort
Selection Sort nel caso peggiore:
È come Quick Sort
Selection Sort nel caso medio:
È come Bubble Sort
Selection Sort non è stabile perché:
altera gli elementi chiave
Selection Sort è in place perché:
non introduce strutture dati ausiliarie che dipendono dalla grandezza dell'array
In Insertion Sort la complessità nel caso migliore è:
lineare
In Insertion Sort la complessità nel caso medio è:
quadratica
In Insertion Sort la complessità nel caso peggiore è:
quadratica
Insertion Sort è in generale:
stabile
Insertion Sort è in place:
si
Insertion Sort nel caso peggiore:
È come Quick Sort
Insertion Sort nel caso peggiore:
È come Quick Sort
Insertion Sort nel caso medio:
È come Bubble Sort
Insertion Sort è stabile perché:
non altera gli elementi chiave
Insertion Sort è in place perché:
non introduce strutture dati ausiliarie che dipendono dalla grandezza dell'array
In Bubble Sort la complessità nel caso migliore è:
lineare
In Bubble Sort la complessità nel caso medio è:
quadratica
In Bubble Sort la complessità nel caso peggiore è:
quadratica
Bubble Sort è in generale:
stabile
Bubble Sort è in place:
si
Bubble Sort nel caso peggiore:
È come Quick Sort
Bubble Sort nel caso peggiore:
È come Quick Sort
Bubble Sort nel caso medio:
È come Selectio Sort
Bubble Sort è stabile perché:
non altera gli elementi chiave
Bubble Sort è in place perché:
non introduce strutture dati ausiliarie che dipendono dalla grandezza dell'array
In Merge Sort la complessità nel caso migliore è:
logaritmica
In Merge Sort la complessità nel caso medio è:
logaritmica
In Merge Sort la complessità nel caso peggiore è:
logaritmica
Merge Sort è in generale:
stabile
Merge Sort è in place:
no
Merge Sort nel caso peggiore:
È come Heap Sort
Merge Sort nel caso peggiore:
È come Heap Sort
Merge Sort nel caso medio:
È come Quick Sort
Merge Sort è stabile perché:
non altera gli elementi chiave
Merge Sort è in place perché:
introduce strutture dati ausiliarie che dipendono dalla grandezza dell'array
In Quick Sort la complessità nel caso migliore è:
logaritmica
In Quick Sort la complessità nel caso medio è:
logaritmica
In Quick Sort la complessità nel caso peggiore è:
quadratica
Quick Sort è in generale:
instabile
Quick Sort è in place:
si
Quick Sort nel caso peggiore:
È come Selection Sort
Quick Sort nel caso peggiore:
È come Bubble Sort
Quick Sort nel caso medio:
È come Merge Sort
Quick Sort non è stabile perché:
altera gli elementi chiave
Quick Sort è in place perché:
non introduce strutture dati ausiliarie che dipendono dalla grandezza dell'array
In un albero completo:
tutte le foglie hanno la stessa profondità e tutti i nodi interni hanno grado 2
In un albero quasi completo:
tutti i livelli, tranne al più l'ultimo, sono completi
Il grado di un albero indica:
il numero di figli di uno specifico nodo
In un albero heap, left(i) è pari a:
2i
Nel max-heap:
ogni elemento è minore o uguale al nodo padre
Nell'heap sort:
si può usare sia il max-heap che il min-heap
Nella prima fase dell'heap sort, l'algoritmo permuta i valori contenuti negli elementi dell'array in modo tale che:
la nuova disposizione delle chiavi costituisca uno heap
In un albero heap, right(i) è pari a:
2i+1
Nell'heap sort, le operazioni parent, left e right possono essere calcolate:
mediante una sola operazione
Nel min-heap:
il più piccolo elemento è nella radice
In Heap Sort la complessità nel caso migliore è:
logaritmica
In Heap Sort la complessità nel caso medio è:
logaritmica
In Heap Sort la complessità nel caso peggiore è:
logaritmica
Heap Sort è in generale:
instabile
Heap Sort è in place:
si
Heap Sort nel caso peggiore:
È come Merge Sort
Heap Sort nel caso peggiore:
È come Merge Sort
Heap Sort nel caso medio:
È come Merge Sort
Heap Sort non è stabile perché:
altera gli elementi chiave
Heap Sort è in place perché:
non introduce strutture dati ausiliarie che dipendono dalla grandezza dell'array
Una struttura dati:
fornisce una rappresentazione organizzata e logica dei dati all'interno di un insieme
Una struttura dinamica è una struttura che è pensata:
per aggiungere o togliere elementi durante l'esecuzione di un algoritmo
Se non si possono cioè fare ipotesi sulla posizione fisica degli elementi in memoria si dice che la struttura è:
sparsa
Un array è una struttura:
lineare
Le tipiche operazioni su un insieme dinamico sono:
query e modifica
Una struttura dati concreta:
È l'implementazione di una struttura astratta
Una chiave consente:
di identificare univocamente i dati in una struttura
Nelle strutture dati dinamiche i puntatori:
sono obsoleti
In Python, tutte le variabili:
sono puntatori impliciti
In Python, quando si assegna un valore a una variabile:
si sta creando un riferimento all'oggetto in memoria
Rispetto alla tassonomia classica, una lista risulta:
dinamica, sparsa, ordinata
Nelle liste, il puntatore:
È usato per l'implementazione
Gli elementi di una lista:
non sono necessariamente memorizzati in modo consecutivo
Una lista è un multi-insieme, cioè:
ci possono essere ripetizioni del medesimo elemento
Dati una lista e un valore, stabilire se il valore è contenuto in un elemento della lista, riportando in caso affermativo l'indirizzo di tale elemento:
È il problema della ricerca
Una lista dinamica può essere rappresentata tramite:
puntatori
La ricerca di un elemento in una lista:
È un problema di visita
Malloc() in C ha come analoga in C++:
new
Free() in C ha come analoga in C++:
delete
Se non si libera la memoria allocata dinamicamente:
si rischia un memory leak
Una struttura dati:
fornisce una rappresentazione organizzata e logica dei dati all'interno di un insieme
Una struttura dinamica è una struttura che è pensata:
per aggiungere o togliere elementi durante l'esecuzione di un algoritmo
Se non si possono cioè fare ipotesi sulla posizione fisica degli elementi in memoria si dice che la struttura è:
sparsa
Un array è una struttura:
lineare
Le tipiche operazioni su un insieme dinamico sono:
query e modifica
Una struttura dati concreta:
È l'implementazione di una struttura astratta
Una chiave consente:
di identificare univocamente i dati in una struttura
Nelle strutture dati dinamiche i puntatori:
sono obsoleti
In Python, tutte le variabili:
sono puntatori impliciti
In Python, quando si assegna un valore a una variabile:
si sta creando un riferimento all'oggetto in memoria
Rispetto alla tassonomia classica, una lista risulta:
dinamica, sparsa, ordinata
Nelle liste, il puntatore:
È usato per l'implementazione
Gli elementi di una lista:
non sono necessariamente memorizzati in modo consecutivo
Una lista è un multi-insieme, cioè:
ci possono essere ripetizioni del medesimo elemento
Dati una lista e un valore, stabilire se il valore è contenuto in un elemento della lista, riportando in caso affermativo l'indirizzo di tale elemento:
È il problema della ricerca
Una lista dinamica può essere rappresentata tramite:
puntatori
La ricerca di un elemento in una lista:
È un problema di visita
Malloc() in C ha come analoga in C++:
new
Free() in C ha come analoga in C++:
delete
Se non si libera la memoria allocata dinamicamente:
si rischia un memory leak