Wikiversità itwikiversity https://it.wikiversity.org/wiki/Pagina_principale MediaWiki 1.47.0-wmf.6 first-letter Media Speciale Discussione Utente Discussioni utente Wikiversità Discussioni Wikiversità File Discussioni file MediaWiki Discussioni MediaWiki Template Discussioni template Aiuto Discussioni aiuto Categoria Discussioni categoria Area Discussioni area Corso Discussioni corso Materia Discussioni materia Dipartimento Discussioni dipartimento Education Program Education Program talk TimedText TimedText talk Modulo Discussioni modulo Evento Discussioni evento Discussioni Wikiversità:Wikitest 5 5839 283892 94674 2026-06-13T07:40:09Z ~2026-34841-78 46711 /* Nunzio Di Giulio */ nuova sezione 283892 wikitext text/x-wiki ==Nessuno è interessato== Accidenti,nessuno è interessato a fare il test.Peccato,è un'idea graziosa,si potrebbe sfruttare per il meglio.Ma nessuno se ne interessa.Sempai l'ha spostata in una pagina di servizio,ma non è servito a niente.Ancora peccato.Si dovrebbe trovare il modo di farlo conoscere anche agli altri utenti,magari si potrebbe mettere nella [[pagina principale]].Si dovrebbe creare un programma(in php o in altri linguaggi),in modo da semplificare il lavoro.[http://tools.wikimedia.de/~filnik/wikidipendenza.php?force=1 questo è un esempio],una cosa del genere,insomma.[[Utente:Jurassic|Jurassic]] [[Discussioni utente:Jurassic|(msg)]] 16:23,27 mag 2008(CEST) :@[[Utente:Jurassic|Jurassic]]: ora esiste [[toollabs:wikidipendenza/wikiversity]]! --<span style="font-variant:small-caps">[[Utente:Ricordisamoa|<span style="color:#004B70">Ricordi</span>]][[Discussioni utente:Ricordisamoa|<span style="color:#00703E">samoa</span>]]</span> 14:37, 21 lug 2015 (CEST) == Domanda doppia e implementazione == La domanda 86 (controllato sul toollabs) è doppia; un suggerimento che vorrei dare è di rendere automatica la pagina col template quiz --[[Utente:Martinligabue|Martinligabue]] ([[Discussioni utente:Martinligabue|discussioni]]) 18:30, 11 ago 2015 (CEST) == Nunzio Di Giulio == Nunzio Di Giulio === Chiedo cortesemente il ripristino o l'apertura in modalità "Bozza" per la voce "Nunzio Di Giulio", cancellata a fine 2014. Il biografato, Ispettore Superiore della Polizia di Stato in quiescenza ed ex responsabile DIGOS a Cerignola, è una persona anziana non pratica dei mezzi informatici. Desideriamo segnalare che oggi sussistono forti, documentati e rinnovati motivi di rilevanza enciclopedica. La sua figura unisce importanti meriti istituzionali, una solida attività letteraria e una straordinaria storia familiare intergenerazionale legata alle Forze dell'Ordine: 1. ATTIVITÀ LETTERARIA ED EDITORIALE: È autore di numerose pubblicazioni di saggistica, poesia e narrativa edite a Cerignola, tra cui opere centrali per il territorio quali: "La collana di Turchese", "Nina vuole volare", "Mirta", "Il mio nome è Marinela", "L'urlo" e "Il bambino e l'Ofanto". Nel 1995 ha ricevuto il Premio Letterario Internazionale "Cavalieri di San Valentino" (Città di Terni). 2. ONORIFICENZE E CIVILTÀ: È stato insignito del titolo di Ufficiale al Merito della Repubblica Italiana (OMRI), onorificenza consegnata formalmente dalla Prefettura di Barletta-Andria-Trani in data 2 Giugno 2026. È inoltre Cittadino Onorario della Città di Cerignola e Commendatore della Santa Sede dell'Ordine di San Silvestro Papa (Breve pontificio di Papa Giovanni Paolo II). 3. CARRIERA NELLA POLIZIA DI STATO: Ha ricoperto ruoli storici nella gestione della sicurezza nazionale (Servizio d'ordine al processo Brigate Rosse a Torino nel '76, soccorsi per la strage alla stazione di Bologna nell'80, Operazione Vespri Siciliani a Palermo nel '92). 4. CONTINUITÀ GENERAZIONALE NELLO STATO: La sua è una storica famiglia di servitori dello Stato. È figlio di Michele Di Giulio (Medaglia d'Onore alla memoria), padre di Michele Di Giulio (Sovrintendente Capo di P.S., Medaglia di Bronzo al Valor Civile e Cavaliere OMRI) e nonno di Nunzio Di Giulio, attualmente in servizio nell'Arma dei Carabinieri. Alla luce di questa poliedrica figura di poliziotto, scrittore e capostipite di una famiglia interamente dedita alle istituzioni, chiediamo la possibilità di ricostruire la voce in Bozza, disponendo già di tutte le fonti ufficiali cartacee e web. Grazie per la valutazione. [[Speciale:Contributi/&#126;2026-34841-78|&#126;2026-34841-78]] ([[Discussioni utente:&#126;2026-34841-78|discussione]]) 09:40, 13 giu 2026 (CEST) 8dpjpcekh8f6ulnttd3a1svhp1aa70u 283946 283892 2026-06-13T11:34:15Z Matt6201 46707 /* Nunzio Di Giulio */ Risposta 283946 wikitext text/x-wiki ==Nessuno è interessato== Accidenti,nessuno è interessato a fare il test.Peccato,è un'idea graziosa,si potrebbe sfruttare per il meglio.Ma nessuno se ne interessa.Sempai l'ha spostata in una pagina di servizio,ma non è servito a niente.Ancora peccato.Si dovrebbe trovare il modo di farlo conoscere anche agli altri utenti,magari si potrebbe mettere nella [[pagina principale]].Si dovrebbe creare un programma(in php o in altri linguaggi),in modo da semplificare il lavoro.[http://tools.wikimedia.de/~filnik/wikidipendenza.php?force=1 questo è un esempio],una cosa del genere,insomma.[[Utente:Jurassic|Jurassic]] [[Discussioni utente:Jurassic|(msg)]] 16:23,27 mag 2008(CEST) :@[[Utente:Jurassic|Jurassic]]: ora esiste [[toollabs:wikidipendenza/wikiversity]]! --<span style="font-variant:small-caps">[[Utente:Ricordisamoa|<span style="color:#004B70">Ricordi</span>]][[Discussioni utente:Ricordisamoa|<span style="color:#00703E">samoa</span>]]</span> 14:37, 21 lug 2015 (CEST) == Domanda doppia e implementazione == La domanda 86 (controllato sul toollabs) è doppia; un suggerimento che vorrei dare è di rendere automatica la pagina col template quiz --[[Utente:Martinligabue|Martinligabue]] ([[Discussioni utente:Martinligabue|discussioni]]) 18:30, 11 ago 2015 (CEST) == Nunzio Di Giulio == Nunzio Di Giulio === Chiedo cortesemente il ripristino o l'apertura in modalità "Bozza" per la voce "Nunzio Di Giulio", cancellata a fine 2014. Il biografato, Ispettore Superiore della Polizia di Stato in quiescenza ed ex responsabile DIGOS a Cerignola, è una persona anziana non pratica dei mezzi informatici. Desideriamo segnalare che oggi sussistono forti, documentati e rinnovati motivi di rilevanza enciclopedica. La sua figura unisce importanti meriti istituzionali, una solida attività letteraria e una straordinaria storia familiare intergenerazionale legata alle Forze dell'Ordine: 1. ATTIVITÀ LETTERARIA ED EDITORIALE: È autore di numerose pubblicazioni di saggistica, poesia e narrativa edite a Cerignola, tra cui opere centrali per il territorio quali: "La collana di Turchese", "Nina vuole volare", "Mirta", "Il mio nome è Marinela", "L'urlo" e "Il bambino e l'Ofanto". Nel 1995 ha ricevuto il Premio Letterario Internazionale "Cavalieri di San Valentino" (Città di Terni). 2. ONORIFICENZE E CIVILTÀ: È stato insignito del titolo di Ufficiale al Merito della Repubblica Italiana (OMRI), onorificenza consegnata formalmente dalla Prefettura di Barletta-Andria-Trani in data 2 Giugno 2026. È inoltre Cittadino Onorario della Città di Cerignola e Commendatore della Santa Sede dell'Ordine di San Silvestro Papa (Breve pontificio di Papa Giovanni Paolo II). 3. CARRIERA NELLA POLIZIA DI STATO: Ha ricoperto ruoli storici nella gestione della sicurezza nazionale (Servizio d'ordine al processo Brigate Rosse a Torino nel '76, soccorsi per la strage alla stazione di Bologna nell'80, Operazione Vespri Siciliani a Palermo nel '92). 4. CONTINUITÀ GENERAZIONALE NELLO STATO: La sua è una storica famiglia di servitori dello Stato. È figlio di Michele Di Giulio (Medaglia d'Onore alla memoria), padre di Michele Di Giulio (Sovrintendente Capo di P.S., Medaglia di Bronzo al Valor Civile e Cavaliere OMRI) e nonno di Nunzio Di Giulio, attualmente in servizio nell'Arma dei Carabinieri. Alla luce di questa poliedrica figura di poliziotto, scrittore e capostipite di una famiglia interamente dedita alle istituzioni, chiediamo la possibilità di ricostruire la voce in Bozza, disponendo già di tutte le fonti ufficiali cartacee e web. Grazie per la valutazione. [[Speciale:Contributi/&#126;2026-34841-78|&#126;2026-34841-78]] ([[Discussioni utente:&#126;2026-34841-78|discussione]]) 09:40, 13 giu 2026 (CEST) :Ciao @[[Utente:~2026-34841-78|~2026-34841-78]], su questo progetto, controllando i registri, questa pagina non risulta mai creata e/o cancellata; puoi consultare [[Wikiversità:Cos'è Wikiversità|questa pagina]] per più informazioni su questo progetto [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201|Discussione]]) 13:34, 13 giu 2026 (CEST) swleu9qoaiw0kqubqdt5guu24l6kuet Il problema dell'ordinamento 0 8164 283926 279589 2026-06-13T09:55:26Z Avemundi 2081 refusi 283926 wikitext text/x-wiki {{S}} {{vedi anche|Ordinamento (programmazione in C)}} {{Risorsa|tipo=lezione|materia1=Algoritmi e strutture dati}} Un classico problema algoritmico consiste nell'ordinare una sequenza di n elementi. Per poter ordinare tale sequenza è necessario che gli elementi appartengano tutti a un insieme dove è definita una relazione d'ordine; ossia, presi due elementi a scelta, deve sempre essere possibile accertare quale venga prima e quale dopo. Dunque per poter ordinare è necessario che esista: * Una chiave per ogni elemento (ad esempio: la matricola di uno studente, il prezzo di un prodotto, la data di un acquisto ecc..) * Un metodo (che solitamente restituisce un intero) che definisca l'ordine tra due elementi (ad esempio: int strcmp(char *s1, char *s2) per le stringhe in C) = Proprietà degli algoritmi di ordinamento = Esistono alcune proprietà che un algoritmo può presentare che sono molto utili e possono venire sfruttate persino per creare altri algoritmi di ordinamento. == Stabilità == Un algoritmo di ordinamento si dice stabile se in presenza di due elementi con la medesima chiave (due acquisti nella stessa data ad esempio) non modifichi l'ordine con cui i due elementi si presentavano '''prima''' dell'ordinamento. Ad esempio se applicassimo a una lista di persone ordinate per nome, un algoritmo di ordinamento stabile, in modo tale da ordinare le persone in base al cognome, otterremmo un elenco in cui tutte le persone con lo stesso cognome sono ordinate per nome (come nei normali elenchi telefonici). Se tale algoritmo non fosse stabile le persone con lo stesso cognome sarebbero disposte "casualmente" rispetto al nome. Non ha senso parlare di stabilità quando l'elemento rappresenta la propria chiave, ad esempio in un array di interi due '14' non sono distinguibili l'uno dall'altro dunque anche se venissero scambiati non potremmo accorgercene. == Sul posto (o "in loco") == Un algoritmo di ordinamento '''su array''' si dice sul posto se in ogni dato istante al più è allocato un numero costante di variabili, oltre all'array da ordinare: un algoritmo, quindi, è sul posto se non utilizza array di '''supporto'''. Si parla solo di array, perché in una lista concatenata, lo spazio occupato è già doppio rispetto al numero di elementi (un valore per l'elemento e un puntatore per il prossimo). = Algoritmi di ordinamento per confronto = In questa prima parte tratteremo soltanto di algoritmi di ordinamento per confronto, ossia che confrontano tra di loro, due elementi alla volta. Vedremo che, in alcuni casi, non è necessario confrontare gli elementi tra di loro. Ad esempio, come si fa a ordinare un mazzo di 52 carte? == Algoritmi di ordinamento "poco efficienti" == Esistono almeno tre algoritmi molto facili e di complessità temporale <math>\Theta(n^2)</math>: (sotto assunzione di costo uniforme) * Bubble sort * Selection sort * Insert sort Per completezza vedremo brevemente gli ultimi due algoritmi, analizzandone la complessità nei casi ottimo, peggiore e medio (quest'ultimo sotto assunzione di distribuzione uniforme) === Selection Sort === Informalmente l'algoritmo può essere descritto nel seguente modo: si cerca il minimo della sequenza ancora da analizzare e lo si scambia con il primo elemento ancora da analizzare fino a che non resta soltanto un elemento. [[File:AnimazioneSelectionSort.gif|400px|right]] L'animazione "salta" un passaggio, ossia la ricerca del minimo che ha complessità lineare (in tutti i casi: peggiore, migliore o medio). Dunque per ogni elemento (in realtà l'ultimo elemento è già in ordine, dunque '''n-1''' volte) viene ripetuta la ricerca del minimo. La prima volta si cercherà su '''n''' elementi, la seconda su '''n-1''', la terza su '''n-2'''... Dunque la complessità è determinata dalla somma <math>\sum_{i=n}^{1} i = \sum_{i=1}^{n} i = \frac{n(n+1)}{2}</math> Dunque il selection sort ha complessità temporale (per tutti i casi) quadratica. Ossia <math>T_p(n) = T_m(n) = T_a(n) = \Theta(n^2)</math> Dove <math>T_p(n), T_m(n), T_a(n)</math> sono rispettivamente il tempo impiegato nel caso peggiore, migliore e medio. Il selection sort '''non è stabile''' poiché può invertire l'ordine di elementi della stessa chiave (il lettore può provare a trovare un esempio in cui tale algoritmo non sia sul posto). '''È sul posto'''' poiché utilizza solo poche variabili locali (e non è ricorsivo). La proprietà più interessante del selection sort è quella che la parte già "analizzata" è ordinata, infatti da 0 a '''i''' l'array è ordinato, nessun elemento verrà aggiunto in quella parte. Ne diamo una versione in Java: <syntaxhighlight lang="Java"> public static void ssort(int[] a) { int n = a.length; for(int i = 0; i < n-1; i++) { scambia(a, i, indiceMinimoDa(a, i)); } } static int indiceMinimoDa(int[] a, int k) { int iMin = k; for(int i = k+1; i < a.length; i++) if(a[i] < a[iMin]) iMin = i; return iMin; } </syntaxhighlight> === Insertion Sort === [[File:AnimazioneInsertionSort.gif|400px|destra]] L'insertion sort è un algoritmo di ordinamento che si basa sull'inserimento di un elemento all'interno di un array ordinato. Inizialmente si considera il primo elemento come un array ordinato; si prosegue inserendo il secondo elemento al posto giusto: se è maggiore rimane dov'è se è minore (del primo elemento) si scambia. Così avanti come mostra l'animazione [[File:AnimazioneInsertionSort.gif|400px|right]] L'algoritmo di inserimento deve scorrere '''in media''' metà array prima di trovare la posizione giusta per l'elemento da inserire. Nel caso peggiore dovrà scorrerlo tutto fino in fondo (se l'elemento era più piccolo di tutti quelli già inseriti), nel caso migliore dovrà effettuare solo un controllo (se è più grande di tutti quelli già inseriti). La sommatoria che descrive il caso medio è così definita <math>\sum_{i=1}^n \frac{i}{2} = \frac{1}{2}\sum_{i=1}^n i = \frac{n(n+1)}{4}</math> Dunque anch'essa quadratica (analogo discorso per il caso peggiore). Il caso migliore invece (che si presenta quando l'array è già ordinato) è lineare. Dunque l'algoritmo di ordinamento ha la seguente complessità: Caso peggiore: <math>T_p(n) = \Theta(n^2)</math> (Array ordinato all'inverso) Caso medio: <math>T_a(n) = \Theta(n^2)</math> Caso migliore: <math>T_m(n) = \Theta(n)</math> (Array ordinato) Anche in questo caso ne diamo una versione in Java: <syntaxhighlight lang = "Java"> public static void isort(int[] a){ int j; for (int i =1;i<a.length;i++){ int t = a[i]; j=i; while(j>0 && t<a[j-1]){ a[j]=a[j-1]; j--; } a[j]=t; } } </syntaxhighlight> ==Algoritmi di ordinamento efficienti== ===Merge Sort=== Il merge sort è il primo algoritmo d'ordinamento ricorsivo che vediamo. Se ne può dare anche una versione iterativa di cui, però, vedremo soltanto il codice per completezza di trattazione. (Nota lessicale, d'ora in poi utilizzerò il termine "sequenza" sia per indicare array sia liste concatenate; il mergesort può essere applicato, con le dovute precauzioni a entrambi i tipi astratti). Il merge sort è un algoritmo di tipo "Divide et Impera", ossia è diviso in due parti: *"Divide" Dividere la sequenza in due parti (operazione banale per gli array, più complicata per una lista) *"Impera" Fondi le due sequenze in una che contiene tutti gli elementi in ordine. Il mergesort per "fondere" le due sequenze utilizza, ovviamente, l'algoritmo di merge. Lo studente, a questo punto del corso dovrebbe sapere come funziona l'algoritmo di merge, ne faremo comunque una breve analisi. Date due sequenze, S1 e S2, ''ordinate'', per ottenere S3, anch'essa sequenza ''ordinata'' e tale che ogni elemento di S1 e S2 appartenga a S3 si scorrono S1 e S2 inserendo in S3 l'elemento più piccolo tra le due. Una volta terminata S1 (o S2) si completa inserendo in S3 i rimanenti elementi di S2 (o S1). Nel mergesort S1 e S2 sono solitamente due sequenze interne alla sequenza originale, per identificarle servono quindi almeno 3 indici. La sequenza '''target''' deve essere un essere dichiarata e allocata a parte, poiché non è possibile riscrivere gli elementi sulla sequenza di partenza (quantomeno non è facile realizzare un algoritmo senza sequenza di appoggio). Diamo qui un'implementazione del merge in Java <syntaxhighlight lang = "Java"> private static void merge(int[] a, int left, int mid, int right, int[] h) { //a ordinato da [left, mid] e [mid+1, right] int x = left; int y = mid + 1; int n = left; if (left>mid || mid>=right || a[mid] <= a[mid + 1]) { return; } while (x <= mid && y <= right) { if (a[x] <= a[y]) { h[n++] = a[x++]; } else { h[n++] = a[y++]; } } while (x <= mid) { h[n++] = a[x++]; } while (y <= right) { h[n++] = a[y++]; } for (int i = left; i <= right; i++) { a[i] = h[i]; } } </syntaxhighlight> Il mergesort quindi, divide in due la sequenza da ordinare fino a che non rimane solo un elemento (che è ''ordinato''), successivamente fonde i singoli elementi creando gruppi di due, i quali a loro volta verranno fusi tra loro creando la sequenza finale ordinata. In pseudo codice il Mergesort può essere descritto così: MergeSort(sequenza S){ if(lunghezza(S) >1){ S1, S2 <-- Dividi (S) MergeSort(S1) MergeSort(S2) S <-- Merge(S1, S2) } } [[File:MergeSort 2.gif|400px|right]] Analizzando il caso in cui la sequenza è costituita da un array, possiamo notare come il '''lavoro''' sia effettuato esclusivamente dal merging, infatti dividere un array in due significa semplicemente scegliere l'indice medio. In una lista, invece, dividere a metà significa scorrere la lista almeno una volta (facendo saltare alternativamente i puntatori), con complessità lineare. In entrambi i casi, il merge ha una complessità lineare alla somma della lunghezza delle due sequenze (dunque la divisione della lista non influisce asintoticamente sulla complessità dell'algoritmo). Notare inoltre che il merge ha solo un caso migliore (lo studente cerchi di trovarlo dal codice dato sopra), perciò anche il mergesort presenterà solo un caso migliore (un ''array'' ordinato), mentre il caso medio corrisponderà a quello peggiore. L'equazione di ricorrenza (si veda le lezioni sulla ricorsione), per il caso peggiore e medio, sono le seguenti : <math> \left\{ \begin{matrix} T(1) = 1 \\ T(n) = 2(T/2) + n \end{matrix} \right.</math> Possiamo provare a risolverla ''manualmente'' per sostituzioni successive. (Vedremo in seguito il ''master theorem'' per risolvere questo tipo di equazioni). <math>\begin{align} T(n) &= 2T(n/2) + n & T(n/2) = 2T(n/2^2) + (n/2)\\ &= 2 (2 T(n/2^2) + (n/2)) +n =\\ &= 2^2 T(n/2^2) + 2n =\\ &= 2^2(2T(n/2^3) + (n/2^2)) +2n =\\ &= 2^3T(n/2^3) + 3n \\ & \mbox {Dopo k passi:}\\ &= 2^kT(n/2^k) + kn & T(n/2^k) = T(1) \Rightarrow n/2^k = 1 \\ &= n+ (log_2 n) \cdot n & 2^k = n, k = log_2 n\\ &= n(1+log_2 n) = \Theta(n \cdot log_2 n)\end{align}</math> Questa non è una vera e propria ''dimostrazione'' tuttavia, il risultato è giusto e se ne può dare una dimostrazione induttiva ''a posteriori''. Il caso migliore, che si presenta quando l'array è già ordinato, e il merge non fa niente, ha complessità lineare. Dunque il mergesort ha complessità <math>\Theta(n \cdot log(n))</math>: migliore (di gran lunga migliore) di tutti gli algoritmi visti fino a qui. Il mergesort è stabile: nel merge è fondamentale la riga ''if (a[x] <= a[y])'', infatti l'uguale permette di scegliere sempre per primo l'elemento ''di sinistra'', ossia quello che, precedentemente all'ordinamento, veniva prima di un altro elemento, eventualmente con chiave uguale. Il megersort '''non''' è sul posto: oltre a essere ricorsivo (e quindi occupare spazio sullo stack) è necessario un array ausiliare; la complessità spaziale del merge è dunque <math>\Theta(n)</math>. Essendo la versione ricorsiva molto facile da implementare, mostriamo solo la versione iterativa in Java: <syntaxhighlight lang = "Java"> public static void msortI(int[] a){ int i, p,e,m; int N = a.length; int[] helper = new int[N]; i=0; p=1; while(p<N){ while(i<N){ m = (i+p) >=N ? N : i+p; e = (i+2*p)>=N ? N : i+2*p; merge(a,i,m-1,e-1,helper); i+=2*p; } p*=2; i=0; } } </syntaxhighlight> ===Quick Sort=== [[File:Sorting quicksort anim.gif|thumb|Sorting quicksort anim]] Il quickSort è un altro algoritmo di ordinamento ricorsivo che come il merge sort è basato sul paradigma divide et impera. Esso opera nel seguente modo: * '''Divide''': partzionare l'array <math>\begin{align}A[p..r]\end{align}</math> in due sottoarray <math>\begin{align}A[p..q-1]\end{align}</math>e <math>\begin{align}A[q+1..r]\end{align}</math>(eventualmente vuoti) tali che ogni elemento di <math>\begin{align}A[p..q-1]\end{align}</math> sia minore o uguale ad <math>\begin{align}A[q]\end{align}</math> che, a sua volta, è minore o uguale a ogni elemento di <math>\begin{align}A[q+1..r]\end{align}</math>. Calcolare l'indice ''q'' come parte di questa procedura di partizionamento. * '''Impera''': ordinare i due sottoarray <math>\begin{align}A[p..q-1]\end{align}</math> e <math>\begin{align}A[q+1..r]\end{align}</math> chiamando ricorsivamente quicksort. * '''Combina''': Poiché sottoarray sono già ordinati, non occorre alcun lavoro per combinarli: l'intero array <math>\begin{align}A[p..r]\end{align}</math> è ordinato. In pseudocodice la quicksort può essere descritto così: QuickSort(lista A, int p, int r){ if (p < r){ q = Partition(A,p,r) QuickSort(A,p,q-1) QuickSort(A,q+1,r) } } ==== Partizionare l'array==== L'elemento chiave dell'algoritmo è la procedura '''Partition''', che riarrangia il sottoarray <math>\begin{align}A[p..r]\end{align}</math> sul posto. Partition(lista A, int p,int r){ x = A[r] i = p - 1 for (j = p to r-1){ if (A[j] <= x){ i = i+1 scambia A[i] con A[j] } } scambia A[i+1] con A[r] return i+1 } [[File:Partiotion.jpg|miniatura|destra|Funzionamento Procedura Partition]] La procedura partition comincia ponendo come pivot l'ultimo elemento dell'array. Durante l'esecuzione della procedura l'array verrà suddiviso in quattro regioni: * nella prima regione ci sono tutti quegli elementi dell'array che già stati confrontati con pivot e sono minori o uguali del pivot stesso; * nella seconda regione ci sono gli elementi che sono già stati confrontati e sono maggiori del pivot stesso; * nella terza regione sono tutti gli elementi non sono ancora stati confrontati con il pivot; * mentre nella quarta regione vi è il pivot stesso. Si può facilmente intuire che il tempo di esecuzione della procedura Partition è di <math>\begin{align}\Theta(n)\end{align}</math>, dove <math>\begin{align}n = r- p+1\end{align}</math>. ====Prestazioni di QuickSort==== Il tempo di esecuzione di Quicksort dipende dal fatto che il partizionamento sia bilanciato o sbilanciato e questo, sua volta dipende da quali elementi vengono utilizzati per il partizionamento. Se il partizionamento è bilanciato, l'algoritmo viene eseguito con la stessa velocità asintotica di merge sort, se il partizionamento è sbilanciato invece quicksort può essere asintoticamente lento quanto insertion sort. '''Partizionamento nel caso peggiore''' Il comportamento nel caso peggiore di Quicksort si verifica quando la routine di partizionamento produce un sotto problema con ''n-1'' elementi e uno con 0 elementi. Supponiamo che questo sbilanciamento si verifichi in ogni chiamata ricorsiva: il partizionamento costa <math>\begin{align}\Theta(n)\end{align}</math> interni tempo. Poiché per una chiamata ricorsiva su un'altra vuota <math>\begin{align}T(0)=\Theta(1)\end{align}</math> di una ricorrenza per il tempo di esecuzione può essere espressa così: <math>\begin{align} T(n) &= T(n-1) + T(0) + \Theta(n)\\ &= T(n-1)+\Theta(n)\end{align}</math> Intuitivamente, se sommiamo i costi a ogni livello della ricorsione, otteniamo una serie artimetica il cui valore è <math>\begin{align}\Theta(n^2)\end{align}</math>.Quindi se lo sbilanciamento delle due partizioni è massimo a ogni livello ricorsivo dell'algoritmo, il tempo di esecuzione è <math>\begin{align}\Theta(n^2)\end{align}</math>. '''Partizionamento nel caso migliore''' Nel caso di bilanciamento Massimo, Partition produce due sottoproblemi, ciascuno di dimensione non maggiore di <math>\begin{align}n/2\end{align}</math> in questo caso quicksort viene eseguito molto più velocemente. La ricorrenza per il tempo di esecuzione è <math>\begin{align}T(n) <= 2T(n/2)+\Theta(n)\end{align}</math> e utilizzando il teorema dell'esperto si ottiene la soluzione <math>\begin{align}T(n) =\Theta(n \cdot log_2(n))\end{align}</math> '''Partizionamento Bilanciato''' [[File:Albero-ricorsione-quicksort-medio.jpg|400px|destra|thumb|Albero di ricorsione ripartizione 9/10 1/10]] Il tempo di esecuzione del caso meglio di quicksort è molto più vicino al caso migliore che al caso peggiore. Per capire perché dobbiamo comprendere come il bilanciamento del partizionamento influisce sulla ricorrenza che descrive il tempo di esecuzione. Supponiamo per esempio che l'algoritmo di partizionamento produca sempre una ripartizione proporzionale 9 a 1, che a prima vista potrebbe sembrare molto sbilanciata. In questo caso, otteniamo la ricorrenza: <math>\begin{align}T(n) <= T(9n/10)+T(n/10)+cn\end{align}</math> Come si vedono da albero di ricorsione ogni livello dell'albero un costo <math>\begin{align}cn\end{align}</math>, finché non viene raggiunta una condizione al contorno alla profondità <math>\begin{align}log_10(n) = \Theta(log_2(n))\end{align}</math>, dopo la quale livelli hanno al massimo un costo <math>\begin{align}cn\end{align}</math>.La ricorsione termina la profondità <math>\begin{align}log_(10/9)(n)\end{align}</math>. il costo totale di Quicksort è dunque <math>\begin{align}O(n \cdot log_2(n))\end{align}</math>. Pertanto con una ripartizione proporzionale 9 a 1 a ogni livello di ricorsione Quicksort viene eseguito <math>\begin{align}O(n \cdot log_2(n))\end{align}</math>. '''Partizionamento nel caso Medio''' Per quanto riguarda il caso medio dobbiamo fare alcune considerazioni. La prima considerazione è che il costo di Quicksort non dipende dai valori dell'array ma dipende dagli ordini degli elementi.Quando eseguiamo Quicksort su un Array di input casuale,è poco probabile che il partizionamento venga sempre nello stesso modo e a qualsiasi livello, come abbiamo ipotizzato nella nostra analisi informale. E’ logico supporre, invece, che qualche ripartizione sarà ben bilanciata e qualche altra sarà molto sbilanciata. Supponiamo, ai fini dell'intuizione, che le partizioni buone e cattive si alternino nei vari livelli dell'albero e che quelle buone siano le ripartizioni nel caso migliore e quelle cattive siano le ripartizioni nel caso peggiore. La combinazione cattiva seguita dalla ripartizione buona produce tre sottoarray di dimensioni <math>\begin{align}0,(n-1)/2-1\end{align}</math> e <math>\begin{align}(n-1)/2\end{align}</math> con un costo di partizionamento complessivo pari a <math>\begin{align}\Theta(n)+\Theta(n-1) = \Theta(n)\end{align}</math>. Certamente, questo caso non è peggiore di quello del caso peggiore, ovvero un unico livello di partizionamento genera due sottoarray dimensione<math>\begin{align}(n-1)/2\end{align}</math> con un costo di <math>\begin{align}\Theta(n)\end{align}</math>. Ma quest'ultimo caso è bilanciato! Intuitivamente, il costo di <math>\begin{align}\Theta(n-1)\end{align}</math> della ripartizione cattiva può essere assorbito dal costo di <math>\begin{align}\Theta(n)\end{align}</math> della ripartizione buona, quindi la ripartizione risultante è buona. In definitiva, il tempo di esecuzione di Quicksort, quando i livelli si alternano fra buone cattive ripartizioni, è come il tempo di esecuzione nel caso in cui ripartizioni siano soltanto buone: ancora <math>\begin{align}O(n \cdot log_2(n))\end{align}</math>. ====Versione Randomizzata di Quicksort==== Nell'analisi del comportamento di quicksort nel caso meglio, ante abbiamo fatto l'ipotesi che tutte le permutazioni dei numeri di input fossero ugualmente probabili. Nella pratica, però, non possiamo aspettarci che questo sia sempre vero. A volte è possibile aggiungere la randomizzazione a un algoritmo per ottenere una buona prestazione attesa con tutti gli input. Il metodo di randomizzazione che si è adottato detto '''campionamento casuale'''. Anziché utilizzare sempre l'ultimo elemento come pivot, utilizzeremo un elemento scelto a caso dal sottoarray <math>\begin{align}A[p..r]\end{align}</math>. Per fare questo scambieremo l'ultimo con un elemento dell'array con un elemento scelto a caso all'interno dell'array <math>\begin{align}A[p..r]\end{align}</math> questa modifica, con la quale campioniamo a caso un intervallo dell'array ci assicura che l'elemento pivot avrà la stessa possibilità di essere uno dei qualsiasi elementi da sottoarray <math>\begin{align}A[p..r]\end{align}</math>. Poiché il pivot viene scelto a caso ti aspettiamo che la ripartizione della array di input sia ben bilanciata in media. Ecco lo pseudo codice della nuova procedura '''RandomizedPartition''': RandomizedPartition(lista A,int p,int r){ i = Random(p,r) scambia A[r] con A[i] return Partition(A,p,r) } Il nuovo Quicksort chiama '''RandomizedPartition''' anziché '''Partition''': RandomizedQuicksort(lista A, int p,int r){ if(p<r){ q = RandomizedPartition(A,p,r) RandomizedQuicksort(A,p,q-1) RandomizedQuicksort(A,q+1,r) } } '''Tempo di esecuzione Atteso''' Per gli algoritmi randomizzati, dato che loro stessi effettuano delle scelte casuali, si parla di tempo di esecuzione atteso. Si è già data una spiegazione intuitiva sul perché il tempo di esecuzione di '''RandomizedQuicksort''' sia <math>\begin{align}O(n \cdot log_2(n))\end{align}</math>: se, in ogni livello di ricorsione, la ripartizione introdotta da '''RandomizedPartition''' pone una frazione costante qualsiasi degli elementi in un lato della ripartizione, allora l'albero di ricorsione ha profondità <math>\begin{align}\Theta(log_2(n))\end{align}</math> e in ogni livello viene svolto un lavoro di<math>\begin{align}O(n)\end{align}</math>. Anche se aggiungiamo qualche nuovo livello con la ripartizione più sbilanciata possibile tra questi livelli il tempo totale resta: <math>\begin{align}O(n \cdot log_2(n))\end{align}</math>. == Ordinamento in tempo lineare == Gli algoritmi precedentemente introdotti possono ordinare ''n'' numeri nel tempo di <math>O(n \cdot log_2(n))</math>. ''Merge sort'' raggiunge questo limite superiore nel caso peggiore, mentre ''Quick sort'' lo raggiunge nel caso medio. Questi algoritmi condividono un'interessante proprietà: ''l'ordinamento che effettuano è basato soltanti sui confronti fra gli elementi di input''. Infatti questi algoritmi sono detti '''ordinamenti per confronti'''. === Albero di decisione === Gli ordinamenti per confronti possono essere visti astrattamente in termini di '''''alberi di decisione'''''. Un albero di decisione è un albero binario pieno che rappresenta i confronti fra gli elementi che vengono effettuati da un particolare algoritmo di ordinamento che opera su un input di una data dimensione. [[File:Decisione-tree.png|destra|600px|thumb|L'albero di decisione per l'algoritmo inserion sort che opera su tre elementi.]] In un albero di decisione, ogni nodo è annotato con <math>i : j</math> per qualche <math>i</math> e <math>j</math> nell'intervallo <math>1 \le i \le j \le n </math>, dove <math>n</math> è il numero di elementi della sequenza di input. Ogni foglia è annotata con una permutazione dell' array di input: <math> \left \langle \pi(1),\pi(2), ...\pi(n) \right \rangle</math>. L'esecuzione dell'algoritmo di ordinamento consiste nel tracciare un cammino dalla radice dell'albero fino a una foglia. Il sottoalbero sinistro rappresenta il confronto <math> a_i \le a_j </math>, mentre il sottoalbero destro rappresenta il confronto <math> a_i > a_j </math>. Poiché qualsiasi algoritmo di ordinamento corretto deve essere in grado di produrre ogni permutazione del suo input, una condizione necessaria affinché l'algoritmo di ordinamento sia corretto è che che ciascuna delle <math>n!</math> permutazioni del suo input di <math>n</math> elementi appaia come una delle foglie dell'albero di decisione, e che ciascuna di queste foglie sia raggiungibile dalla radice attraverso un percorso che corrisponde all'effettiva esecuzione dell'algoritmo di ordinamento. === Limite inferiore per l'ordinamento per confronti === La lunghezza del percorso più lungo dalla radice di un albero di decisione a una delle sue foglie raggiungibili rappresenta il numero di confronti che svolge il corrispondente algoritmo nel caso peggiore. Di conseguenza, il numero di confronti nel caso peggiore per un dato algoritmo di ordinamento è data dall'altezza del suo albero di decisione. '''Teorema''' Qualsiasi algoritmo di ordinamento per confronti richiede <math>\Omega(n \cdot log_2 n )</math> confronti nel caso peggiore. '''Dimostrazione''' Consideriamo l'albero di decisione, di un algoritmo di ordinamento, dove ogni permutazione dell'input appare come foglia raggiungibile. L'albero di decisione possiede un'altezza ''h'' e ha ''n'' foglie raggiungibili, quindi corrisponderà a un ordinamento per confronti di ''n'' elementi. Poiché ciascuna delle <math>n!</math> permutazioni dell'input compare in una foglia, si ha <math> n! \le l</math>. Dal momento che un albero binario di altezza ''h'' non ha più di <math>2^h</math> foglie, si ha <math> n! \le l \le 2^h </math> Prendendo i logaritmi, questa relazione implica che <math>\begin{align} h &\ge log_2(n!) \mbox{ (perché la funzione log è monotonicamente crescente)}\\ &= \Omega(n \cdot log_2(n)) \mbox{ (utilizzando l'approssimazione di Stirling)}\end{align}</math> === Counting Sort === L'algoritmo Counting sort è un algoritmo di ordinamento che suppone che ciascuno degli ''n'' elementi di input sia un numero intero compreso nell'intervallo da 0 a ''k'', per qualche intero ''k''. Counting sort determina, utilizzando un array di appoggio, per ogni elemento di input ''x'', il numero di elementi minori di ''x''. Esso usa questa informazione per inserire l'elemento ''x'' direttamente nella sua posizione nell'array di output. [[File:Counting Sort Animation.gif|destra|600px|thumb| Counting Sort Animation]] ==== Funzionamento ==== Piuttosto che utilizzare i confronti per ordinare l'array, counting sort utilizza un array di appoggio '''C''' di dimensione ''k'' a cui inizialmente assegnerà le occorrenze dell'i-esimo numero dell'array da ordinare. Utilizzando queste informazioni determina per ogni <math> i = 1,...,k</math> quanti elementi di input sono minori o uguali a l'i-esimo elemento, mantenendo la somma corrente in '''C'''. Infine scorrerà l'array di input ''dalla fine all'inizio'' e posizionerà i valori da ordinare in '''B''', utilizzando il vettore '''C'''. Un'importante proprietà di counting sort è la '''''stabilità''''': i numeri con lo stesso valore si presentano nell'array di output nello stesso ordine in cui si trovavano nell'array di input. ==== Pseudo codice ==== countingSort(lista A, lista B,int k){ C = new Array(k) //Inizializzo C for i = 0 to k C[i] = 0 //Conto le occorenze del j-esimo elemento nell'array A for j = 1 to A.length C[A[j]] = C[A[j]] + 1 //Determino quanti sono gli elementi di A <= del i-esimo elemento for i = 1 to k C[i] = C[i] + 1 //Riordino l'array a utilizzando l'array C for j = A.length downto 1 B[C[A[j]]] = A[j] C[A[j]] = C[A[j]] - 1 } ==== Prestazioni di Counting sort ==== Notiamo che l'algoritmo esegue 4 cicli for: il primo ciclo for impiega un tempo di <math>\Theta(k)</math>, il secondo ciclo impiega un tempo di <math>\Theta(n)</math>, il terzo ciclo impiega un tempo di <math>\Theta(k)</math> mentre il quarto impiega un tempo di <math>\Theta(n)</math>. Quindi il tempo totale è <math>\Theta(k + n)</math>. Di solito counting sort viene utilizzato quando <math>k = O(n)</math> (cioè quando k è dello stesso ordine di grandezza di n), dove il tempo di esecuzione diventa <math>\Theta(n)</math>. Come si può vedere counting sort batte il limite inferiore <math>\Omega(n \cdot log_2(n))</math> dimostrato precedentemente. Questo è dovuto al fatto che l'algoritmo non effettua nessun tipo di confronto, piuttosto usa i valori effettivi degli elementi come indici di un array. Il limite inferiore <math>\Omega(n \cdot log_2(n))</math> non vale se ci si allontana dal modello di ordinamento per confronti. '''Quando Counting sort è inefficiente''' Quando <math>k</math> risulta essere molto più grande della dimensione dell'array <math>n</math>, l'algoritmo non risulta essere efficiente dato che perderà molto tempo nel primo e terzo ciclo. In particolare se <math>k = O(n^3)</math> il tempo di esecuzione di counting sort risulta essere peggiore del tempo di esecuzione di algoritmi come '''''Bubble sort''''' o '''''Selection sort'''''. === Radix sort === '''Radix Sort''' è un algoritmo di ordinamento non in loco. L'algoritmo utilizza un procedimento contro intuitivo per l'uomo, ma più facilmente implementabile. Esegue gli ordinamenti per posizione della cifra, ma partendo dalla cifra meno significativa. E’ essenziale, però che gli ordinamenti delle cifre in questo algoritmo siano stabili, altrimenti radix Sort non ordinerà la lista. ==== Pseudo codice ==== radixSort(lista A, int d){ //d è in numero massimo di cifre da ordinare for i = 1 to d usa un ordinamento stabile per ordinare l'array A sulla cifra i } ==== Prestazione di Radix sort ==== Dati <math>n</math> numeri di <math>d</math> cifre, dove ogni cifra può avere fino a <math>k</math> valori possibili, la procedura Radix Sort, se utilizza Counting Sort come algoritmo di ordinamento stabile, ordina correttamente i numeri nel tempo di <math>\Theta(d(n + k)) </math>. Quando <math>d</math> è costante e <math>k = O(n) </math>, radix Sort viene eseguito un tempo lineare. Più In generale, abbiamo una certa flessibilità sul modo in cui ripartire le singole chiavi in cifre. === Bucket Sort === '''Bucket sort''' è un algoritmo di ordinamento in loco che presuppone che un input sia estratto da una distribuzione uniforme. Come Counting sort, Bucket sort è veloce perché fa un'ipotesi sull'input: esso suppone che gli input sia generato da un processo casuale che distribuisce gli elementi '''''uniformemente''''' e '''''indipendentemente''''' nell'intervallo <math>[0,1)</math>. ==== Funzionamento ==== Bucket Sort divide l'intervallo <math>[0,1)</math> in <math>n</math> sottointervalli della stessa dimensione chiamati '''bucket'''. Il primo passo che l'algoritmo compie è di porre ciascun elemento dell'array nel bucket di appartenenza; successivamente, utilizzando un altro algoritmo di ordinamento, ordina tutti i bucket presenti; l'ultimo passo sarà quello di concatenare ciascun bucket per ottenere l’array ordinato. Dato che l'algoritmo assume che l'input sia uniformemente e indipendentemente distribuito nell’intervallo <math>[0,1)</math> non si aspetta che molti numeri vanno a finire allo stesso bucket, e ciò contribuisce a rendere Bucket sort un algoritmo molto efficiente. ==== Pseudocodice ==== bucketSort(A,n) B = new Array(n-1) //Crea buckets for i = 0 to n B[i] = [] //Inserisce ciascun elemento nel proprio bucket di appartenenza for j = 0 to A.length index_bucket = Math.floor(A[j]) B[index_bucket = A[j] //Ordina i singoli Bucket for i = 0 to n insertionSort(B[i]) //concatena i bucket k = 0 for i = 0 to n for j = 0 to B[i].length A[k] = B[i][j] k++ return A ==== Prestazioni di Bucket sort ==== Per il tempo di esecuzione, notiamo che l'algoritmo possiede 3 cicli for richiedono un tempo di <math>O(n)</math> è nel caso peggiore. Resta da valutare il tempo totale richiesto dalla <math>n</math> chiamate a insertion Sort. 14bhvibtg7oi85t3mle77bby6wio2wy Apparato digerente (scuola media) 0 31397 283933 252751 2026-06-13T09:57:28Z Avemundi 2081 refusi 283933 wikitext text/x-wiki {{Risorsa|tipo=lezione|materia1=Scienze per la scuola media 2|materia2=|materia3=|materia4=|materia5=|programma2=|programma3=|programma4=}} ==La bocca== La digestione degli alimenti comincia nella bocca, che costituisce l’apertura iniziale dell’apparato digerente. ===Come è fatta=== La bocca è limitata dalle labbra, dal palato e dal pavimento boccale, al suo interno sono inserite la lingua e due arcate dentarie e sboccano le ghiandole salivari. Qua il cibo viene triturato dai denti impastato dalla lingua e bagnato dalla saliva così viene trasformato in bolo alimentare pronto per eseguire il suo viaggio. Le ghiandole salivari riversano nella bocca il loro prodotto, la saliva, composta da acqua, muco e da enzimi tra cui la ptialina e la lisozima. La ptialina deve favorire la scomposizione degli amidi in zuccheri mentre la lisozima ha funzione antibatterica. La digestione nella bocca si divide in 2 parti: funzione meccanica: avviene attraverso la masticazione funzione chimica: enzimatica+saliva la saliva impasta ciò che ho masticato per formare il bolo alimentare. Nella saliva è presente anche un antibatterico naturale, il lisozima. ===I denti=== I denti sono infissi sulle due arcate formate da mandibola e mascella ad essi è affidato in compito della masticazione. I denti diversi per forma e funzione, presentano tutti la stessa struttura. ==Lo stomaco== Lo stomaco è rivestito da una spessa mucosa e assomiglia a una sacca ripiegata, che dilatandosi raggiunge la capacità di un litro e mezzo circa. Si trova nella parte alta dell’addome, a sinistra, e confina con fegato, milza, pancreas, diaframma e parte del duodeno. Lo stomaco assume diverse forme a seconda delle quantità di cibo contenuto e dalla posizione in cui si trova il corpo. Lo stomaco viene suddiviso anatomicamente nelle seguenti regioni: * il fondo, disposto superiormente a destra dello stomaco ed a sinistra della giunzione tra esofago e stomaco; * il cardias, è tra l’esofago e il fondo; * il corpo, che rappresenta la porzione maggiore dello stomaco e che si trova tra il fondo e l'antro; * l'antro, porzione finale dello stomaco, che si estende dalla piccola curvatura sino al piloro; * il piloro, che rappresenta il confine tra lo stomaco ed il duodeno. ===Fisiologia dell'organo=== Lo stomaco è l'organo che riceve dall'esofago il cibo introdotto attraverso la bocca. Al suo interno hanno inizio i processi digestivi, resi possibili dalla presenza di enzimi digestivi. Da qui il cibo passa poi nell'intestino, dove i processi digestivi potranno proseguire permettendo l'assorbimento dei nutrienti presenti negli alimenti ingeriti. Lo stomaco prosegue la digestione degli alimenti sia meccanicamente, sia chimicamente. ====L'azione meccanica==== Lo stomaco è ricoperto da fasci muscolari che si contraggono e aiutano il chimo ad essere digerito dagli enzimi. * Il cardias è un muscolo che controlla il passaggio del bolo dall’esofago allo stomaco, esse apre e chiude il condotto come una valvola. * Il piloro è un muscolo che si apre in maniera indeterminata per far passare il chimo nell’intestino ====L'azione chimica==== * il succo gastrico prodotto dalle ghiandole della mucosa interna, è composto da acqua, enzimi e acido cloridrico * l'acido cloridrico crea un ambiente acido dove i batteri non possono vivere * permette l'azione della pepsina, spezzando le lunghe catene di aminoacidi in peptoni. ==Il fegato== Il fegato è la più grossa ghiandola del corpo umano, e può raggiungere il peso di 1,5 chilogrammi; è diviso in due lobi:il lobo destro è il più voluminoso dell'organo, ha forma cupolare e comprende almeno in parte tutte le facce del fegato;il lobo sinistro, invece, ha volume pari a circa la metà del destro, è più sottile, ed ha forma triangolare. Si trova sotto le costole nella parte destra dell' addome.È collegato all'apparato digerente e svolge numerose funzioni non solo utili alla digestione degli alimenti, ma anche alla difesa dell'organismo e all'eliminazione delle sostanze tossiche. Ed è per tutte queste funzioni che è soprannominato "laboratorio chimico dell'organismo". ==Le sue funzioni== * Produce la bile che viene riversata nell'intestino tenue e completa la digestione dei lipidi; * È coinvolto nel metabolismo delle proteine e ne regola il livello nel sangue; * Libera il ferro dall'emoglobina dei globuli rossi. ==Pancreas== Il pancreas è una grossa ghiandola situata nell'addome a sinistra, sotto lo stomaco e sopra il colon traverso, all'altezza della prima e seconda vertebra lombare, in corrispondenza del duodeno. Nei soggetti giovani raggiunge un peso di circa 80-100 grammi, che tende a ridursi con l'avanzare dell'età; la lunghezza complessiva si colloca intorno ai 15 centimetri. il pancreas viene normalmente suddiviso in tre porzioni, che prendono il nome di testa, corpo e coda del pancreas. La testa rappresenta la sua parte più grossa e spessa, e prende contatto con l'ansa duodenale. Il corpo, leggermente obliquo dal basso verso l’alto, rappresenta il segmento disposto frontalmente rispetto all’aorta e alla vena cava. La coda del pancreas, infine, rappresenta il tratto assottigliato con cui termina quest'organo ghiandolare. ===Funzioni del pancreas=== *Completa la digestione degli zuccheri producendo il succo pancreatico, che viene riversato nell’intestino tenue *Produce il succo pancreatico *Produce ormoni che regolano il livello di glucosio nel sangue. I due ormoni nel pancreas sono: INSULINA e GLUCAGONE. Insulina → Aiuta: *il passaggio del glucosio (zuccheri) dal sangue alle cellule e abbassa la glicemia. *il passaggio degli aminoacidi (molecole organiche) dal sangue alle cellule. *il passaggio di potassio all'interno delle cellule. *l'uso del glucosio per la produzione di energia. *la produzione endogena di colesterolo. Glucagone → Il glucagone è un ormone peptidico secreto dal pancreas, per la precisione dalle cellule delle isole di Langerhans, che ha come bersaglio principale alcune cellule del fegato; ===Malattie del pancreas=== Il pancreas può andare incontro a disfunzioni che sono causa di una malattia, il DIABETE, che colpisce un’alta percentuale di persone. Il diabete è dovuto a una produzione insufficiente di insulina; quando questa scarseggia, la concentrazione di glucosio nel sangue aumenta fino a livelli pericolosi, causando l’IPERGLICEMIA. Il diabete genera disturbi di varia natura con conseguenze molto gravi. L’insulina è l’ormone, prodotto dal pancreas, che consente al glucosio l’ingresso nelle cellule e il suo conseguente utilizzo come fonte energetica. Quando questo meccanismo è alterato, il glucosio si accumula nel circolo sanguigno. Esistono 3 tipi di diabete: *Diabete tipo 1→ Riguarda circa il 10% delle persone con diabete e in genere insorge nell’infanzia o nell’adolescenza. Nel diabete tipo 1, il pancreas non produce insulina a causa della distruzione delle cellule ß che producono questo ormone: è quindi necessario che essa venga iniettata ogni giorno e per tutta la vita. La causa del diabete di tipo 1 è sconosciuta, ma caratteristica è la presenza nel sangue di anticorpi diretti. *Diabete di tipo 2→ È la forma più comune di diabete e rappresenta circa il 90% dei casi di questa malattia. La causa è ancora ignota, anche se è certo che il pancreas è in grado di produrre insulina, ma le cellule dell’organismo non riescono poi a utilizzarla. In genere questa malattia si manifesta dopo i 30 anni e molti fattori messi insieme contribuiscono alla manifestazione del diabete. *Diabete gestazionale→ Si definisce diabete gestazionale ogni situazione in cui si misura un elevato livello di glucosio circolante per la prima volta in gravidanza. Questa condizione si verifica nel 4% circa delle gravidanze. ==Intestino== L’intestino è l’ultima parte dell’apparato digerente e si divide in CRASSO e TENUE, che a loro volta si dividono in tre parti. L’intestino crasso si divide in cieco, colon e retto, mentre, l’intestino tenue si divide in ileo, digiuno e duodeno. Il piloro è un muscolo ad anello che si apre in maniera intermittente per lasciare passare il chimo nell’intestino. ===Anatomia dell'intestino=== Intestino tenue *Costituisce l’intestino insieme al crasso ed è la parte più lunga di tutto l’apparato digerente, ma ha un diametro minore rispetto all’intestino crasso; è nell’intestino tenue che si completa la digestione. *È ripiegato più volte su se stesso e, come l’intestino crasso, è avvolto da una membrana, il PERITONEO. Intestino crasso *Costituisce l’intestino insieme al tenue, Ha un diametro maggiore ed ha una lunghezza minore rispetto a quello tenue, ed è disposto a cornice sui lati della cavità addominale. ==Fisiologia== ===Intestino tenue=== Svolge l’assorbimento e l’assimilazione: # Assorbimento→ I villi intestinali sono delle protuberanze che ricoprono la mucosa interna dell’intestino. Per ogni villo intestinale ci sono due tipi di capillari, Capillari sanguigni e capillari linfatici. I capillari sanguigni assorbono: * MONOSACCARIDI * GLICERINA * AMINOACIDI. I capillari linfatici assorbono: ACIDI GRASSI. ===Intestino crasso=== Svolge sia l’assorbimento sia l’assimilazione: # Assorbimento→ assorbe vitamine,sali minerali e acqua, che sono micromolecole e che quindi non devono essere digerite. # Assimilazione→ processo in cui le sostanze digerite vengono riassemblate per riformare le macromolecole. La parte iniziale dell’intestino crasso è il cieco, che termina con l’appendice vermiforme; mentre subito dopo c’è il colon, e a seguire il retto, che è la parte finale di tutto l’apparato digerente. ==Assorbimento e assimilazione== L' assorbimento è il processo in cui le sostanze vengono assorbite dall' intestino.<br> L’ assimilazione è il processo in cui le sostanze digerite vengono riassemblate per formare le macromolecole. ===Cosa diventano le sostanze digerite e assorbite=== *aminoacidi → proteine specifiche dell' organismo *glucosio → energia (respirazione cellulare) *glicerina e acidi grassi → grassi tipici dell' organismo <br> L’ assimilazione avviene nelle cellule. ===Che cosa accade nell'assorbimento=== ====Intestino tenue==== I villi intestinali assorbono le sostanze digerite come: * monosaccaridi, * glicerina; * aminoacidi. All’ interno di ciascun villo intestinale c’è una piccola rete di capillari sanguigni e di un vaso linfatico: il vaso chilifero. I monosaccaridi, gli aminoacidi e la glicerina passano direttamente nei capillari sanguigni, da questi poi nella vena porta che li trasferisce al fegato prima che che siano immessi in circolazione. Gli acidi grassi sono invece assorbiti dal vaso chilifero e concorrono a formare la linfa, che risale lungo il dotto toracico e sbocca nella vena succlavia sinistra, per essere poi riversata nella circolazione sanguigna. <br> ====Intestino crasso==== Svolge la funzione di assorbire le vitamine, i sali minerali e l’acqua. Inoltre esso accumula le sostanze che non possono essere assorbite e le elimina sotto forma di feci attraverso l’ano. Al suo interno è presente la flora intestinale, composta da numerose colonie che, oltre ad agire sulle sostanze non assorbite, producono alcune vitamine (come ad esempio le vitamine del gruppo B e la K). pztjt7nrewm26runyxjwkf2fzvr6cr0 Seguire la linea (scuola media) 0 36549 283897 273429 2026-06-13T09:42:53Z ~2026-34893-85 46714 283897 wikitext text/x-wiki In questo tutorial vedremo come far seguire una figga dal robot mBot2. La programmazione del robot sarà fatta a blocchi con [https://ide.mblock.cc/ mBlock5]. [[File:MblockOnline.png|centro|800px||mblock online]] {{-}} ==Oggetti necessari== * Un robot mBot2. * Un cavo USB, tipo C, per permettere un collegamento tra il robot e il proprio PC. * Sull'mBot2 è montato il sensore quad color RGB, sotto il robot nella parte anteriore. Il sensore quad color è una evoluzione del sensore seguilinea, presente sull'mBot1. * Un foglio su cui tracciare una linea da far percorrere. Nella confezione dell'mbot2 è presente una pista di prova. * Un pc con installato il programma [https://mblock.makeblock.com/en/ mBlock 5], oppure, per linux, con chrome per utilizzare [https://ide.mblock.cc/ mBlock5] online, oppure un teblet Android o un iOS con la app mBlock5. ==Programma da utilizzare== Come già citato il programma consigliato è [https://ide.mblock.cc/ mBlock5], oltre ad essere ottimizzato per la gestione a blocchi, permette, per chi è più navigato nel linguaggio informatico, di programmare in [[Python|Python]]. [https://ide.mblock.cc/ mBlock5] può essere scaricato da [https://mblock.makeblock.com/en/ mblock.makeblock.com] ed installato sui pc con sistemi operativi windows e macOS o come app su Android o iOS, mentre su linux si può usare online con Chrome da [https://ide.mblock.cc/ ide.mblcok.cc]. Per interfacciare, nel caso di linux solo via usb, lo mBot2 con il pc si deve seguire la procedura per installare mlink spigata qui [https://it.wikibooks.org/wiki/Software_libero_a_scuola/Mbot2 Software libero a scuola/Mbot2]. L'mbot2 si può programmare in modalità live, cioè facendogli eseguire direttamente il codice assemblato sul device, oppure caricando (upload) il codice sul robot. Nel caso di una connessione via usb il filo potrebbe rivelarsi un impedimento per la modalità ''live''. ==Estensioni necessarie== Per scrivere il codice del programma Segui linea, si devono aggiungere due estensioni: [[File:MblockExtensionmBot2Shield.png|thumb|150px|sinistra|mBot2 Shield]] * ''mBot2 shield'' che aggiunge due insieme di blocchi che servono a far muovere il robot e a governare i motori. Nela barra dei blocchi compariranno le sezioni ** ''mBot2 Chassis'' ** ''mbot2 Extension Port'' entrambe con blocchi di colore blu.<br/> [https://www.yuque.com/makeblock-help-center-en/cyberpi/mbot2-shield Manuale mBot2 shield] {{-}} [[File:MblockExtensionQuadRGBSensor.png|thumb|150px|sinistra|Quad RGB Sensor]] * ''Quad RGB Sensor (beta)'' che aggiunge un insieme di blocchi per rilevare sfondi, linee e colori ** ''Quad RGB Sensor'' con blocchi di colore verde<br/> [https://www.yuque.com/makeblock-help-center-en/cyberpi/quad_rgb_sensor Manuale mBot2 RGB sensor] {{-}} entrambe le estensioni, così come tutte le altre, si aggiungono cliccando sulla voce ''extension'' in fondo alla barra dei blocchi {{-}} ==Osservazioni iniziali== A bordo dell'mbot2 ci sono alcuni programmi preinstallati, tra questi c'è un ''seguilinea'': mbot2_demo1. <gallery mode="packed" widths=200px heights=200px perrow=5 caption="mbot2_demo1 ''seguilinea''" > File:Mbot2DemoSeguilinea.jpg|Mbot2 Demo Segui Linea File:Mbot2SeguiLineaTasti.jpg|Mbot2 Segui Linea Tasti </gallery> ''Video mbot2_demo1'': {{YouTube|autore = mattruffoni|minuto =|secondo =|accesso =|id = YbH6mNsWM14|titolo = mbot2 line follower demo|data = 21 ago 2023 }}<br/> L'obbiettivo di questo tutorial è quello di comporre il codice a blocchi necessario per far muovere l'mbot2 come nel video. ==Un primo codice== Dopo aver letto la [https://www.yuque.com/makeblock-help-center-en/cyberpi/quad_rgb_sensor guida del RGB Sensor] ed aver individuato come seguilinea i sensori L1 e R1 abbiamo si può procedere a comporre questo codice. [[File:Mbot2mblockCodiceSeguiLineaRudimentale.png|600px|centro|Mbot2mblockCodiceSeguiLineaRudimentale]] {{-}} ===Modalità live o upload=== [[File:LineFollowerMBot2.jpg|sinistra|150px|mBot2 mentre segue la linea.]] Purtroppo, e dopo averlo verificato più volte, ci si accorge che il robot ha comportamenti diversi in modalità live, non è abbastanza reattivo nei cambi di direzione e quindi non segue la linea, piuttosto che se il codice viene caricato, ''upload'', sul robot, nel qual caso, seppure in modo non proprio fluido, il codice caricato fa in modo che il robot segua la linea. {{-}} ===Il risultato=== ''Video Mbot2 mblock segui linea rudimentale'': {{YouTube|autore = mattruffoni|minuto =|secondo =|accesso =|id = sH6cKUNUV7g|titolo = Seguilinea rudimentale|data = 20 ago 2023 }}<br/> {{-}} ==Note== ==Bibliografia== ==Collegamenti esterni== * [https://education.makeblock.com/mbot2/ ''mBot2 - Makeblock''] * [https://ide.mblock.cc/ ''mBlock5''] * [https://www.yuque.com/makeblock-help-center-en/cyberpi/mbot2-shield Manuale mBot2 shield] * [https://www.yuque.com/makeblock-help-center-en/cyberpi/quad_rgb_sensor Manuale mBot2 RGB sensor] * [https://education.makeblock.com/help/mblock-block-based-device-cyberpi-extension-quad-rgb-sensor/ ''Aiuto per i sensori quad RGB''] 506s3kxhk4tty7kn8t9eqzaacqg9ktx 283898 283897 2026-06-13T09:43:01Z Quinlan83 35690 Reverted edits by [[Special:Contribs/~2026-34893-85|~2026-34893-85]] ([[User talk:~2026-34893-85|talk]]) to last version by Mattruffoni: reverting vandalism 273429 wikitext text/x-wiki In questo tutorial vedremo come far seguire una linea dal robot mBot2. La programmazione del robot sarà fatta a blocchi con [https://ide.mblock.cc/ mBlock5]. [[File:MblockOnline.png|centro|800px||mblock online]] {{-}} ==Oggetti necessari== * Un robot mBot2. * Un cavo USB, tipo C, per permettere un collegamento tra il robot e il proprio PC. * Sull'mBot2 è montato il sensore quad color RGB, sotto il robot nella parte anteriore. Il sensore quad color è una evoluzione del sensore seguilinea, presente sull'mBot1. * Un foglio su cui tracciare una linea da far percorrere. Nella confezione dell'mbot2 è presente una pista di prova. * Un pc con installato il programma [https://mblock.makeblock.com/en/ mBlock 5], oppure, per linux, con chrome per utilizzare [https://ide.mblock.cc/ mBlock5] online, oppure un teblet Android o un iOS con la app mBlock5. ==Programma da utilizzare== Come già citato il programma consigliato è [https://ide.mblock.cc/ mBlock5], oltre ad essere ottimizzato per la gestione a blocchi, permette, per chi è più navigato nel linguaggio informatico, di programmare in [[Python|Python]]. [https://ide.mblock.cc/ mBlock5] può essere scaricato da [https://mblock.makeblock.com/en/ mblock.makeblock.com] ed installato sui pc con sistemi operativi windows e macOS o come app su Android o iOS, mentre su linux si può usare online con Chrome da [https://ide.mblock.cc/ ide.mblcok.cc]. Per interfacciare, nel caso di linux solo via usb, lo mBot2 con il pc si deve seguire la procedura per installare mlink spigata qui [https://it.wikibooks.org/wiki/Software_libero_a_scuola/Mbot2 Software libero a scuola/Mbot2]. L'mbot2 si può programmare in modalità live, cioè facendogli eseguire direttamente il codice assemblato sul device, oppure caricando (upload) il codice sul robot. Nel caso di una connessione via usb il filo potrebbe rivelarsi un impedimento per la modalità ''live''. ==Estensioni necessarie== Per scrivere il codice del programma Segui linea, si devono aggiungere due estensioni: [[File:MblockExtensionmBot2Shield.png|thumb|150px|sinistra|mBot2 Shield]] * ''mBot2 shield'' che aggiunge due insieme di blocchi che servono a far muovere il robot e a governare i motori. Nela barra dei blocchi compariranno le sezioni ** ''mBot2 Chassis'' ** ''mbot2 Extension Port'' entrambe con blocchi di colore blu.<br/> [https://www.yuque.com/makeblock-help-center-en/cyberpi/mbot2-shield Manuale mBot2 shield] {{-}} [[File:MblockExtensionQuadRGBSensor.png|thumb|150px|sinistra|Quad RGB Sensor]] * ''Quad RGB Sensor (beta)'' che aggiunge un insieme di blocchi per rilevare sfondi, linee e colori ** ''Quad RGB Sensor'' con blocchi di colore verde<br/> [https://www.yuque.com/makeblock-help-center-en/cyberpi/quad_rgb_sensor Manuale mBot2 RGB sensor] {{-}} entrambe le estensioni, così come tutte le altre, si aggiungono cliccando sulla voce ''extension'' in fondo alla barra dei blocchi {{-}} ==Osservazioni iniziali== A bordo dell'mbot2 ci sono alcuni programmi preinstallati, tra questi c'è un ''seguilinea'': mbot2_demo1. <gallery mode="packed" widths=200px heights=200px perrow=5 caption="mbot2_demo1 ''seguilinea''" > File:Mbot2DemoSeguilinea.jpg|Mbot2 Demo Segui Linea File:Mbot2SeguiLineaTasti.jpg|Mbot2 Segui Linea Tasti </gallery> ''Video mbot2_demo1'': {{YouTube|autore = mattruffoni|minuto =|secondo =|accesso =|id = YbH6mNsWM14|titolo = mbot2 line follower demo|data = 21 ago 2023 }}<br/> L'obbiettivo di questo tutorial è quello di comporre il codice a blocchi necessario per far muovere l'mbot2 come nel video. ==Un primo codice== Dopo aver letto la [https://www.yuque.com/makeblock-help-center-en/cyberpi/quad_rgb_sensor guida del RGB Sensor] ed aver individuato come seguilinea i sensori L1 e R1 abbiamo si può procedere a comporre questo codice. [[File:Mbot2mblockCodiceSeguiLineaRudimentale.png|600px|centro|Mbot2mblockCodiceSeguiLineaRudimentale]] {{-}} ===Modalità live o upload=== [[File:LineFollowerMBot2.jpg|sinistra|150px|mBot2 mentre segue la linea.]] Purtroppo, e dopo averlo verificato più volte, ci si accorge che il robot ha comportamenti diversi in modalità live, non è abbastanza reattivo nei cambi di direzione e quindi non segue la linea, piuttosto che se il codice viene caricato, ''upload'', sul robot, nel qual caso, seppure in modo non proprio fluido, il codice caricato fa in modo che il robot segua la linea. {{-}} ===Il risultato=== ''Video Mbot2 mblock segui linea rudimentale'': {{YouTube|autore = mattruffoni|minuto =|secondo =|accesso =|id = sH6cKUNUV7g|titolo = Seguilinea rudimentale|data = 20 ago 2023 }}<br/> {{-}} ==Note== ==Bibliografia== ==Collegamenti esterni== * [https://education.makeblock.com/mbot2/ ''mBot2 - Makeblock''] * [https://ide.mblock.cc/ ''mBlock5''] * [https://www.yuque.com/makeblock-help-center-en/cyberpi/mbot2-shield Manuale mBot2 shield] * [https://www.yuque.com/makeblock-help-center-en/cyberpi/quad_rgb_sensor Manuale mBot2 RGB sensor] * [https://education.makeblock.com/help/mblock-block-based-device-cyberpi-extension-quad-rgb-sensor/ ''Aiuto per i sensori quad RGB''] 1ukm415vcgeipoflc7xx4gnoz9sy0m4 Discussioni utente:~2026-34105-31 3 37610 283888 2026-06-12T17:29:33Z Matt6201 46707 /* Quiz sull'idrografia (prima media) */ nuova sezione 283888 wikitext text/x-wiki == Quiz sull'idrografia (prima media) == {{test}} [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201|Discussione]]) 19:29, 12 giu 2026 (CEST) ng4tjgoqbcodt4hkkb2vv7rfnvq333b Discussioni utente:~2026-29058-18 3 37611 283890 2026-06-12T18:06:19Z Matt6201 46707 /* Avviso */ nuova sezione 283890 wikitext text/x-wiki == Avviso == {{vandalismo}} [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201|Discussione]]) 20:06, 12 giu 2026 (CEST) jj5mu4ocwn7uutqchfadww573vplw1g 283895 283890 2026-06-13T09:41:22Z ~2026-34893-85 46714 /* Avviso */ Risposta 283895 wikitext text/x-wiki == Avviso == {{vandalismo}} [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201|Discussione]]) 20:06, 12 giu 2026 (CEST) :Zitto pompi naro [[Speciale:Contributi/&#126;2026-34893-85|&#126;2026-34893-85]] ([[Discussioni utente:&#126;2026-34893-85|discussione]]) 11:41, 13 giu 2026 (CEST) i2ux2e5zkvzwvuvnz0it2g4slb4cfv5 283927 283895 2026-06-13T09:55:48Z Matt6201 46707 Annullata la modifica [[Special:Diff/283895|283895]] di [[Special:Contributions/~2026-34893-85|~2026-34893-85]] ([[User talk:~2026-34893-85|discussione]]) 283927 wikitext text/x-wiki == Avviso == {{vandalismo}} [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201|Discussione]]) 20:06, 12 giu 2026 (CEST) jj5mu4ocwn7uutqchfadww573vplw1g 283928 283927 2026-06-13T09:55:57Z Quinlan83 35690 Annullata la modifica di [[Special:Contributions/Matt6201|Matt6201]] ([[User talk:Matt6201|discussione]]), riportata alla versione precedente di [[User:~2026-34893-85|~2026-34893-85]] 283895 wikitext text/x-wiki == Avviso == {{vandalismo}} [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201|Discussione]]) 20:06, 12 giu 2026 (CEST) :Zitto pompi naro [[Speciale:Contributi/&#126;2026-34893-85|&#126;2026-34893-85]] ([[Discussioni utente:&#126;2026-34893-85|discussione]]) 11:41, 13 giu 2026 (CEST) i2ux2e5zkvzwvuvnz0it2g4slb4cfv5 283929 283928 2026-06-13T09:56:08Z Quinlan83 35690 Annullata la modifica di [[Special:Contributions/Quinlan83|Quinlan83]] ([[User talk:Quinlan83|discussione]]), riportata alla versione precedente di [[User:Matt6201|Matt6201]] 283927 wikitext text/x-wiki == Avviso == {{vandalismo}} [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201|Discussione]]) 20:06, 12 giu 2026 (CEST) jj5mu4ocwn7uutqchfadww573vplw1g Discussioni utente:Matt6201 3 37614 283941 2026-06-13T10:00:17Z Quinlan83 35690 /* Discussioni utente:~2026-29058-18 */ nuova sezione 283941 wikitext text/x-wiki == Discussioni utente:~2026-29058-18 == Ti ho revertato per sbaglio, desolato :-) Questo lo sto tenendo d'occhio da mesi (è un LTA: già segnalato). Grazie dell'ottimo lavoro, come sempre! [[Utente:Quinlan83|Quinlan83]] ([[Discussioni utente:Quinlan83|Discussione]]) 12:00, 13 giu 2026 (CEST) sbx9ivip1tt8jhjez40w0rgjmfoph8l 283944 283941 2026-06-13T10:01:52Z Matt6201 46707 /* Discussioni utente:~2026-29058-18 */ Risposta 283944 wikitext text/x-wiki == Discussioni utente:~2026-29058-18 == Ti ho revertato per sbaglio, desolato :-) Questo lo sto tenendo d'occhio da mesi (è un LTA: già segnalato). Grazie dell'ottimo lavoro, come sempre! [[Utente:Quinlan83|Quinlan83]] ([[Discussioni utente:Quinlan83|Discussione]]) 12:00, 13 giu 2026 (CEST) :Ciao @[[Utente:Quinlan83|Quinlan83]], non preoccuparti, l’ho riconosciuto subito :-) [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201#top|Discussione]]) 12:01, 13 giu 2026 (CEST) jyf1m3sdy2qmc22k4djf2pl0yrdyfr4 283945 283944 2026-06-13T10:02:04Z Matt6201 46707 /* Discussioni utente:~2026-29058-18 */ Risposta 283945 wikitext text/x-wiki == Discussioni utente:~2026-29058-18 == Ti ho revertato per sbaglio, desolato :-) Questo lo sto tenendo d'occhio da mesi (è un LTA: già segnalato). Grazie dell'ottimo lavoro, come sempre! [[Utente:Quinlan83|Quinlan83]] ([[Discussioni utente:Quinlan83|Discussione]]) 12:00, 13 giu 2026 (CEST) :Ciao @[[Utente:Quinlan83|Quinlan83]], non preoccuparti, l’ho riconosciuto subito :-) [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201#top|Discussione]]) 12:01, 13 giu 2026 (CEST) ::Grazie a te! [[Utente:Matt6201|Matt6201]] ([[Discussioni utente:Matt6201#top|Discussione]]) 12:02, 13 giu 2026 (CEST) gv3z2c55bsz65z967nafxhe7rkr8zxk