Hardware Upgrade Forum

Hardware Upgrade Forum (https://www.hwupgrade.it/forum/index.php)
-   Programmazione (https://www.hwupgrade.it/forum/forumdisplay.php?f=38)
-   -   Da struttura albero binario di ricerca a matrice/tabella. Come (https://www.hwupgrade.it/forum/showthread.php?t=2940393)


zabnicola 11-05-2021 18:28

Da struttura albero binario di ricerca a matrice/tabella. Come
 
Qualcuno sa spiegarmi come un albero binario di ricerca puo essere stampato in forma di tabella quindi a matrice a array multidimensionale.
Premetto che secondo me sono concetti diversi. Ma nei database esiste una rappresentazione tabellare dei dati e una in albero binario di ricerca.

Non trovo e capisco la corrispondenza tra i due.

zabnicola 13-05-2021 10:39

Ho un array di 15 elements che lo suddivido in 3 righe * 5 colonne inizializzato cosi:
array[0] = 0
array[1] = 1
array[2] = 2
.
.
.
array[13] = 13
array[14] = 14

aggiungo tutti gli elementi nel BST, albero binario di ricerca. Come si stampa un BST affinchè mi stampi le celle in ordine se queste sono inserite nell'albero in modo sparso?
quale visita dovrei usare: in ordine, pre ordine o post ordine?

wingman87 13-05-2021 11:23

Se visualizzi mentalmente (o su carta) un albero binario di ricerca, ogni nodo contiene nel ramo sinistro tutti i valori minori del nodo corrente e nel ramo destro tutti quelli maggiori.

Se devi stampare i valori in ordine quindi devi stampare prima il ramo sinistro, poi il nodo stesso e infine il ramo destro.

La domanda del tuo primo post non mi è chiara, provo a rispondere sulla questione dei database. Cerco di farla semplice per rendere tutto più comprensibile, in realtà ci sarebbero molti dettagli in più da considerare ma la sostanza di fondo non cambia.

Nei database i dati sono salvati in forma tabellare, record dopo record.
Senza meccanismi aggiuntivi, per cercare un record dovresti scorrerli tutti uno a uno e verificare se il record che stai controllando ti interessa o meno.
Per rendere più efficienti le operazioni di ricerca si possono costruire degli indici che sono appunto alberi di ricerca in cui ogni nodo contiene il valore indicizzato e un riferimento al record.
Ad esempio se tu hai una tabella anagrafica di persone con all'interno nome, cognome, indirizzo, eccetera, potresti creare un indice sul campo cognome. Allora il tuo albero di ricerca conterrà un nodo per ogni cognome e all'interno dello stesso nodo ci sarà il riferimento al record corrispondente. Quando esegui una ricerca per cognome, invece di scorrerti tutti i record uno a uno, esegui una ricerca sull'albero e quando trovi una corrispondenza hai subito il riferimento al record completo.

zabnicola 13-05-2021 12:41

Quote:

Originariamente inviato da wingman87 (Messaggio 47404092)
Se visualizzi mentalmente (o su carta) un albero binario di ricerca, ogni nodo contiene nel ramo sinistro tutti i valori minori del nodo corrente e nel ramo destro tutti quelli maggiori.

Se devi stampare i valori in ordine quindi devi stampare prima il ramo sinistro, poi il nodo stesso e infine il ramo destro.

La domanda del tuo primo post non mi è chiara, provo a rispondere sulla questione dei database. Cerco di farla semplice per rendere tutto più comprensibile, in realtà ci sarebbero molti dettagli in più da considerare ma la sostanza di fondo non cambia.

Nei database i dati sono salvati in forma tabellare, record dopo record.
Senza meccanismi aggiuntivi, per cercare un record dovresti scorrerli tutti uno a uno e verificare se il record che stai controllando ti interessa o meno.
Per rendere più efficienti le operazioni di ricerca si possono costruire degli indici che sono appunto alberi di ricerca in cui ogni nodo contiene il valore indicizzato e un riferimento al record.
Ad esempio se tu hai una tabella anagrafica di persone con all'interno nome, cognome, indirizzo, eccetera, potresti creare un indice sul campo cognome. Allora il tuo albero di ricerca conterrà un nodo per ogni cognome e all'interno dello stesso nodo ci sarà il riferimento al record corrispondente. Quando esegui una ricerca per cognome, invece di scorrerti tutti i record uno a uno, esegui una ricerca sull'albero e quando trovi una corrispondenza hai subito il riferimento al record completo.

grazie per la risposta. In parte mi hai risposto. Quindi utilizzeresti il BST solo per creare degli indici sui campi della tabella anagrafica. Ma serve anche a qualcuno altro questo discorso? comunque.

Ho di recente creato in C una tabella che si puo ridimensionare a piacere in righe e colonne di diversi tipi: char*, int, float.
Se volessi proseguire con l'esperimento del database scritto in C devo fare delle JOIN Prendiamo come esempio persona e libro: persona[3][5]; libro[6][5];

N libri sono di una persona.
Faccio un operazione di JOIN tra persona e libri cercando due titoli di libri per vedere chi li ha.
Quindi se seleziono i nomi "linguaggio c fondamenti" e "il piccolo principe" mi restituisce
rispettivamente gli utenti zabit e bigendian.

1 | zabit | linguaggio c fondamenti
2 | bigendian | il piccolo principe

Come si realizza il prodotto cartesiano tra persona e libro utilizzando la matrice?

come vedi queste operazioni se rappresento tutto con le matrici cioè vettori non risultano semplici o comode. Ce un altro modo?

wingman87 13-05-2021 15:24

Secondo me non è semplice e comodo perché è intrinsecamente un'operazione abbastanza complessa e inoltre farlo in C lo è ancora di più perché il linguaggio non ha molti costrutti per semplificare il codice.

Potresti definire il risultato del join di 2 tabelle A e B con una matrice di 2 colonne: la prima colonna contiene il puntatore al record della tabella A e la seconda colonna contiene il puntatore al record di B.
Poi quando vuoi selezionare particolari colonne delle due tabelle lo fai tramite i puntatori.

Ma tu stai usando gli array per le colonne perché vuoi che la struttura sia dinamica? Perché se la struttura è ben definita puoi usare delle struct che sono molto più comode e leggibili.

zabnicola 13-05-2021 16:46

Quote:

Originariamente inviato da wingman87 (Messaggio 47404468)
Ma tu stai usando gli array per le colonne perché vuoi che la struttura sia dinamica? Perché se la struttura è ben definita puoi usare delle struct che sono molto più comode e leggibili.

Per la struttura della tabella dinamica non è un problema.
Ho implementato il codice per avere una tabella in C che puo essere ridimensionata a piacere. Alla fine si accede come "se fosse statica" ossia table[2][4].

Cosi ho una tabella A accessibile con tableA[2][4] e un'altra tabella B accessibile anch'essa con tableB[0][1]. tabella A ha 3 righe e 5 colonne, la tabella B ha 6 righe e 7 colonne. Mettere in Join senza alcuna selezione significa fare prima riga per tutte le righe dell'altra tabella, seconda riga per tutte le righe dell'altra tabella e mostrare le colonne della tabella sia di A,B. Quindi dovrei creare una terza tabella che ha 18 righe e 12 colonne, copiando tutte le colonne della prima riga di A con la prima riga di B, della prima riga di A con la seconda di B, con la prima riga di A con la terza di B fino alla sesta di B.


Tutti gli orari sono GMT +1. Ora sono le: 10:12.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Hardware Upgrade S.r.l.