•  
  • Archivi per febbraio 2007 (14)
  • Pagina2

Ordinare in tempo Quadratico Array di elementi

Categorie: Informatica
Commenti: 1 commento
Pubblicato il: 3 febbraio 2007

Bolle

Continua il viaggio attraverso i codici C.

Stavolta ci si occupa di ordinamenti. Ordinamenti di array di elementi (in questo caso, per semplicità, ordiniamo numeri interi, ma è possibile ordinare qualsiasi insieme di elementi su cui sia possibile creare una relazione di ordine totale)


I tre algoritmi che tratteremo sono:

  1. Selection sort
  2. Insertion sort
  3. Bubble sort

Partiamo dal primo: SELECTION SORT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void selection(int a[], int n)
{
int i, j, min;
int t;
for (i=0; i <= n-1; i++)
{
min = i;
for (j= i + 1; j < n; j++)
{
if (a[j] < a[min])
{
min = j;
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
}
}

Passiamo in Input l’array da ordinare e il numero degli elementi dell’array. In output non viene restituito nulla (L’algoritmo modifica il contenuto dell’array).

Inizializziamo 4 interi, che sono rispettivamente 2 indici di ciclo, un indicatore del minimo e un intero temporaneo per gli swap.

Dopodichè cominciano i cicli. Nel generico passo, gli elementi a[k+1] .. a[n] non sono ancora ordinati, Si ricerca il minimo tra questi elementi e si mette nella posizione k + 1., dopodichè si va al passo successivo.

Il tempo computazionale di questo algoritmo è Teta di N quadro


INSERTION SORT:

1
2
3
4
5
6
7
8
9
10
11
void insertion(int a[], int n)
{
int i, j, app;
for (i=1; i=0) && (a[j]>app))
{
a[j+1] = a[j];
j--;
}
a[j+1] = app;
}
}

Passiamo in Input l’array da ordinare e il numero degli elementi dell’array. In output non viene restituito nulla (L’algoritmo modifica il contenuto dell’array).

Inizializziamo 3 interi, che sono rispettivamente 2 indici di ciclo e un intero temporaneo per gli swap.

Dopodichè cominciano i cicli. Nel generico passo, gli elementi a[1] .. a[k] sono già ordinati, e l’elemento x = a[k + 1] è inserito nella posizione che gli compete.

Il tempo computazionale di questo algoritmo è Teta di N quadro


BUBBLE SORT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Bubble(int a[], int n)
{
int i, tmp;
int high = n;
while (high > 0)
{
for (i=0; ia[i+1])
{
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
};
high--;
};
}

Passiamo in Input l’array da ordinare e il numero degli elementi dell’array. In output non viene restituito nulla (L’algoritmo modifica il contenuto dell’array).

Inizializziamo 3 interi, che sono rispettivamente 2 indici di ciclo e un intero temporaneo per gli swap.

All’I-esima scansione, gli elementi da a[n-i+1] ad a[n] sono corretamente ordinati ed occupano la loro posizione definitiva,

Il tempo computazionale di questo algoritmo è /theta

Ancora su Palermo – Catania

Categorie: Attualità
Commenti: Nessun Commento
Pubblicato il: 2 febbraio 2007

Lutto
Sembra assurdo, ma siamo forse oculari testimoni di un evento che potrebbe sconvolgere il mondo calcistico italiano, più di quanto non abbia fatto Calciopoli.

C’è da dire che Pancalli ha decretato la sospensione pro tempore di tutti i campionati di calcio, dalla serie A all’interregionale.

Questa è una decisione che purtroppo costerà cara anche economicamente a molte persone. Per prima la SNAI.

Dettaglio paradossale e aggiacciante, la partita era stata preceduta da un minuto di silenzio per ricordare la figura di Ermanno Licursi, dirigente della Sammartinese, morto sabato scorso dopo una rissa allo stadio di Luzzi, al termine della partita con la Cancellese (Terza categoria). (Tratto da Gazzetta.it)

Ma di questo non importa niente a nessuno. C’è da dire che anche il sito del Catania calcio ha chiuso per lutto e questo non fa che aggiungersi a tutta una serie di pensieri e commozioni che vanno all’anima di Filippo Raciti e ai suoi familiari.

Cito anche un altro articolo della gazzetta dello sport, utile soprattutto a squadrare i colpevoli ed evitare di generalizzare:

CATANIA, 3 febbraio 2007 – Salvatore Renda, 24 anni, è uno degli agenti del reparto mobile della polizia rimasto ferito ieri negli scontri scoppiati attorno allo stadio Massimino. Ricoverato nel reparto di osservazione del pronto soccorso dell’ospedale Garibaldi, ricorda con dolore e commozione gli scontri di ieri. «Non si può morire per una partita di calcio perché un tifoso cerca di fare rivalere le proprie convinzioni sugli altri usando violenza”.

La sua ricostruzione è utile per capire cosa è accaduto. “Stavo scortando con dei colleghi un gruppo di tifosi del Palermo al Massimino – ricorda – quando all’improvviso siamo stati assaliti dagli ultras del Catania. Ci è arrivato addosso di tutto. È stata un’imboscata da guerriglia organizzata. All’improvviso l’aria si è resa irrespirabile, mi sono sentito male e sono svenuto”. Renda si è svegliato in ambulanza mentre lo portavano al pronto soccorso. “In ospedale – aggiunge visibilmente commosso – ho saputo della morte di Filippo Raciti. Io lo conoscevo: era un amico, un grande professionista stimato da tutti. Conosco anche la moglie. È una tragedia”.

Non riesco ancora a capacitarmi di come l’uomo possa essere cosi animale.

Palermo – Catania, un derby amaro

Categorie: Attualità
Commenti: Nessun Commento
Pubblicato il: 2 febbraio 2007

Calcio

Comincerò a raccontarvi un brutto evento, e a darvi qualche mia opinione in merito, partendo dalla fine…

Un agente del reparto mobile della Questura di Catania e’ morto questa sera (2 FEBBRAIO 2007, ORE 21:45) durante scontri tra forze dell’ ordine e tifosi del Catania durante il derby con il Palermo. La circostanza è stata confermata da fonti delle forze dell’ ordine. L’agente sarebbe stato colpito al viso da una bomba carta.

Questa citazione deriva direttamente da una notizia ANSA.

Reputo assolutamente incredibile, paradossale e scandaloso quello che è successo allo stadio massimino.

Durante degli scontri tra ultras, in occasione dell’ingresso allo stadio dei tifosi del palermo, un poliziotto viene colpito in pieno volto da una bomba carta, lanciata da chissà chi a chissà chi altro.

Durante la partita vengono lanciati numerosi lacrimogeni, anche in campo, e l’arbitro è costretto ad interrompere la partita per 35 minuti, e a fare rientrare tutti negli spogliatoi, perchè l’aria era irrespirabile e la tensione palpabile, senza falsi eufemismi.

Pensavo che tutto si fermasse li, ma in realtà era solo un preambolo. Prima, durante e dopo la partita, gli scontri tra tifosi di ambo le parti e la polizia sono stati frequenti, e a quanto detto sopra, con conseguenze catastrofiche.

Si sa, lo scontro calcistico tra Palermo e Catania, è uno dei principali artefici di sfogo di collera repressa, ma non possiamo andare avanti cosi. Non può morire una persona ed avere 100 feriti, di cui almeno la metà in codice almeno Giallo per renderci conto che qualcosa non va. Abbiamo perso, e continuiamo a perdere tutti.

Dicono che la colpa sia dei tifosi catanesi, in quanto “esacerbati” dal doppio vantaggio palermitano scandaloso.
Dicono che la colpa sia dei tifosi palermitani arrivati in ritardo per colpa di una scorta che gli ha fatto allungare il percorso…
Dicono che la colpa è di quattro idioti che si divertono a fare una versione a scoppio dei ragazzi della via pal…

Io dico soltanto che qualcosa deve cambiare. Io vado allo stadio per assistere una partita di calcio, e vi garantisco, che anche a me i tifosi catanesi non stanno PER NULLA simpatici, vorrei che il catania non vincesse una partita in tutto il campionato… ma da qui ad arrivare a picchiare, insultare e colpire poliziotti e tifosi avversari ce ne vuole… è solo da idioti.

Una conduzione arbitrale nettamente sfavorevole ( lo ammetto da tifoso palermitano, i due gol palermitani sono assurdi da convalidare) non giustifica comportamenti animaleschi.

Come vogliamo dar luce alla regione Sicilia, come vogliamo toglierci la cappa di mafiosi, di antiquati, se non siamo in grado di comportarci da persone civili?

Perchè ci lamentiamo degli altri, se poi siamo noi i primi a sbagliare?

Pace all’anima di un poliziotto morto nell’esercizio del dovere. Io avevo un parente che è morto esercitando il suo dovere civico, so cosa vorrà dire per la sua famiglia.

Ma di certo, è sicuramente qualcosa che in futuro non dovrà mai più accadere.

Oggi, io non mi sento siciliano.

Alberi binari in C

Categorie: Informatica
Commenti: 7 commenti
Pubblicato il: 2 febbraio 2007

Alberello
E’ da un pò di tempo che sto cercando di dedicarmi all’implementazione in C di programmi sempre meno banali.

Purtroppo non sono un programmatore provetto, e forse non lo sarò mai. Sto tuttavia cercando di colmare il gap che mi separa dal perfetto ingegnere.. anche se a rilento.

Quello che vi sto mostrando è il codice commentato di un albero binario con alcune funzioni interessanti, che aggiornerò man mano in base a quello che mi passerà per il cervello.

Oggetto: Albero Binario
Implementazione in Linguaggio: C (ANSI)
Funzioni: Creazione dell’albero, collezione di informazioni, ricerca e cancellazione.

typedef struct node *Nodepointer;
typedef struct node
{
int valore;
Nodepointer son_sx;
Nodepointer son_dx;
Nodepointer father;
int markup;
} Nodo;

Cominciamo dalle strutture, per poi passare alle funzioni, al main e a tutto il resto (ad esempio gli include).

typedef struct node *Nodepointer; indica che Nodepointer da ora in poi sarà la parola chiave utilizzabile per identificare un puntatore a una struttura chiamata node.

typedef struct node { … } Nodo è invece la definizione di Nodo come parola chiave per la creazione di una struct node.

La struct node altro non è che il singolo nodo dell’albero, vediamo come è composto:

  • int valore;
  • questo intero è il contenuto del nodo, l’informazione che il nodo trasporta.

  • Nodepointer son_sx;
  • Puntatore al nodo figlio sinistro

  • Nodepointer son_dx;
  • Puntatore al nodo figlio destro

  • Nodepointer father;
  • Puntatore al nodo padre

  • int markup;
  • intero di marcatura. Serve per contraddistinguere un nodo visitato da uno non visitato.

Cominciamo dalla prima funzione:

Nodepointer creaNodo(int value)
{
Nodepointer puntatore = malloc(sizeof(Nodo));
puntatore->valore = value;
puntatore->son_sx = NULL;
puntatore->son_dx = NULL;
puntatore->father = NULL;
puntatore->markup = 0;
return puntatore;
}

Questa funzione ha come input un intero (il contenuto del nodo) e restituisce un puntatore a nodo.

Per prima cosa crea la memoria necessaria ad un nodo tramite la funzione malloc, quindi inizializza a NULL tutti i puntatori (rendendo di fatto il nodo isolato da tutto, ma sta a noi del resto collegarlo a quello che vogliamo) e pone a 0 il bit di markup, dato che il nodo non è stato visitato. Quindi, restituisce il puntatore al nodo creato.

Nodepointer settings(Nodepointer nodo, Nodepointer sx, Nodepointer dx, Nodepointer dad)
{
nodo->son_sx = sx;
nodo->son_dx = dx;
nodo->father = dad;
return nodo;
} 

Questa funzione invece serve a “legare” il nodo creato a qualche altro nodo, in modo da potere creare un albero.

In input si hanno 4 puntatori a nodo, e in output si ha il primo puntatore in input, aggiornato.

Cominciamo adesso con le visite di questo albero. Cosa si intende per visita? Per visita si intende un controllo sequenziale di tutti i nodi a partire dalla radice dell’albero, e può essere utile per la ricerca di un nodo con un particolare valore all’interno di un albero.

Tuttavia, non ho implementato algoritmi di visita al fine di implementare ricerche, ma mi sono curato solo ed esclusivamente di mostrare l’ordine di controllo dei nodi in visite diverse.


Visita n°1: Preordine:

void visitapreordine(Nodepointer start)
{
if (start == NULL) return;
start->markup = 1;
printf("%d %d\\\\\\\\n", start->valore, start->markup);
visitapreordine(start->son_sx);
visitapreordine(start->son_dx);
}

E’ una visita DFS ovvero Depth First Search, o normalmente detta visita in profondità.
Ha in input il nodo di partenza della ricerca, in output non restituisce nulla.

Si controlla per prima cosa che l’albero sia consistente, che quindi non si tratti di un albero degenere in un solo nodo, in tal quale caso, si ritorna immediatamente.

Quindi si visita il nodo (ho scelto semplicemente di stampare a video il valore) e si marca come visitato. Successivamente, si ripete ricorsivamente la funzione sul sottoalbero sinistro, e sul sottoalbero destro.


Visita n°2: Simmetrica:

void visitasimmetrica(Nodepointer start)
{
if (start == NULL) return;
visitasimmetrica(start->son_sx);
start->markup = 1;
printf("%d %d\\\\\\\\n", start->valore, start->markup);
visitasimmetrica(start->son_dx);
}

Anche questa è una visita DFS ovvero Depth First Search, o normalmente detta visita in profondità.
Questa funzione, a differenza della precedente, agisce prima sul sottoalbero sinistro, poi sulla radice, quindi sul sottoalbero destro.


Visita n°3: PostOrdine:

void visitapostordine(Nodepointer start)
{
if (start == NULL) return;
visitapostordine(start->son_sx);
visitapostordine(start->son_dx);
start->markup = 1;
printf("%d %d\\\\\\\\n", start->valore, start->markup);
}

Anche questa è una visita DFS ovvero Depth First Search, o normalmente detta visita in profondità.
Questa funzione agisce prima sui sottoalberi sinistro e destro, e poi sulla radice.


int main()
{
Nodepointer point1, point2, point3, point4, point5, point6, point7, point8;
point1 = creaNodo(100);
point2 = creaNodo(200);
point3 = creaNodo(300);
point4 = creaNodo(400);
point5 = creaNodo(500);
point6 = creaNodo(600);
point7 = creaNodo(700);
point8 = creaNodo(800);
settings(point1,point2,point3,NULL);
settings(point2,point4,point5,point1);
settings(point3,point6,point7,point1);
settings(point4,point8,NULL,point2);
settings(point5,NULL,NULL,point2);
settings(point6,NULL,NULL,point3);
settings(point7,NULL,NULL,point3);
settings(point8,NULL,NULL,point4);
visitapreordine(point1);
visitasimmetrica(point1);
visitapostordine(point1);
}

Questa è la funzione main, che si limita a creare 8 punti, inizializzarli, settarli e richiamare le procedure di visita.

Presto mi occuperò anche della ricerca in ampiezza, che sembra essere piu difficile da implementare.

«pagina 2 di 2
Seguimi
FacebookLinkedInTwitterYoutubeRSS
I like it!
Google and Twitter

Benvenuto , oggi è lunedì, 6 febbraio 2012