D I S P E N S A
INDICE
Premesse fondamentali
Paradigmi di programmazione e
lunguaggio C#:
PREMESSE FONDAMENTALI
= 23 > 67 Xor
= 23 > 14 Xor
= 14 > 23 Xor
The preceding
11 > 8
11 > 8
8 > 11
statements set e to True, f to False, and g to False.
Cifra decimale
Codice BCD
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
spesso, ordina un mazzo di carte. Esso un algoritmo in place, cio ordina l'array
senza doverne creare una copia, risparmiando memoria. Pur essendo molto meno
efficiente di algoritmi pi avanzati, pu avere alcuni vantaggi: ad esempio, semplice
da implementare ed efficiente per insiemi di partenza che sono quasi ordinati.
Complessit algoritmica
Il caso ottimo per l'algoritmo quello in cui la sequenza di partenza sia gi
ordinata. In questo caso, l'algoritmo ha tempo di esecuzione lineare, ossia
(N). Infatti, in questo caso, in ogni iterazione il primo elemento della
sottosequenza non ordinata viene confrontato solo con l'ultimo della
sottosequenza ordinata. Il caso pessimo invece quello in cui la sequenza di
partenza sia ordinata al contrario. In questo caso, ogni iterazione dovr
scorrere e spostare ogni elemento della sottosequenza ordinata prima di poter
inserire il primo elemento della sottosequenza non ordinata. Pertanto, in
questo caso l'algoritmo di insertion sort ha complessit temporale quadratica,
ossia (N^2).
Psegudocodice:
procedureinsertionSort(arrayA)
fori1tolength[A]do
valueA[i]
ji1
whilej>=0andA[j]>valuedo
A[j+1]A[j]
jj1
A[j+1]value
Selection sort
L'algoritmo seleziona di volta in volta il numero minore nella sequenza di partenza e lo
sposta nella sequenza ordinata; di fatto la sequenza viene suddivisa in due parti: la
sottosequenza ordinata, che occupa le prime posizioni dell'array, e la sottosequenza
da ordinare, che costituisce la parte restante dell'array.
Dovendo ordinare un array A di lunghezza n, si fa scorrere l'indice i da 1 a n-1
ripetendo i seguenti passi:
si cerca il pi piccolo elemento della sottosequenza A[i..n];
si scambia questo elemento con l'elemento i-esimo.
Complessit algoritmica
Il ciclo interno un semplice test per confrontare l'elemento corrente con il
minimo elemento trovato fino a quel momento (pi il codice per incrementare
l'indice dell'elemento corrente e per verificare che esso non ecceda i limiti
dell'array). Lo spostamento degli elementi fuori dal ciclo interno: ogni
scambio pone un elemento nella sua posizione finale quindi il numero di
scambi pari a N-1 (dato che l'ultimo elemento non deve essere scambiato).
Il tempo di calcolo determinato dal numero di confronti. L'ordinamento per
selezione effettua N(N-1)/2 confronti e, nel caso peggiore/migliore/medio,
(n-1) scambi. La complessit di tale algoritmo dell'ordine di (n^2).
Pseudocodice:
procedureSelectionSort(a:listadeinumeridaordinare);
fori=1ton1
posmini
forj=(i+1)ton
ifa[j]<a[posmin]
posminj
ausa[i]
a[i]a[posmin]
a[posmin]aus
Bubble sort
Il Bubble sort o bubblesort (letteralmente: ordinamento a bolle) un algoritmo di
ordinamento dei dati. Il suo funzionamento semplice: ogni coppia di elementi
adiacenti della lista viene comparata e se sono nell'ordine sbagliato vengono invertiti
di posizione. L'algoritmo scorre poi tutta la lista finch non vengono pi eseguiti
scambi, situazione che indica che la lista ordinata.
Complessit algoritmica
Il bubble sort effettua all'incirca N^2/2 confronti ed N^2/2 scambi sia in media
che nel caso peggiore. Il tempo di esecuzione dell'algoritmo (N^2).
Pseudocodice:
procedureBubbleSort(A:listadeglielementidaordinare)
scambiotrue
whilescambiodo
scambiofalse
fori0tolength(A)2do
ifA[i]>A[i+1]then
swap(A[i],A[i+1])
scambiotrue
Ricerca binaria
La ricerca binaria un algoritmo di ricerca che individua l'indice di un determinato
valore presente in un insieme ordinato di dati. La ricerca dicotomica richiede un
accesso casuale ai dati in cui cercare. L'algoritmo simile al metodo usato per trovare
una parola sul dizionario: sapendo che il vocabolario ordinato alfabeticamente, l'idea
quella di iniziare la ricerca non dal primo elemento, ma da quello centrale, cio a
met del dizionario. Si confronta questo elemento con quello cercato. Se corrisponde,
la ricerca termina indicando che l'elemento stato trovato; se superiore/inferiore, la
ricerca viene ripetuta sugli elementi precedenti/successivi.
Complessit algoritmica
La ricerca binaria non usa mai pi di O(log_2 N) confronti per una search hit o
una search miss. Tuttavia, a meno che non si controllino ad ogni iterazione i
valori dei due indici estremi, la ricerca binaria impiega effettivamente sempre
6
lo stesso tempo su uno stesso array per cercare elementi anche in posizioni
diverse; la ricerca sequenziale invece passa da O(N) come caso peggiore a
O(N/2) nel caso medio, fino a O(1) se l'elemento si trova in prima posizione.
Matrici
Una matrice una tabella ordinata di elementi.
Ad esempio:
Come mostrato negli esempi, i valori presenti nella matrice possono essere di vario
tipo: interi, reali o anche complessi.
Algebra delle matrici
Sulle matrici si possono definire numerose operazioni: due matrici (aventi dei numeri
opportuni di righe e colonne) possono essere sommate, sottratte, moltiplicate fra loro,
e moltiplicate per un numero (detto scalare).
Somma
Due matrici A e B , entrambe di tipo mX n , possono essere sommate. La loro
somma A+B definita come la matrice mXn i cui elementi sono ottenuti
sommando i corrispettivi elementi di A e B . Formalmente:
[A + B]_{i, j} := [A]_{i,j} + [B]_{i,j}
Per esempio:
Prodotto
La moltiplicazione tra due matrici A e B un'operazione pi complicata delle
precedenti. A differenza della somma, non definita moltiplicando
semplicemente gli elementi aventi lo stesso posto. La definizione di
moltiplicazione che segue motivata dal fatto che una matrice modellizza una
applicazione lineare, e in questo modo il prodotto di matrici corrisponde alla
composizione di applicazioni lineari.
La moltiplicazione definita soltanto se le matrici A e B sono rispettivamente di
tipo mXp e pXn: in altre parole, il numero p di colonne di A deve coincidere con
il numero p di righe di B. Il risultato una matrice C di tipo mXn.
Determinante
Il determinante di una matrice quadrata (nXn) A un numero che descrive alcune
propriet algebriche e geometriche della matrice. Esso viene generalmente indicato
con det(A) ed a volte con |A|, quest'ultima notazione pi compatta ma anche pi
ambigua, in quanto utilizzata talvolta per descrivere una norma della matrice. Vale la
seguente formula di Leibniz:
Nella
formula,
l'insieme
numerico
e
denota
una permutazione pari, 1 se dispari).
di
tutte
il segno
le permutazioni
della
dell'insieme
permutazione (
se
Matrici invertibili
Una matrice quadrata detta invertibile o regolare se esiste un'altra matrice tale che
il prodotto matriciale tra le due restituisce la matrice identit. Una matrice invertibile
se e solo se il suo determinante uguale a 0.
Generazione di matrici a spirale in C
#include <stdio.h>
#include <stdlib.h>
/* verso il basso */
while (i <= j)
#define N 10
m[i++][j] = k++;
i--;
j--;
/* verso sinistra */
while (j >= n - i - 1)
int main()
m[i][j--] = k++;
j++;
int matrice [N][N], size;
i--;
/* verso l'alto */
while (i > j)
m[i--][j] = k++;
i++;
j++;
return EXIT_SUCCESS;
return;
}
10
k = 0;
int i, j;
while (j < n - i)
printf ("\n");
m[i][j++] = k++;
j--;
i++;
return;
}
Record
Un record un oggetto di una banca dati strutturata in dati compositi, che
contengono un insieme di campi o elementi, ciascuno dei quali possiede nome e tipo
di dato propri.
I record devono molto alle tradizionali schede cartacee delle biblioteche, da cui
riprendono in gran parte la struttura.
Nella formalizzazione delle basi di dati relazionali l'elemento corrispondente al record
chiamato tupla.
Di seguito un programma in C# definisce un nuovo tipo classe Record,
rappresentante un record che memorizza Identificativo, Nome, Indirizzo, Telefono,
Cellulare ed E-Mail di un cliente (Customer) di unazienda, per poi assegnare il nome
Simone al primo elemento di un array customers di Record.
publicclassRecord
{
publicstringID{get;set;}
publicstringName{get;set;}
publicstringAddress{get;set;}
publicstringPhone{get;set;}
publicstringCell{get;set;}
publicstringEmail{get;set;}
}
Record[]customers=newRecord[50];
RecordcurrentCustomer=customers[1];
currentCustomer.Name="Simone";
11
12