07: Array, Liste, Hash
50 Questions
1 Views

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Qual è il costo per accedere a un elemento in un array?

  • O(1) (correct)
  • O(N)
  • O(M)
  • O(log N)

L'inserimento di un elemento in un array statico ha un costo lineare.

False (B)

Qual è il costo per rimuovere un elemento da un array?

O(N)

Un array in cui il numero massimo di elementi è fissato è chiamato array ____.

<p>statico</p> Signup and view all the answers

Abbina le operazioni agli aspetti dei costi:

<p>Accesso a un elemento = O(1) Inserimento di un elemento = O(1) Rimozione di un elemento = O(N)</p> Signup and view all the answers

Cosa significa la notazione O(1) nel contesto degli array?

<p>Il costo è costante, indipendentemente dal numero di elementi. (C)</p> Signup and view all the answers

In un array statico, gli elementi vengono sempre inseriti nelle prime N celle.

<p>True (A)</p> Signup and view all the answers

Nel caso di un inserimento di un elemento, se A.N è uguale a A.M, l'operazione restituisce ____.

<p>nil</p> Signup and view all the answers

Qual è il costo di un inserimento se M è sufficientemente grande e si sfora poche volte?

<p>O(1) (D)</p> Signup and view all the answers

Se N è uguale a M, i successivi inserimenti richiedono riallocazioni.

<p>True (A)</p> Signup and view all the answers

Cosa si fa quando l'array è pieno durante un inserimento?

<p>Raddoppiare la dimensione potenziale dell'array</p> Signup and view all the answers

Quando il numero di elementi si riduce ad ______ della dimensione, dimezziamo la dimensione dell'array.

<p>1/4</p> Signup and view all the answers

Qual è la principale differenza tra la prima e la seconda idea per l'implementazione di un ADT?

<p>Costo ammortizzato (D)</p> Signup and view all the answers

La cancellazione di un elemento comporta sempre una riallocazione dell’array.

<p>False (B)</p> Signup and view all the answers

Abbina le seguenti operazioni con la loro descrizione:

<p>DynArrayInsert2 = Gestisce gli inserimenti nell'array dinamico ArrayInsert = Inserisce un elemento in una posizione specifica DynArrayDelete2 = Gestisce le cancellazioni nell'array dinamico ArrayDelete = Rimuove un elemento da una posizione specifica</p> Signup and view all the answers

Il costo totale di una serie di operazioni può essere rappresentato come ______.

<p>T1 + T2 + ...</p> Signup and view all the answers

Qual è la complessità temporale per svolgere una ricerca in un array non ordinato?

<p>O(N) (C)</p> Signup and view all the answers

L'inserimento di un elemento in un array ordinato è sempre O(1).

<p>False (B)</p> Signup and view all the answers

Qual è l'algoritmo utilizzato per inserire un elemento mantenendo un array ordinato?

<p>ArrayInsertOrd</p> Signup and view all the answers

Espandere un array richiede un costo di _____ perché è necessario allocare memoria e copiare gli elementi.

<p>O(N)</p> Signup and view all the answers

Abbina le operazioni agli array con la loro complessità:

<p>Ricerca in array non ordinato = O(N) Inserimento in array ordinato = O(N) Cancellazione in array non ordinato = O(N) Espansione di un array = O(N)</p> Signup and view all the answers

Quale delle seguenti affermazioni è vera riguardo all'algoritmo ArrayExtend?

<p>Richiede O(N) per allocare memoria e copiare gli elementi (B)</p> Signup and view all the answers

Qual è il tempo di inserimento di un elemento nella tabella hash utilizzando concatenamento?

<p>O(1) (A)</p> Signup and view all the answers

La complessità per la cancellazione in un array è O(1).

<p>False (B)</p> Signup and view all the answers

Qual è la complessità per cercare il massimo in un array ordinato?

<p>O(1)</p> Signup and view all the answers

Nel caso peggiore, la ricerca in una lista con indice hash può richiedere Θ(N).

<p>True (A)</p> Signup and view all the answers

Qual è il costo della cancellazione di un elemento in una lista hash?

<p>O(1)</p> Signup and view all the answers

Il valore hash di una chiave si calcola in tempo __________.

<p>costante</p> Signup and view all the answers

Qual è il fattore di carico α nella definizione della tabella hash?

<p>N/m (C)</p> Signup and view all the answers

La funzione hash deve sempre distribuire uniformemente le chiavi fra le celle.

<p>True (A)</p> Signup and view all the answers

Abbina le seguenti operazioni con i loro tempi di esecuzione:

<p>HashInsert = O(1) HashSearch = Θ(N) nel caso peggiore HashDelete = O(1) HashSearch nel caso migliore = O(1)</p> Signup and view all the answers

Quando la lista T[h(k)] è vuota oppure contiene solo un elemento, la ricerca costa __________.

<p>O(1)</p> Signup and view all the answers

Qual è la complessità ammortizzata di un inserimento utilizzando la prima idea con n inserimenti?

<p>O(n) (B)</p> Signup and view all the answers

La complessità ammortizzata di un inserimento può essere O(1) utilizzando la seconda idea.

<p>True (A)</p> Signup and view all the answers

Quale è il costo totale (in senso ammortizzato) della rimozione degli elementi con la seconda idea considerando DELETE che rimuove l'ultimo elemento?

<p>O(1)</p> Signup and view all the answers

La complessità ammortizzata di K inserimenti semplici utilizzando la seconda idea è __________.

<p>O(1)</p> Signup and view all the answers

Abbina il tipo di operazione al suo costo ammortizzato:

<p>Inserimento con la prima idea = O(n) Inserimento con la seconda idea = O(1) Rimozione dell'ultimo elemento con la seconda idea = O(1) Rimozione di un elemento qualunque da una lista = O(n)</p> Signup and view all the answers

Qual è il valore di N se si effettuano 2K inserimenti?

<p>2K (D)</p> Signup and view all the answers

Espandere l'array di un numero costante di elementi comporta una complessità ammortizzata di O(n).

<p>False (B)</p> Signup and view all the answers

Riporta il nome della struttura dati in cui l'ordine degli elementi è determinato dai puntatori.

<p>Lista</p> Signup and view all the answers

Qual è il costo medio per percorrere una lista in una tabella hash, secondo la descrizione data?

<p>Θ(1 + α) (C)</p> Signup and view all the answers

Il tempo medio richiesto per trovare un elemento in una tabella hash è sempre costante.

<p>False (B)</p> Signup and view all the answers

Cosa rappresenta α nella descrizione della tabella hash?

<p>Il numero medio di elementi nella lista.</p> Signup and view all the answers

Il tempo richiesto per cercare un elemento scelto a caso in una tabella hash è proporzionale a _____.

<p>N/m</p> Signup and view all the answers

Abbina i seguenti termini ai loro significati:

<p>N = Numero totale di elementi nella tabella i = Posizione di un elemento nella lista m = Numero di chiavi uniche α = Numero medio di elementi nella lista</p> Signup and view all the answers

Qual è l'effetto dell'uniformità semplice nella risoluzione delle collisioni nelle tabelle hash?

<p>Riduce il tempo medio di ricerca (A)</p> Signup and view all the answers

L'inserimento in testa nella lista significa che gli elementi più recenti sono sempre in cima.

<p>True (A)</p> Signup and view all the answers

Qual è la formula per il tempo medio di ricerca di un elemento nella lista?

<p>Θ(1 + α)</p> Signup and view all the answers

Per trovare l'elemento _____, si deve esaminare anche gli elementi che sono stati inseriti dopo di esso.

<p>xi</p> Signup and view all the answers

In media, quanti elementi precedono l'elemento xi nella lista?

<p>N/m (C)</p> Signup and view all the answers

Flashcards

Complessità Ammortizzata

La complessità ammortizzata di un'operazione è il costo medio di un'operazione in una sequenza di operazioni.

Inserimento Ammortizzato in Array Dinamico (Raddoppiamento)

Il costo ammortizzato di un inserimento in un array dinamico che raddoppia la sua dimensione quando è pieno è O(1).

Inserimento Ammortizzato in Array Dinamico (Espansione Costante)

Il costo ammortizzato di un inserimento in un array dinamico che espande la sua dimensione di una costante è O(n).

Lista

Una lista è una struttura dati lineare in cui l'ordine degli elementi è determinato dai puntatori che indicano l'elemento successivo. Il primo elemento di una lista è indicato da un puntatore chiamato "head".

Signup and view all the flashcards

Inserimento/Cancellazione in Testa di Lista

In una lista, l'operazione di inserimento e di cancellazione di un elemento alla testa della lista ha una complessità temporale O(1).

Signup and view all the flashcards

Inserimento/Cancellazione in Posizione Specifica di Lista

In una lista, l'operazione di inserimento o di cancellazione di un elemento in una posizione qualsiasi della lista ha una complessità temporale O(n), dove n è la posizione dell'elemento.

Signup and view all the flashcards

Complessità di Liste

Le liste sono efficienti per l'inserimento e la cancellazione, ma meno efficienti per l'accesso ad elementi specifici rispetto agli array.

Signup and view all the flashcards

Applicazioni delle Liste

Le liste sono usate per rappresentare dati che cambiano dinamicamente, come ad esempio un elenco di persone in una coda.

Signup and view all the flashcards

Uniformità semplice

La probabilità che un qualsiasi elemento venga inserito in una specifica lista è 1 m (uniformità semplice).

Signup and view all the flashcards

Tempo di ricerca medio

Il tempo medio per cercare un dato elemento in una tabella hash con liste di collisione. Rappresenta la complessità del caso medio.

Signup and view all the flashcards

α (lunghezza media della lista)

La lunghezza media di una lista in una tabella hash.

Signup and view all the flashcards

Tempo per trovare la lista

Il tempo richiesto per trovare una specifica lista in una tabella hash. Questo è costante, indipendentemente dalla dimensione della tabella.

Signup and view all the flashcards

Numero di elementi precedenti xi nella lista

Il numero di elementi che precedono un dato elemento xi nella stessa lista, dopo che xi è stato inserito.

Signup and view all the flashcards

Tempo per ricercare gli elementi nella lista

Il tempo necessario per controllare gli elementi presenti nella lista in cui si trova l'elemento cercato, oltre all'elemento stesso.

Signup and view all the flashcards

Tempo totale di ricerca

Il tempo totale richiesto per cercare un elemento in una tabella hash con liste di collisione.

Signup and view all the flashcards

Tempo medio di una ricerca

Il tempo medio necessario per ricercare un elemento in una tabella hash in cui le collisioni vengono risolte tramite liste.

Signup and view all the flashcards

Tempo per ricercare xi a parte il calcolo dell'hash

Il tempo medio per trovare un elemento in una tabella hash con liste di collisione, escluse l'operazione di hashing.

Signup and view all the flashcards

Complessità media di ricerca

La complessità media di una ricerca in una tabella hash con liste di collisione.

Signup and view all the flashcards

Universo delle chiavi (U)

Rappresenta l'insieme di tutte le possibili chiavi che possono essere inserite nella tabella hash. Ad esempio, se stiamo memorizzando numeri di matricola a 6 cifre, l'universo delle chiavi sarebbe composto da tutti i possibili numeri di matricola a 6 cifre.

Signup and view all the flashcards

Insieme delle chiavi (S)

Rappresenta l'insieme di tutte le chiavi effettivamente inserite nella tabella hash.

Signup and view all the flashcards

Funzione hash (h(k))

Funzione che trasforma una chiave in un indice della tabella hash. L'indice calcolato dalla funzione hash indica la cella in cui la chiave verrà memorizzata.

Signup and view all the flashcards

Caso peggiore per la ricerca in una tabella hash

Il caso peggiore per la ricerca in una tabella hash si verifica quando tutte le chiavi vengono mappate nella stessa cella della tabella. In questo caso, la ricerca diventa come una ricerca lineare in una lista, quindi il costo è proporzionale al numero di elementi nella tabella.

Signup and view all the flashcards

Caso migliore per la ricerca in una tabella hash

Il caso migliore per la ricerca in una tabella hash si verifica quando la cella corrispondente alla chiave cercata è vuota o contiene un solo elemento. In questo caso, la ricerca è molto efficiente e richiede solo un accesso alla cella della tabella.

Signup and view all the flashcards

Caso medio per la ricerca in una tabella hash

Il caso medio per la ricerca in una tabella hash dipende dalla funzione hash. Se la funzione hash è uniforme, ogni cella della tabella riceve circa lo stesso numero di chiavi, quindi la ricerca richiede mediamente un tempo proporzionale al fattore di carico.

Signup and view all the flashcards

Fattore di carico (α)

Il fattore di carico è il rapporto tra il numero di elementi nella tabella hash (N) e il numero di celle nella tabella (m). Un fattore di carico alto indica che la tabella è piena e potrebbe causare un aumento dei tempi di ricerca.

Signup and view all the flashcards

Array

Un array è come una sequenza di caselle in memoria, ognuna delle quali può contenere un valore. Le caselle hanno tutte la stessa dimensione e sono disposte in modo sequenziale. L'accesso a una determinata casella è molto rapido e richiede un tempo costante, indipendentemente dalla posizione della casella.

Signup and view all the flashcards

Array statico

Un array statico è un tipo di array in cui la dimensione massima è fissa e non può essere modificata durante l'esecuzione del programma. Ciò significa che il numero massimo di elementi che possono essere memorizzati nell'array è definito al momento della creazione dell'array stesso.

Signup and view all the flashcards

N e M in un array statico

In un array statico, N rappresenta il numero attuale di elementi memorizzati all'interno dell'array. M rappresenta la dimensione massima dell'array, ovvero il numero massimo di elementi che l'array può contenere.

Signup and view all the flashcards

Inserimento in un array statico

L'operazione di inserimento di un nuovo elemento in un array statico consiste nell'aggiungere l'elemento all'ultima posizione disponibile dell'array, incrementando il numero di elementi memorizzati. Se l'array è pieno, non è possibile inserire nuovi elementi.

Signup and view all the flashcards

Rimozione da un array statico

L'operazione di rimozione di un elemento da un array statico implica la ricerca dell'elemento da rimuovere e la sua eliminazione dall'array. Gli elementi successivi vengono spostati in avanti per riempire il vuoto lasciato dall'elemento rimosso.

Signup and view all the flashcards

Costo dell'inserimento in un array statico

Il costo dell'inserimento in un array statico è costante, ovvero O(1), in quanto richiede un'operazione di accesso e scrittura in una posizione specifica dell'array. Il costo non dipende dal numero di elementi o dalla dimensione dell'array.

Signup and view all the flashcards

Costo della rimozione in un array statico

Il costo della rimozione da un array statico è lineare, ovvero O(N), in quanto richiede un ciclo per scorrere l'array e spostare gli elementi successivi per riempire il vuoto lasciato dall'elemento rimosso. Il costo dipende dal numero di elementi presenti nell'array.

Signup and view all the flashcards

Rimozione di un elemento non presente

Se l'array statico è vuoto o se non ci sono elementi uguali a quello da eliminare all'interno dell'array, l'operazione ArrayDelete restituirà nil (null).

Signup and view all the flashcards

Inserimento in un array dinamico con M >> N

Nell'inserimento in un array dinamico, se la dimensione massima dell'array (M) è molto più grande del numero di elementi (N), il costo di un inserimento è generalmente costante (O(1)). La complessità è costante poiché c'è abbastanza spazio disponibile per l'inserimento, quindi non è necessario riallocare l'array.

Signup and view all the flashcards

Inserimento in un array dinamico con M = N

Nell'inserimento in un array dinamico, se la dimensione massima dell'array (M) è uguale al numero di elementi (N), il costo di ogni inserimento successivo richiederà una riallocazione dell'array, con una complessità di O(N).

Signup and view all the flashcards

Dipendenza della complessità dall'array dinamico

La dimensione massima (M) e le operazioni eseguite influenzano la complessità del tempo per le operazioni in un array dinamico.

Signup and view all the flashcards

Raddoppiare la dimensione dell'array dinamico

Una strategia per gestire la crescita di un array dinamico è quella di raddoppiare la dimensione dell'array quando è pieno. Questo approccio prevede un investimento in spazio, ma porta a un guadagno futuro in tempo. Quando l'array è pieno, viene raddoppiata la dimensione massima (M) e viene allocato nuovo spazio per gli elementi aggiuntivi.

Signup and view all the flashcards

Dimezzare la dimensione dell'array dinamico

Quando il numero di elementi in un array dinamico si riduce ad un quarto della dimensione massima (M), la dimensione dell'array viene dimezzata. Questa strategia consente di recuperare spazio sprecato, riducendo la dimensione dell'array e il consumo di memoria.

Signup and view all the flashcards

Confronto tra le due idee per gli array dinamici

La prima idea di gestione della crescita di un array dinamico prevede una dimensione massima fissa (M) e riallocazioni ogni volta che si inserisce un nuovo elemento. La seconda idea prevede di raddoppiare la dimensione dell'array quando è pieno e di dimezzarla quando il numero di elementi scende a 1/4 della dimensione massima. La scelta tra le due idee dipende dalle esigenze specifiche dell'applicazione: la prima idea è più semplice da implementare, ma può portare a riallocazioni frequenti, mentre la seconda idea è più efficiente nello spazio a lungo termine, ma più complessa da implementare.

Signup and view all the flashcards

Confronto tra due idee per una sequenza di inserimenti

In una sequenza di 2K inserimenti in un array dinamico, dove la dimensione massima (M) è inizialmente 1, la prima idea (dimensione fissa) comporta un costo di O(N) per ogni inserimento tranne il primo. La seconda idea (raddoppio e dimezzamento) comporta un costo di O(N) per K inserimenti e un costo di O(1) per gli altri. La complessità ammortizzata della seconda idea è quindi inferiore, in quanto il costo medio per inserimento è inferiore.

Signup and view all the flashcards

Ricerca in un array

L'algoritmo ArraySearch(A, k) cerca un elemento specifico k in un array A. Controlla ogni elemento dell'array uno alla volta. Se trova l'elemento k, restituisce il valore trovato. Altrimenti, restituisce nil, indicando che l'elemento non è presente nell'array.

Signup and view all the flashcards

Complessità lineare - O(N)

La complessità di un algoritmo misura il tempo necessario per eseguire l'algoritmo in funzione della dimensione dell'input. Una complessità lineare indica che il tempo di esecuzione cresce proporzionalmente alla dimensione dell'input. Quindi, se l'input raddoppia, anche il tempo di esecuzione raddoppia.

Signup and view all the flashcards

Inserimento in un array ordinato

Quando si inserisce un elemento in un array ordinato, è necessario mantenere l'ordinamento. Il tempo necessario per spostare gli elementi per fare spazio al nuovo elemento può essere proporzionale al numero di elementi già presenti nell'array. Quindi, l'inserimento in un array ordinato ha una complessità lineare O(N).

Signup and view all the flashcards

Estensione di un array

L'algoritmo ArrayExtend(A, n) crea un nuovo array B più grande dell'array originale A. La dimensione di B è aumentata di n elementi. Tutti gli elementi di A vengono copiati in B. L'operazione ArrayExtend ha una complessità lineare O(N) perché la copia degli elementi richiede un tempo proporzionale al numero di elementi in A.

Signup and view all the flashcards

Array dinamico

Un array dinamico è un array che può cambiare dimensione durante l'esecuzione del programma. Ciò è possibile perché invece di allocare memoria per il numero massimo di elementi possibili in anticipo, si alloca memoria per un determinato numero di elementi e si espande l'array quando necessario. Questa strategia è utile quando non si conosce in anticipo il numero di elementi che dovranno essere memorizzati nell'array.

Signup and view all the flashcards

Inserimento in un array dinamico (prima strategia)

La prima strategia per l'inserimento in un array dinamico prevede l'espansione dell'array di una cella ogni volta che viene aggiunto un nuovo elemento. Se l'array è pieno, viene esteso di una cella con una complessità lineare O(N). Se invece l'array non è pieno, l'inserimento ha una complessità costante O(1).

Signup and view all the flashcards

Costo a lungo termine degli inserimenti in un array dinamico

Il costo a lungo termine degli inserimenti in un array dinamico con la prima strategia dipende dal numero di volte in cui l'array è stato espanso. Ogni espansione di un array ha una complessità lineare O(N), il che può portare a prestazioni lente se l'array viene espanso frequentemente. Per evitare ciò, si potrebbero adottare altre strategie, come ad esempio raddoppiare la dimensione dell'array quando è pieno, invece di espanderlo di una sola cella.

Signup and view all the flashcards

Algoritmo DynArrayInsert1

L'algoritmo DynArrayInsert1(A, k) inserisce un elemento k in un array dinamico A. Se l'array A è pieno, viene esteso di una cella con l'algoritmo ArrayExtend. Quindi, l'elemento k viene inserito nell'array A con l'algoritmo ArrayInsert.

Signup and view all the flashcards

Study Notes

Array, Liste e Tabelle Hash

  • Obiettivi: Capire come la scelta delle strutture dati per rappresentare insiemi dinamici influenzi il tempo di accesso ai dati. Argomenti: array (statici e ridimensionabili), liste, hash, costo ammortizzato.

Insiemi Dinamici (Dizionari)

  • Strutture: Rappresentano insiemi dinamici con un numero finito di elementi, modificabili e con numero variabile di elementi.
  • Attributi: Ogni elemento ha una chiave univoca.
  • Tipi di Operazioni: Interrogazione (query) e modifiche (insert, search, delete). Operazioni specifiche se le chiavi sono ordinate (minimum, maximum, successor, predecessor)

Array

  • Struttura: Sequenza di caselle con dimensione fissa (statico) o ridimensionabile. Le caselle hanno dimensioni e posizioni fisse nella memoria.
  • Adozione Iniziale (Indirizzo base): L'indirizzo del primo elemento è costante.
  • Accesso: L'accesso ad un elemento specifico avviene in tempo costante (O(1)), perché l'indirizzo dell'elemento è calcolabile direttamente.
  • Inserimento (ARRAYINSERT): Se l'array non è pieno, l'inserimento ha costo costante (O(1)). Altrimenti, se l'array è pieno, l'inserimento richiede prima di ridimensionare l'array (O(N)).
  • Cancellazione (ARRAYDELETE): Ha una complessità di O(N), poiché richiede di spostare gli elementi successivi per occupare la posizione cancellata.
  • Ricerca (ARRAYSEARCH): Ha complessità O(N), perché si deve scorrere linearmente l'array.

Array Ridimensionabili

  • Necessità: Per gestire casi in cui il numero di elementi non è noto in anticipo.
  • Espansione: L'array viene espanso quando è pieno (operazione O(N)), il che implica copiare tutti gli elementi nell'array nuovo.
  • Approcci: Due approcci sono presentati per l'array ridimensionabile. Il primo richiede un nuovo array (ed espande e copia) ogni volta che si raggiunge la capacità massima. Il secondo approccio (più efficiente) raddoppia la dimensione dell'array quando è pieno e dimezza quando è meno di ¼ pieno.

Liste

  • Struttura: Struttura dati lineare dove l'ordine degli elementi è determinato da puntatori (che indicano l'elemento successivo).
  • Operazioni: Ricerca (O(N)), Inserimento in testa (O(1)), Rimozione di un elemento (O(1)).
  • Concatenamento Doppio: Liste che memorizzano sia il puntatore al successivo elemento che al precedente elemento.

Hashing

  • Tabelle Hash: Strutture dati che consentono operazioni di inserimento, ricerca e cancellazione con un tempo medio costante (O(1)).
  • Funzione Hash: Mappa le chiavi nell'universo delle chiavi a posizioni di un array (tabella hash). Una buona funzione hash distribuisce le chiavi uniformemente nella tabella hash riducendo il numero di collisioni.
  • Collisioni: Quando due o più chiavi vengono mappate alla stessa posizione nella tabella hash.
  • Risoluzione delle Collisioni: Due tecniche principali: concatenamento e indirizzamento aperto.

Tavole a Indirizzamento Diretto

  • Idea: Ogni chiave ha una posizione specifica nella tabella e l'accesso ad un elemento ha un costo costante (O(1)).
  • Limiti: Strutturamolto spaziale perché richiede una memorizzazione per ogni possibile chiave negli insiemi.

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

Description

Scopri come le strutture dati come array e tabelle hash influenzano l'efficienza nel tempo di accesso ai dati. Il quiz approfondisce le operationi su insiemi dinamici e le differenze tra strutture statiche e dinamiche. Un'opportunità per mettere alla prova la tua comprensione di questi concetti fondamentali.

More Like This

CS223: Data Structures - Hash Tables
24 questions
Sorting Algorithms and Hash Tables
25 questions
Hashing Techniques in Data Structures
10 questions
Data Structures: Hash Functions and Tries
8 questions
Use Quizgecko on...
Browser
Browser