Condivisione della tecnologia

2025~Domande del test "Struttura dei dati"~Esame di ammissione post-laurea

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Home page dell'autore: Zhi Guyun esce da Xiu
Inserisci qui la descrizione dell'immagine

  1. Domande a scelta multipla: Esaminare i concetti di base e le operazioni di base
  2. Riempi gli spazi vuoti: Rafforzare la comprensione dei concetti fondamentali e dei dettagli
  3. domande a risposta breve: Testare la padronanza delle conoscenze teoriche
  4. Domande di programmazione: Testare l'effettiva capacità di programmazione e l'applicazione della struttura dei dati
  5. Inserisci qui la descrizione dell'immagine

Volume di simulazione della struttura dei dati

1. Domande a scelta multipla (2 punti ciascuna, 20 punti in totale)

  1. La complessità temporale dell'inserimento di un elemento in un array è ().
    A.O(1)
    B. O(n)
    C.O(log n)
    D. O(n^2)

  2. Nell'ordinamento dell'heap, la complessità temporale della creazione di un heap massimo è ().
    A. O(n)
    B. O(n log n)
    C.O(log n)
    D. O(n^2)

  3. Un albero rosso-nero è un tipo di ().
    A. Albero binario completo
    B. Albero binario bilanciato
    C. Heap minimo
    D. Heap massimo

  4. Quale delle seguenti affermazioni sulle tabelle hash è errata ().
    R. La complessità del tempo di ricerca della tabella hash è O(1)
    B. La complessità del tempo di inserimento della tabella hash è O(1)
    C. Le tabelle hash possono risolvere i conflitti
    D. La complessità del tempo di ricerca della tabella hash deve essere O(1)

  5. Nell'attraversamento del grafico, la complessità temporale della ricerca in profondità (DFS) e della ricerca in ampiezza (BFS) è rispettivamente ().
    A. O(V + E) e O(V)
    B. O(V^2) e O(V)
    C. O(V + E) e O(V + E)
    D.O(V) e O(V^2)

  6. La complessità temporale dell'inversione di un elenco collegato unidirezionale è ().
    A.O(1)
    B. O(n)
    C.O(log n)
    D. O(n^2)

  7. In un albero di ricerca binario, la complessità temporale nel caso peggiore dell'eliminazione di un nodo è ().
    A.O(1)
    B. O(n)
    C.O(log n)
    D. O(n log n)

  8. Quale dei seguenti algoritmi di ordinamento ha una complessità temporale media pari a O(n log n)().
    A. Ordinamento a bolle
    B. Ordinamento rapido
    C. Ordinamento di inserimento
    D. Ordinamento della selezione

  9. In un albero binario, il grado di un nodo è ().
    A. Il numero di nodi figli di questo nodo
    B. La profondità del nodo
    C. L'altezza del nodo
    D. Il livello del nodo

  10. La differenza principale tra B-tree e B+-tree è ().
    R. Tutti i nodi dell'albero B memorizzano i dati, mentre solo i nodi foglia dell'albero B+ memorizzano i dati.
    B. L'albero B è più equilibrato dell'albero B+
    C. Le operazioni di inserimento e cancellazione del B-tree sono più semplici
    D. L'efficienza di ricerca dell'albero B+ è inferiore

2. Domande a completamento (3 punti ciascuna, 15 punti in totale)

  1. L'altezza di un albero binario completo contenente n nodi è ______.
  2. La complessità temporale media dell'ordinamento rapido è ______.
  3. In un elenco collegato, la complessità temporale nel trovare l'elemento k-esimo è ______.
  4. La complessità spaziale della rappresentazione della matrice di adiacenza di un grafo è ______.
  5. In un albero di Huffman, la lunghezza ponderata del percorso viene calcolata come ______.

3. Domande a risposta breve (10 punti ciascuna, 30 punti in totale)

  1. Descrivi brevemente le proprietà degli alberi rosso-neri e spiega come gli alberi rosso-neri mantengono l'equilibrio.
  2. Spiegare la differenza tra array dinamici ed elenchi collegati e discuterne vantaggi, svantaggi e scenari applicativi.
  3. Descrivere i principi delle tabelle hash e spiegare come gestire le collisioni.

4. Domande di programmazione (15 punti ciascuna, 35 punti in totale)

  1. Si prega di implementare una funzione per determinare se un elenco collegato è un elenco collegato palindromo.

    def is_palindrome(head):
        # 请在这里编写代码
    
    • 1
    • 2
  2. Si prega di scrivere il codice per implementare l'operazione di inserimento nell'albero di ricerca binario.

    class TreeNode:
        def __init__(self, key):
            self.left = None
            self.right = None
            self.val = key
    
    def insert(root, key):
        # 请在这里编写代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  3. Dato un grafo, rappresentato da una matrice di adiacenza, implementare la ricerca in ampiezza (BFS).

    def bfs(graph, start):
        # 请在这里编写代码
    
    • 1
    • 2

Risposta

1. Domande a scelta multipla

  1. B
  2. UN
  3. B
  4. D
  5. C
  6. B
  7. B
  8. B
  9. UN
  10. UN

2. Compila gli spazi vuoti

  1. log(n+1) arrotonda per difetto
  2. O(n log n)
  3. SU)
  4. O(V^2)
  5. La somma delle lunghezze del percorso ponderate di tutti i nodi foglia

3. Domande a risposta breve

  1. proprietà dell'albero rosso nero

    • Proprietà 1: Ogni nodo è rosso o nero.
    • Proprietà 2: Il nodo radice è nero.
    • Proprietà 3: Ogni nodo foglia (nodo NIL) è nero.
    • Proprietà 4: Se un nodo è rosso, allora entrambi i suoi nodi figli sono neri (cioè non possono esserci due nodi rossi consecutivi su tutti i percorsi da ciascuna foglia alla radice).
    • Proprietà 5: tutti i percorsi semplici da qualsiasi nodo a ciascuna delle sue foglie contengono lo stesso numero di nodi neri.

    Come gli alberi rosso-neri mantengono l'equilibrio

    • Dopo le operazioni di inserimento e cancellazione, le proprietà dell'albero rosso-nero vengono mantenute mediante rotazione e ricolorazione, garantendo così che l'altezza dell'albero rimanga sempre all'interno dell'intervallo O(log n).
  2. La differenza tra array dinamico ed elenco collegato

    • Array dinamici (come le liste in Python): la memoria è continua, è possibile accedere rapidamente agli elementi tramite indici, le operazioni di inserimento e cancellazione richiedono lo spostamento di elementi e la complessità temporale è O(n).
    • Lista concatenata: La memoria non è continua e connessa tramite puntatori (riferimenti). La complessità temporale delle operazioni di inserimento e cancellazione è O(1), ma la complessità temporale della ricerca degli elementi è O(n).
    • Vantaggi e svantaggi
      • Array dinamico: il vantaggio è che l'accesso casuale è veloce, ma lo svantaggio è che l'inserimento e l'eliminazione sono lenti e potrebbero richiedere un'espansione.
      • Elenco concatenato: il vantaggio è che l'inserimento e la cancellazione sono veloci, ma lo svantaggio è che l'accesso casuale è lento e occupa più memoria (perché i puntatori devono essere archiviati).
    • Scenari applicativi
      • Gli array dinamici sono adatti per scenari in cui è necessario accedere frequentemente agli elementi e le dimensioni non vengono modificate frequentemente, ad esempio la memorizzazione nella cache.
      • Gli elenchi collegati sono adatti per scenari che richiedono frequenti inserzioni ed eliminazioni di elementi, come l'implementazione di code e stack.
  3. Il principio della tabella hash

    • Le tabelle hash mappano le chiavi alle posizioni degli indici dell'array tramite una funzione hash, consentendo operazioni veloci di ricerca, inserimento ed eliminazione.
    • Come gestire i conflitti
      • Metodo indirizzo aperto: in caso di conflitto, vengono utilizzati il ​​rilevamento lineare, il rilevamento secondario e altri metodi per trovare la successiva posizione libera.
      • Metodo dell'indirizzo a catena: in caso di conflitto, gli elementi con lo stesso valore hash vengono archiviati in un elenco collegato.

4. Domande di programmazione

  1. Determina se l'elenco collegato è un elenco collegato palindromo:

    class ListNode:
        def __init__(self, x):
            self.val = x
            self.next = None
    
    def is_palindrome(head):
        # 使用快慢指针找到链表中点
        slow = fast = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        
        # 反转后半部分链表
        prev = None
        while slow:
            temp = slow.next
            slow.next = prev
            prev = slow
            slow = temp
        
        # 比较前半部分和后半部分
        left, right = head, prev
        while right:
            if left.val != right.val:
                return False
            left = left.next
            right = right.next
        return True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  2. Operazione di inserimento nell'albero di ricerca binario:

    class TreeNode:
        def __init__(self, key):
            self.left = None
            self.right = None
            self.val = key
    
    def insert(root, key):
        if root is None:
            return TreeNode(key)
        if key < root.val:
            root.left = insert(root.left, key)
        else:
            root.right = insert(root.right, key)
        return root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  3. Ricerca prima in ampiezza (BFS):

    from collections import deque
    
    def bfs(graph, start):
        visited = [False] * len(graph)
        queue = deque([start])
        visited[start] = True
        result = []
    
        while queue:
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10