CS-Swap / Algoritmi-1

Repository destinato alla condivisione di materiale e soluzioni per gli esercizi ed esami assegnati dal Prof. Monti Angelo in preparazione all'esame di Algoritmi 1
9 stars 1 forks source link

Esame - #3 - 17 Gen 2023 #69

Open notedo opened 6 months ago

notedo commented 6 months ago
Screenshot 2024-05-12 alle 18 32 34
Soluzione Prof ![image](https://github.com/CS-Swap/Algoritmi-1/assets/116072651/5469ee61-aeac-4534-921b-43601546b7df) ![image](https://github.com/CS-Swap/Algoritmi-1/assets/116072651/b46b8c22-e5f5-47ec-a8b6-806dbcef4ff9)
ZGianluigi commented 6 months ago

a) Descrizione a parole: L’algoritmo inizia controllando se l’albero è vuoto, se è vuoto, restituisce 1 perché tutti i nodi hanno lo stesso valore. Se l’albero non è vuoto, l’algoritmo controlla se entrambi i figli del nodo radice sono None o se hanno lo stesso valore del nodo radice. Se una di queste condizioni è vera, l’algoritmo continua a chiamare ricorsivamente se stesso sui sottoalberi sinistro e destro. Se entrambe le chiamate ricorsive restituiscono 1, allora l’algoritmo restituisce 1; altrimenti, restituisce 0.

b) Pseudocodice:

def check_equal(p):
    if p is None:
        return 1
    if p.sx is not None and p.sx.val != p.val:
        return 0
    if p.dx is not None and p.dx.val != p.val:
        return 0
    if check_equal(p.sx) and check_equal(p.dx):
        return 1
    else:
        return 0

c) Giustificazione del costo computazionale:

$$T(n) = 2T\left(\frac{n}{2}\right) + O(1)$$

$T\left(\frac{n}{2}\right)$ rappresenta il tempo per processare i due sottoalberi. $O(1)$ rappresenta il tempo per le operazioni non ricorsive (verifica dei valori dei nodi, ecc.).

Utilizzando il Master Theorem, poiché $f(n) = O(1)$, confrontiamo $c$ con $\log_b a$: $c = 0$ $\log_b a = \log_2 2 = 1$

Poiché $c < \log_b a$, abbiamo $T(n) = O(n^{\log_b a})$. Quindi, $T(n) = O(n^1) = O(n)$.

TESTING (modificate i valori e provate come volete)

class Node:
    def __init__(self, val, sx=None, dx=None):
        self.val = val
        self.sx = sx
        self.dx = dx

def check_equal(p):
    if p is None:
        return 1
    if p.sx is not None and p.sx.val != p.val:
        return 0
    if p.dx is not None and p.dx.val != p.val:
        return 0
    if check_equal(p.sx) and check_equal(p.dx):
        return 1
    else:
        return 0

# Creazione di un albero di esempio
root = Node(1)
root.sx = Node(1)
root.dx = Node(1)
root.sx.sx = Node(1)
root.sx.dx = Node(1)

# Verifica se tutti i nodi hanno lo stesso valore
print(check_equal(root))  # Stampa: 1
rimaout commented 5 months ago

Codice:

def es(p):
    if p == None: return 1

    if (p.left != None and p.left.key != p.key) or (p.right != None and p.right.key != p.key):
        return 0

    return es(p.left) * es(p.right)

Costo Computazionale:

0B4D7854-0962-4A3E-869C-C86E33AFFB1F 496775B7-F392-4143-A9B1-0CE440AD7E0E
luckignolo32 commented 5 months ago
image
def es3(T, i=None)
    if T is None: return 1
    n = 1
    if i == None:
        i = T.key
    if T.key != i: return 0
    if T.left:
        n *= es3(T.left, i)
    if T.right:
        n *= es3(T.right, i)
    return n
notedo commented 5 months ago

True/False e 1/0 sono la stessa cosa

def es3(p):
    sx = False
    dx = False
    if p == None or (p.left == p.right == None):
        return True
    if (p.left and p.left.key == p.key) or p.left == None:
        sx = True and es3(p.left)
    if (p.right and p.right.key == p.key) or p.right == None:
        dx = True and es3(p.right)
    return sx and dx
alem1105 commented 5 months ago
def es(t):
    if t == None:
        return 1
    if t.left == t.right == None:
        return 1
    if t.left == None and t.right.key == t.key:
        return es(t.right)
    if t.right == None and t.left.key == t.key:
        return es(t.left)
    if t.key == t.left.key == t.right.key:
        return es(t.left) and es(t.right)
    return 0