<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>WetBlog</title>
        <link>http://blogs.ugidotnet.org/WetBlog/Default.aspx</link>
        <description>Il blog di Luca Del Tongo</description>
        <language>it-IT</language>
        <copyright>Luca Del Tongo</copyright>
        <managingEditor>lukadt@gmail.com</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <image>
            <title>WetBlog</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/WetBlog/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Download gratuto: Data Structure and Algorithms eBook</title>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/08/27/download-gratuto-data-structure-and-algorithms-ebook.aspx</link>
            <description>&lt;p&gt;E' con grande piacere che dopo alcuni mesi di gestazione insieme al mio amico &lt;a target="_blank" href="http://msmvps.com/blogs/gbarnett/"&gt;Granville&lt;/a&gt;, abbiamo pubblicato il libro&lt;/p&gt;
&lt;p&gt; &lt;a href="http://dotnetslackers.com/projects/Data-Structures-And-Algorithms/"&gt;Data Structures and Algorithms: Annotated Reference with Example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_DSA_Book.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Allo stato attuale il libro è ancora un work in progress ma personalmente sono soddisftatto di come sia evoluto nel corso del tempo (sono un pò di parte... ). Il libro è rivolto a tutti coloro che conoscono un linguaggio di programmazione ad oggetti, senza particolari requisiti; l'utilizzo dello pseudo codice pone infatti l'attenzione sulla parte algoritmica piuttosto che su quella di implementazione. La scelta di renderlo totalmente free è data dalla convinzione che fosse la cosa più giusta:) Sono ben accetti quindi consigli suggerimenti etc. etc. &lt;/p&gt;
&lt;p&gt;A livello personale, scrivere un libro in inglese non è stato cosi semplice ma sicuramente sono esperienze che servono ad ampliare i proprio orizzonti, collaborare poi con Granville per me è un piacere ed uno stimolo ad un continuo miglioramento.... quindi spread the word!!!!&lt;/p&gt;
&lt;p&gt;[EDIT] Ricordo che io, e sopratutto Granville, abbiamo provveduto ad implementare in C# tutti gli algoritmi e le strutture dati presenti nel libro; potete trovare l'implementazione su codeplex al  seguente indirizzo&lt;/p&gt;
&lt;p&gt;&lt;a href="http://codeplex.com/dsa" name="DSA"&gt;http://codeplex.com/dsa&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:770de2ca-3705-4abb-a98e-e62e815c151f" class="wlWriterSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/.NET"&gt;.NET&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Data%20Structure"&gt;Data Structure&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/93840.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/08/27/download-gratuto-data-structure-and-algorithms-ebook.aspx</guid>
            <pubDate>Wed, 27 Aug 2008 17:45:03 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/93840.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/08/27/download-gratuto-data-structure-and-algorithms-ebook.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/93840.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/93840.aspx</trackback:ping>
        </item>
        <item>
            <title>Padre e figlio ... le dimensioni e le prestazioni contano</title>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/30/padre-e-figlio-.-le-dimensioni-e-le-prestazioni-contano.aspx</link>
            <description>&lt;p&gt;Per il compleanno di mia sorella ed in vista della sua imminente partenza per Dublino, ho deciso di regalarle un &lt;strong&gt;Asus Eee PC 900&lt;/strong&gt;; ho acquistato la versione con installato linux per avere &lt;strong&gt;20 Gb&lt;/strong&gt; di memorizzazione &lt;strong&gt;SSD&lt;/strong&gt; (2 schede 4+16). Sono molto soddisfatto dell'acquisto fatto anche se ho dovuto sperimentare alcune specifiche non documentate su cui i produttori come al solito giocano un pò. Dato che mia sorella utilizza regolarmente Windows XP ho deciso in un primo momento di installare suddetto OS.... ho così ottenuto un computer con delle buone performance.... qualche cosa però dentro di me mi ha spinto verso una soluzione un pò più estrema.... il risultato lo vedete qui sotto (cliccare sull'immagine per immagine originale)&lt;img height="22" src="http://www.tuttogratis.it/img/emoticons/_uh_uh.gif" width="25" border="0" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_HPIM0027.JPG" target="_blank"&gt;&lt;img height="180" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/r_HPIM0027.JPG" width="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Analizzando le specifiche tecniche dell' Eee PC 900 possiamo osservare come questo sia dotato di &lt;strong&gt;un Gb di RAM e di un Celeron 900&lt;/strong&gt;... quindi non proprio in linea con i requisti minimi richiesti da &lt;strong&gt;Windows Vista&lt;/strong&gt;..... ma nell'era della customizzazione perchè non scegliere di farsi un bel Vista su misura eseguendone una vera e propria ricompilazione? Eccoci giunti al punto, utilizzando il mitico &lt;a href="http://www.vlite.net/" target="_blank"&gt;Vlite&lt;/a&gt;. Questo software permette di selezionare le feature di interesse rimuovendo caratteristiche di Windows non necessarie... fatto questo dato che l'eepc non dispone di un lettore CD ho dovuto selezionare una installazione tramite penna USB.... a questo punto eseguo l'installazione di Vista selezionando come disco SSD quello da 16 Gb..... installo tutti i driver e i software necessari (Office 2007, Messenger, Skype etc...) però nota che il sistema è lento .... troppo lento ..... a questo punto mi sono detto... ecco Luca sei il solito testone... ma &lt;a href="http://www.modaco.com/content/asus-eee-pc-http-www-eeeasy-com/261965/installing-vista-on-the-eee-ive-done-it-and-it-works/" target="_blank"&gt;online&lt;/a&gt; ho scoperto che nn solo l'unico... confortato da questo post ho eseguito un breve performance test su entrambi i dispositivi SSD e ho scoperto... che le performance di accesso e trasferimento dati tra i due hanno prestazioni molto diverse... la scheda &lt;strong&gt;SSD da 4 Gb&lt;/strong&gt; offre &lt;strong&gt;prestazioni nettamente superiori&lt;/strong&gt;... quindi l'installazione del' OS deve essere effettuata su quel disco... essendo da 4 Gb è necessario usare VLite per rimuovere le parti nn necessarie... fatto ciò ho eseguito una nuova  installazione, ho ottimizzato la configurazioni dei services, ho ridotto al minimo gli aspetti grafici, ho spostato lo swap file sul disco da 16 Gb e finalmente sono arrivato ad avere un sistema con delle buone performance, come potete osservare nel video che ho registrato :)&lt;/p&gt; &lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-b1dd817b243b9def.skydrive.live.com/embedrowdetail.aspx/Pubblica/eepcVista.wmv" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p align="left"&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/93224.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/30/padre-e-figlio-.-le-dimensioni-e-le-prestazioni-contano.aspx</guid>
            <pubDate>Mon, 30 Jun 2008 12:53:59 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/93224.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/30/padre-e-figlio-.-le-dimensioni-e-le-prestazioni-contano.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/93224.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/93224.aspx</trackback:ping>
        </item>
        <item>
            <title>[University Stuff] Simple NAry Tree</title>
            <category>.NET</category>
            <category>University Stuff</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/26/university-stuff-simple-nary-tree.aspx</link>
            <description>&lt;p&gt;In questi giorni, per un esame di algoritmi distribuiti ho avuto la necessità di lavorare con un particolare &lt;strong&gt;albero nario&lt;/strong&gt;. Genericamente un albero nario è un albero in cui ogni nodo presenta al massino n figli. Un albero binario è un caso particolare di albero nario dove n=2; in figura viene mostrato un albero 3ario.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_3aryTree.JPG" /&gt; &lt;/p&gt;  &lt;p align="left"&gt;Vediamo come realizzare un semplice albero nario che permetta di specificare il &lt;strong&gt;fattore di ramificazione&lt;/strong&gt; e che permetta di inserire nodi all'interno dell' albero in modo tale che l'albero venga riempito livello per livello (prima ci creare un nuovo livello si porta a saturazione il livello corrente). Prima di passare alla definizione dell' albero voglio ricordare come un albero nario possa contenere un numero massimo di nodi per una certa altezza h pari a:&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;MaxNumNodi = N^(h+1)-1/N-1&lt;/strong&gt;&lt;/p&gt;  &lt;p align="left"&gt;In riferimento alla figura sopra esposta possiamo osservare che con N=3 ed h=2 otteniamo un numero massimo di nodi pari a 13. Passiamo adesso alla definizione del nostro albero. Per prima cosa definiamo due classi: una container che rappresenta l'albero ed esponde le funzionalità ed una che rappresenta i nodi all'interno di un albero.&lt;/p&gt;  &lt;div&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; NAryTree&amp;lt;T&amp;gt; &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T:IComparable&amp;lt;T&amp;gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NAryNode&amp;lt;T&amp;gt; root { get; set; }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; branchFactor { get; set; }        &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NAryTree(T rootValue, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; BranchFactor)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;             branchFactor = BranchFactor;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;             root = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NAryNode&amp;lt;T&amp;gt;(rootValue, branchFactor);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;         .&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;         .&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;         .&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;     }    &lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Come possiamo vedere la classe generica NAryTree tiene traccia della radice dell'albero e del fattore di ramificazione (numero di figli o arità). La constraint sul tipo generico in realtà nn viene utilizzata in quanto non si ha ordinamento parziale tra gli elementi ma serve come base per un eventuale albero nario di ricerca. Passiamo adesso alla classe NAryNode:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; NAryNode&amp;lt;T&amp;gt; &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T:IComparable&amp;lt;T&amp;gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; { get; set; }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; childnum { get; set; }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NAryNode&amp;lt;T&amp;gt;[] childs { get; set; }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NAryNode(T Value, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; branchFactor)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = Value;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;             childnum = branchFactor;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;             childs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NAryNode&amp;lt;T&amp;gt;[branchFactor];&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Anche la definizione di questa classe risulta abbastanza semplice.... abbiamo una property che memorizza il &lt;strong&gt;valore del nodo&lt;/strong&gt;, &lt;strong&gt;un array di nodi figlio&lt;/strong&gt; ed ancora una proprietà che mi informa sul &lt;strong&gt;numero di nodi figlio &lt;/strong&gt;(proprietà ridondante avendo memorizzato questa info per la classe NaryTree ). Vediamo adesso come inserire per livelli i nodi all'interno dell' albero...&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Insert(T &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;            NAryNode&amp;lt;T&amp;gt; firstFreeNode = FindFirstFreeNode(root);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;            firstFreeNode.childs[CountImmediateChildren(firstFreeNode)] = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NAryNode&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, branchFactor);            &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; CountImmediateChildren(NAryNode&amp;lt;T&amp;gt; node)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; count = 0;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;            &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; node.childnum; i++)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (node.childs[i] != &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;(NAryNode&amp;lt;T&amp;gt;))&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;                    count++;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; count;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; NAryNode&amp;lt;T&amp;gt; FindFirstFreeNode(NAryNode&amp;lt;T&amp;gt; root)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;            &lt;span style="color: #008000"&gt;//BREADTH FIRST WAY!!!!&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;            Queue&amp;lt;NAryNode&amp;lt;T&amp;gt;&amp;gt; row = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Queue&amp;lt;NAryNode&amp;lt;T&amp;gt;&amp;gt;();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;            row.Enqueue(root);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt;            &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (row.Count &amp;gt; 0)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;                NAryNode&amp;lt;T&amp;gt; currentNode = row.Dequeue();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (CountImmediateChildren(currentNode) &amp;lt; root.childs.Length)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;                {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; currentNode;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  29:&lt;/span&gt;                }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  30:&lt;/span&gt;                &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index = 0; index &amp;lt; CountImmediateChildren(currentNode); index++)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  31:&lt;/span&gt;                {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  32:&lt;/span&gt;                    row.Enqueue(currentNode.childs[index]);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  33:&lt;/span&gt;                }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  34:&lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  35:&lt;/span&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;(NAryNode&amp;lt;T&amp;gt;);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  36:&lt;/span&gt;        }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Per eseguire l'inserimento ho usato una tecnica molto brute force che nn fa altro che reperire il primo nodo che ha ancora spazio libero tra i propri figli ed eseguire su di esso l' inserimento.... una tecnica più efficiente consiste nel tenere all'interno della classe NaryTree un riferimento all' ultimo nodo inserito in modo tale che ad ogni inserimento non venga fatta una scansione dell' intero albero per trovare il nodo su cui fare l'inserimento. Unica cosa degna di nota è &lt;strong&gt;l'ottimizzazione&lt;/strong&gt; in termini di allocazione dello &lt;strong&gt;stack di sistema&lt;/strong&gt; eseguita all'interno della funzione FindFirstFreeNode grazie all'uso di una &lt;strong&gt;coda&lt;/strong&gt; dove per ogni livello vengono accodati i vari nodi. A questo punto allego la solution dove potete trovare l'intero codice comprensivo di test ed una piccola demo winform che utilizza la libreria &lt;a href="http://research.microsoft.com/research/downloads/Details/c927728f-8872-4826-80ee-ecb842d10371/Details.aspx" target="_blank"&gt;GLEE&lt;/a&gt;. Se ritenete opportuno avere un'implementazione seria di albero nario lasciate un feedback che magari verrà presa in considerazione come feature da aggiungere all'interno di &lt;a href="http://www.codeplex.com/dsa/" target="_blank"&gt;DSA&lt;/a&gt;&lt;/p&gt;
&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-b1dd817b243b9def.skydrive.live.com/embedrowdetail.aspx/Pubblica/NAryTrees.rar" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/93186.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/26/university-stuff-simple-nary-tree.aspx</guid>
            <pubDate>Thu, 26 Jun 2008 17:01:37 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/93186.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/26/university-stuff-simple-nary-tree.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/93186.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/93186.aspx</trackback:ping>
        </item>
        <item>
            <title>Opportunit&amp;agrave; lavoro Avanade Italia</title>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/24/opportunitagrave-lavoro-avanade-italia.aspx</link>
            <description>&lt;p&gt;Avanade Italia, attraverso un programma che va sotto il nome di &lt;strong&gt;Avanade Academy&lt;/strong&gt;, offre posti di lavoro per favorire l'ingresso nel mondo del lavoro di &lt;strong&gt;neolaureati&lt;/strong&gt; in &lt;strong&gt;Ingegneria, Informatica, Matematica e Fisica&lt;/strong&gt;. I neoassunti cominceranno la propria carriera nell’ambito della consulenza tecnologica, partecipando ai progetti presso le aziende clienti, occupandosi dello sviluppo di &lt;strong&gt;soluzioni&lt;/strong&gt; applicative in ambiente &lt;strong&gt;Microsoft&lt;/strong&gt; a supporto del business&lt;/p&gt;  &lt;p&gt;Chi è interessato può avere ulteriori informazioni e proporre la propria &lt;a href="http://www.s2bprogram.com/Italy/Profile/Project/ShowProject.aspx?Guid=da366b87-b4b5-4f3c-ae12-7f3cec7bf3b4&amp;amp;Digest=SOy4ZYJlPhRDP0a9FM+U7w" target="_blank"&gt;candidatura&lt;/a&gt; direttamente dal sito &lt;strong&gt;Student to Business&lt;/strong&gt;. Le opportunità ci sono, è compito quindi di noi studenti dimostrare o meno il proprio valore.....&lt;/p&gt;  &lt;p&gt;Ad maiora...&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/93149.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/24/opportunitagrave-lavoro-avanade-italia.aspx</guid>
            <pubDate>Tue, 24 Jun 2008 13:42:31 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/93149.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/24/opportunitagrave-lavoro-avanade-italia.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/93149.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/93149.aspx</trackback:ping>
        </item>
        <item>
            <title>Joining DSA project</title>
            <category>University Stuff</category>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/02/joining-dsa-project.aspx</link>
            <description>&lt;p&gt;Sono appena entrato a far parte del progetto &lt;a target="_blank" href="http://www.codeplex.com/dsa/"&gt;DSA&lt;/a&gt; (Data Structure and Algorithms) giunto in questi giorni alla versione 0.5. Far parte di questo progetto per me è uno stimolo davvero interessante e per questo ringrazio il mio amico &lt;a target="_blank" href="http://weblogs.asp.net/gbarnett/"&gt;Granville Barnett&lt;/a&gt;, fondatore del progetto. Compito della libreria DSA è quello di cercare di colmare le lacune presenti all' interno della BCL in quanto ad algoritmi e strutture dati. In questi giorni stiamo lavorando con Granville per decidere quali strutture ed algoritmi implementare sino al rilascio della versione 1.0. Devo subito dire che la metodologia TDD adottata da Granville aiuterà a raffinare il mio coding style e spero di accumulare ulteriore esperienza da questo connubio. Se avete idee o suggerimenti vi rimando al &lt;a target="_blank" href="http://www.codeplex.com/dsa/Thread/List.aspx"&gt;forum&lt;/a&gt; del progetto.&lt;/p&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cb9a5b8b-9812-4a29-ad2b-56d5f57b1487" class="wlWriterSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/.NET"&gt;.NET&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Algorithm"&gt;Algorithm&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/92886.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/02/joining-dsa-project.aspx</guid>
            <pubDate>Mon, 02 Jun 2008 14:58:29 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/92886.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/02/joining-dsa-project.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/92886.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/92886.aspx</trackback:ping>
        </item>
        <item>
            <title>DevCon 2008 Review and beyond</title>
            <category>Meeting Reviews</category>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/02/devcon-2008-review-and-beyond.aspx</link>
            <description>&lt;p&gt;Anche questo anno ho avuto la fortuna di partecipare a &lt;a target="_blank" href="http://devcon2008.devleap.com"&gt;DevCon&lt;/a&gt; e devo dire che come per lo scorso anno il bilancio è decisamente positivo. Innanzitutto sembra strano ma anche in questo caso, avere già l'esperienza di una devcon alle spalle ha sicuramente giovato sia nella scelta delle sessioni da seguire (2 track parallelle) che nell' aver acquisito una certà familiarità con alcuni dei concetti esposti. Senza entrare troppo nel dettaglio cercherò di evidenziare alcune riflessioni personali nate dalle sessioni che ho seguito. &lt;/p&gt;
&lt;h5&gt;WCF&lt;/h5&gt;
&lt;p&gt;Per quanto riguarda WCF, c'è davvero poco da dire in quanto i benefici che questa piattaforma ha portato nello sviluppo di applicazioni distribuite è sin troppo evidente. Delle tre sessioni che ho seguito, quella in cui &lt;a target="_blank" href="http://blogs.devleap.com/paolo/default.aspx"&gt;Paolo&lt;/a&gt; ha illustrato i concetti maggiormente nuovi ed interessanti per me è sicuramente "WCF Web Centric". Durante i primi minuti della sessione Paolo ha fatto un bel ripasso su come funziona il protocollo &lt;strong&gt;HTTP&lt;/strong&gt;, evidenziando le caratteristiche e le differenze in termini di payload fra i vari metodi che presenta (&lt;strong&gt;HTTP POST,HTTP GET, HTTP PUT&lt;/strong&gt;...); questo succulento ripassino ha portato all' introduzione dell'architettura &lt;a target="_blank" href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm"&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/a&gt; e di come sia possibile definire dei tipi di Web Service secondo questo stile architetturale. Personalmente il messagio che ho colto è quello che REST anche se meno formale nella definizione dello scambio dei dati, basandosi sulle intestazioni delle GET e delle POST, permette di utilizzare in modo leggero i meccanismi di request e response alla base del Web, sfruttando un semplice meccanismo legato alle &lt;strong&gt;URI&lt;/strong&gt;. La sessione è proseguita contestualizzando questi concetti all'interno di uno scenario di interazione fra un servizio web ed una pagina ASP.NET basato sulla nuova &lt;strong&gt;Syndication API&lt;/strong&gt;. &lt;/p&gt;
&lt;h5&gt;WF&lt;/h5&gt;
&lt;p&gt;Seguendo le sessioni di &lt;a target="_blank" href="http://blogs.devleap.com/rob/default.aspx"&gt;Rob&lt;/a&gt;, ho capito come Workflow Foundation sia uno strumento tanto bello e potente quanto complicato; avere una strumento a disposizione che permette di gestire flussi di informazioni tramite sia diagrammi sequenziali che diagrammi a stati finiti, apre scenari davvero interessanti. Come giustamente Rob ha evidenziato WF essendo uno strumento "&lt;strong&gt;general purpose&lt;/strong&gt;", rappresenta davvero una strumento pervasivo capace di trovare applicazione in scenari eterogenei accumunati dal basilare concetto di flusso; può quindi essere applicato ad esempio per definire il flusso di navigazione all'interno di un sito Web ma al tempo stesso anche per definire ad esempio gli stati di un casello autostradale. Detto questo, WF lavora principalmente in asincrono e già secondo me qui nascono le prima gioie e dolori. Asincrono è sinonimo di efficienza e ottimizzazione ma lato developer secondo viene visto come perdita del controllo, delle precedenti conoscenze; WF si appoggia su un meccanismo di persistenza che offre &lt;strong&gt;fault tolerance&lt;/strong&gt; da una parte ma al tempo stesso può rappresentare se nn correttamente configurato il famigerata bottleneck applicativo. Quello che Rob "penso" abbia messo in evidenza, specie nella sezione di ottimizzazione è come sia necessario riuscire a trovare quel giusto trade off tra affidabilità e performance magari ricorrendo ad un meccanismo di &lt;strong&gt;scheduling manuale &lt;/strong&gt;in cui la gestione dei &lt;strong&gt;thread &lt;/strong&gt;sia quindi a carico dello sviluppatore. Sono stati inoltre mostrate alcune configurazioni che permettono di aumentare leggermente le performance anche se alla fine i fattori che maggiormente entrano in gioco sono l'accesso in I/O su disco in fase di persistenza e caricamento dello xoml.&lt;/p&gt;
&lt;h5&gt;WEB DEVELOPMENT&lt;/h5&gt;
&lt;p&gt;La parte di sviluppo Web, sia comprendente tecnologie attuali che future, è stata coperta dalle sessioni di &lt;a target="_blank" href="http://blogs.devleap.com/luka/default.aspx"&gt;Luka&lt;/a&gt; e Rob. Lo sviluppo web come al solito è pieno di insidie e spesso gli scenari in cui il requisito principale è la &lt;strong&gt;scalabilità&lt;/strong&gt;, richiedono conoscenze approfondite sia del funzionamento del web che delle varie tecnologie presenti. Condivido il pensiero secondo cui ultimamente stiamo un pò "&lt;strong&gt;tirando il collo&lt;/strong&gt;" al &lt;strong&gt;web &lt;/strong&gt;che in effetti solo apparentemente mostra una veste &lt;strong&gt;2.0&lt;/strong&gt;. E' in questa ottica che vedo bene l' inserimento di Silverlight 2.0; sicuramente la strada da fare per recuperare il gap nei confronti di Flash è notevole ma Silverlight può beneficiare di una base solida come il framework .NET che Flash non possiede. A livello di mera multimedialità magari ad oggi verterei sull' utilizzo di Flash, per realizzare una applicazione web senza particolari requisiti di retrocompatibilità o scadenza sicuramente opterei per Silverlight. All' interno della sessione di chiusura della conferenza sono state prese in rassegna anche le ultimissime tecnologie quale ASP.NET Dynamic Data, Astoria ed &lt;strong&gt;ASP.NET MVC&lt;/strong&gt;. Quello che ho seguito con più attenzione è naturalmente MVC poichè incarnando i principi di &lt;strong&gt;Separation of Concern&lt;/strong&gt; favorisce lo sviluppo e il testing del codice prodotto. Chiudo con un monito: mai usare le session!!!!!&lt;/p&gt;
&lt;h5&gt;LINQ&lt;/h5&gt;
&lt;p&gt;Quando il gioco si fa duro Linq comincia ad interrogare... avere a disposizione uno strumento per &lt;strong&gt;eseguire query indipendentemente &lt;/strong&gt;dalla &lt;strong&gt;sorgente dati &lt;/strong&gt;non ha prezzo. Da studente le mie attenzioni erano rivolte maggiormente a &lt;strong&gt;LINQ To Objects&lt;/strong&gt; poichè rivoluziona il modo con cui si scrive codice e si implementano i vari &lt;strong&gt;algoritmi&lt;/strong&gt;. Concetti cardine, che stanno alla base di LINQ, quali ad esempio &lt;strong&gt;Expression Tree&lt;/strong&gt;, hanno radici molto lontane che ricalcano i passi compiuti dagli odierni compilatori. Per quanto concerne la diatriba tra &lt;strong&gt;LINQ To Sql vs Linq To Entities &lt;/strong&gt;io sto dalla parte di &lt;strong&gt;NHibernate&lt;/strong&gt;... senza offese ma allo stato attuale delle cose se devo utilizzare perchè necessario un ORM, Linq To Sql non lo ritengo un "ORM for Dummies", non è proprio un ORM; Linq To Entities avrebbe le caratteristiche per essere un ORM ma l' implementazione che è stata fatta rovina l'approccio &lt;strong&gt;POCO&lt;/strong&gt; e di &lt;strong&gt;Persistence Ignorancy&lt;/strong&gt; che altri ORM offrono. Mi hanno inoltre fatto osservare come nei casi reali il degrado di performance che NHibernate introduce a causa dell'utilizzo di reflection sia elevato penso però che il vero collo di bottiglia sulle performance di accesso ai dati sia come al solito il disco i cui tempi di accesso sono di qualche ordine di grandezza superiore rispetto alla memoria principale.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h5&gt;PARALLEL PROGRAMMING&lt;/h5&gt;
&lt;p&gt;Questa bonus session capeggiata da &lt;a target="_blank" href="http://blogs.devleap.com/marco/default.aspx"&gt;Marco&lt;/a&gt;, è stata quella che sicuramente dal punto di vista della programmazione in senso lato maggiormente mi ha impressionato. Da una parte la possibilità di sfruttare attraverso una libreria come &lt;a target="_blank" href="http://blogs.msdn.com/pfxteam/"&gt;PLINQ&lt;/a&gt; le potenzialità delle &lt;strong&gt;macchine multicore&lt;/strong&gt; affascina non poco, dall' altra però si aprono scenari in cui il &lt;strong&gt;MultiThread&lt;/strong&gt; è all' ordine del giorno e penso che le competenze e l'acume richiesto ad un programmatore sia davvero troppo elevato per non incorrere in errori non predicibili a compile time che magari si verificano sporadicamente a runtime. Molto interessante inoltre il confronto tra le scelte architetturali effettuate all'interno di &lt;strong&gt;Microsoft Robotics&lt;/strong&gt; e PLINQ stesso.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Concludo con un doveroso ringraziamento alla DevLeap Gang of Four ed un saluto a &lt;a target="_blank" href="http://blogs.aspitalia.com/ricciolo/"&gt;Cristian&lt;/a&gt;, Guido, Jessica, &lt;a target="_blank" href="http://blogs.devleap.com/sergio/default.aspx"&gt;Sergio&lt;/a&gt; ed &lt;a target="_blank" href="http://sqlblog.com/blogs/alberto_ferrari/default.aspx"&gt;Alberto&lt;/a&gt;. Alla goccia DevCon!!!!&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f9295e43-e3cc-4749-ae94-f4d6677ee793" class="wlWriterSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/DevCon"&gt;DevCon&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/.NET"&gt;.NET&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/NHibernate"&gt;NHibernate&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/92884.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/02/devcon-2008-review-and-beyond.aspx</guid>
            <pubDate>Mon, 02 Jun 2008 14:26:46 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/92884.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/06/02/devcon-2008-review-and-beyond.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/92884.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/92884.aspx</trackback:ping>
        </item>
        <item>
            <title>Nth Root</title>
            <category>University Stuff</category>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/05/18/nth-root.aspx</link>
            <description>&lt;p&gt;In questo post mostro poche linee di codice che permettono di calcolare la radice ennesima (&lt;a href="http://en.wikipedia.org/wiki/Nth_root" target="_blank"&gt;nth-root&lt;/a&gt;) di un numero in C#. Prima di buttar giù queste righe di codice mi sono chiesto se nel framework ci fosse qualche cosa che facesse al caso mio... risposta negativa :(  Con l' ausilio di un pò di matematica però si può ovviare a ciò, sfruttando la definizione di logaritmo e le proprietà che lo legano alla funzione esponenziale. Possiamo infatti scrivere:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_EqnNthRoot.jpg" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;La dimostrazione di questa formula è piuttosto semplice in quanto la prima uguaglianza è una proprietà che deriva dalla nozione di base di radice, mentre la seconda relazione può essere dimostrata applicando il logaritmo ad ambo i membri. &lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style: none; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   1:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; Program&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   2:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   3:&lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; Main(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   4:&lt;/span&gt;         {&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   5:&lt;/span&gt;             &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; a, n, x;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   6:&lt;/span&gt;             a = n = x = 0;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   7:&lt;/span&gt;             a = 243;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   8:&lt;/span&gt;             n = 5;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   9:&lt;/span&gt;             &lt;span style="color: rgb(0, 128, 0);"&gt;//radice quinta di 243 = 3^5;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;  10:&lt;/span&gt;             x =(&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;)Math.Round(Math.Exp(Math.Log(a, Math.Exp(1))/n));&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;  11:&lt;/span&gt;         }&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 10pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Nunc est bibendum...&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b1855d2b-2d00-4c8d-8387-00697b89de9b" style="margin: 0px; padding: 0px; display: inline;"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/92719.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/05/18/nth-root.aspx</guid>
            <pubDate>Sun, 18 May 2008 10:47:42 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/92719.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/05/18/nth-root.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/92719.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/92719.aspx</trackback:ping>
        </item>
        <item>
            <title>Data Mining Algorithms : Microsoft Association Rules Revealed</title>
            <category>.NET</category>
            <category>University Stuff</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/04/16/92243.aspx</link>
            <description>&lt;p&gt;Dopo l' &lt;a href="http://blogs.ugidotnet.org/WetBlog/archive/2008/04/15/92218.aspx"&gt;introduzione&lt;/a&gt; del post precedente, oggi esamineremo la &lt;strong&gt;fase cruciale&lt;/strong&gt; e maggiormente complessa di ogni algoritmo di Association Mining ovvero la fase di &lt;strong&gt;estrazione dei frequent pattern&lt;/strong&gt;. Ricordo che i frequent pattern sono gli insiemi di prodotti che hanno supporto maggiore di quello minimo. Possiamo effettuare una prima classificazione degli algoritmi di &lt;strong&gt;frequent pattern mining &lt;/strong&gt;individuando da una parte quelli che si basano su di un &lt;strong&gt;processo iterativo &lt;/strong&gt;di generazione di &lt;strong&gt;itemset candidati&lt;/strong&gt;, dall' altra quelli che calcolano i frequent pattern senza questo processo.  &lt;/p&gt;  &lt;p&gt;&lt;em&gt;ESTRAZIONE FREQUENT CON GENERAZIONE DEI CANDIDATI&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Questa famiglia vede come capostite il noto e largamente diffuso algoritmo che va sotto il nome di &lt;a href="http://citeseer.ist.psu.edu/agrawal94fast.html" target="_blank"&gt;&lt;strong&gt;Apriori&lt;/strong&gt;&lt;/a&gt;. Da sottolineare come l'algoritmo Microsoft Association Rules incluso in Sql Server Analysis Services utilizzi una versione ottimizzata di Apriori (&lt;a href="http://rakesh.agrawal-family.com/" target="_blank"&gt;&lt;strong&gt;Agrawal&lt;/strong&gt;&lt;/a&gt;, uno degli autori di Apriori, dal 2006 è un Microsoft Technical Fellow). &lt;strong&gt;Apriori &lt;/strong&gt;si basa su di un principio, detto di &lt;strong&gt;antimonotonicità&lt;/strong&gt;, che afferma un &lt;strong&gt;sottoinsieme di un frequent itemset è &lt;/strong&gt;di sicuro &lt;strong&gt;frequente &lt;/strong&gt;(presenta un supporto maggiore); questo principio apparentemente banale può essere espresso in una forma duale maggiormente interessante che afferma che se ho un itemset A ed un itemset sottoinsieme B di A, se B non è frequente allora A non può essere frequente. Piccolo esempio per capire meglio&lt;/p&gt;  &lt;p align="center"&gt;{Latte,Birra} è un itemset frequente --&amp;gt;{Latte} e {Birra} sono frequenti&lt;/p&gt;  &lt;p align="center"&gt;{Latte} non è frequente --&amp;gt; {Latte,Birra} non può essere frequente&lt;/p&gt;  &lt;p align="left"&gt;&lt;strong&gt;Apriori &lt;/strong&gt;utilizza un classico approccio &lt;strong&gt;Bottom-Up &lt;/strong&gt;individuando &lt;strong&gt;iterativamente &lt;/strong&gt;prima i &lt;strong&gt;frequent itemsets &lt;/strong&gt;di cardinalità 1 (composti da un item), poi quelli di cardinalità 2 fino a quelli di cardinalità k (k-itemset); vengono in definitiva estesi i frequent aggiungendo un item alla volta fino a che non si arriva ad avere nessun itemset di cardinalità k che superi la soglia minima di supporto. Apriori si basa sulla &lt;strong&gt;generazione dei candidati&lt;/strong&gt;; approfondiamo meglio che cosa siano i candidati e che relazione abbiano con i frequent itemset .&lt;/p&gt;  &lt;p align="left"&gt;Supponiamo di avere 5 item {A,B,C,D,E} all' interno del nostro database transazionale composto da N transazioni; con 5 item il numero di possibili itemset che posso generare è pari a 2^5 = 32. Questi 32 itemset rappresentano i candidati, ovvero gli itemset che potranno o meno essere frequenti; lo spazio dei candidati rappresenta quindi lo spazio di ricerca all'interno del quale saranno presenti anche i frequent itemsets&lt;/p&gt;  &lt;p align="center"&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_SpaceSearchCandidates.gif" /&gt; &lt;/p&gt;  &lt;p align="left"&gt;&lt;strong&gt;La possibilità per i candidati di essere o meno frequente dipende dal loro supporto&lt;/strong&gt;. In un primo tipo di approccio brute force viene calcolato il supporto di ogni candidato effettuando una scansione completa delle N transazioni del database. Supponendo di avere M candidati ed N transazioni la complessità risultante, il numero cioè di confronti da effettuare sarà pari circa ad O(MN). Calcolando che &lt;strong&gt;M=2^(NumDistinctItem) &lt;/strong&gt;e che il numero di transazioni N è solitamente pari ad alcuni milioni, un approccio brute force (come al solito!!!) risulta inaccettabile. Vediamo quindi su quali fronti Apriori agisce. Innanzitutto Apriori sfrutta una euristica basata sul principio di antimonotonicità enunciato precedentemente, ovvero con riferimento allo schema precedente, se l'algoritmo di Apriori trova che l'itemset composto dall'elemento {A}  non è frequente allora elimina "&lt;strong&gt;&lt;em&gt;a priori" &lt;/em&gt;&lt;/strong&gt;i candidati che non potranno essere frequenti ovvero {A,B}, {A,B,C},{A,B,D},{A,B,E},{A,B,C,D},{A,B,C,E},{A,B,D,E},{A,B,C,D,E} poichè superinsieme di un itemset non frequente!! Apriori inoltre utilizza una struttura dati che va sotto il nome di HashTree che permette di conteggiare in modo efficace il supporto dei candidati. Vediamo adesso tramite un diagramma a blocchi come operi l'algoritmo Apriori&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_apriori.png" /&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Commentiamo adesso il diagramma a blocchi sopra esposto; l'algoritmo inizia la propria esecuzione effettuando una scansione completa del database per determinare quali item (itemset con k=1) hanno un supporto maggiore della soglia minima; fatto questo si passa alla fase iterativa di esplorazione dello spazio dei candidati composta da due fasi:&lt;/p&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;ol&gt;       &lt;li&gt;         &lt;div&gt;&lt;strong&gt;Generazione a  partire dagli itemset frequenti&lt;/strong&gt; &lt;strong&gt;L[k] &lt;/strong&gt;di cardinalità k, dei &lt;strong&gt;candidati C[k+1] &lt;/strong&gt;a cardinalità k+1. C[k+1] viene generato facendo il &lt;strong&gt;join di Lk con se stesso&lt;/strong&gt;, considerando solamente gli itemset di lunghezza k+1 che contengono itemset distinti&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div&gt;&lt;strong&gt;Pruning dei candidati &lt;/strong&gt;che presentano sottoinsiemi non frequenti (pruning apriori)&lt;/div&gt;       &lt;/li&gt;     &lt;/ol&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;Queste fasi corrispondono ad una &lt;strong&gt;visita in ampiezza &lt;/strong&gt;dello spazio dei candidati visto precedentemente in aggiunta a &lt;strong&gt;pruning dei sottoalberi&lt;/strong&gt; qualora si verifichi la presenza di itemset non frequenti. Dopo aver generato i C[k+1] è necessario stabilire se questi candidati siano o meno frequenti (blocco rosso del diagramma); questa è la fase critica di tutto l'algoritmo in quanto ripeto, deve essere conteggiato il supporto dei candidati.Apriori oltre a ridurre il numero dei candidati per i quali deve essere conteggiato il supporto utilizza una struttura dati come detto in precedenza, che va sotto il nome di &lt;strong&gt;HashTree&lt;/strong&gt;. L' HashTree è una struttura dati ibrida tra una hashtable ed una lista che permette di conteggiare in modo piuttosto efficiente il supporto dei candidati; non mi dilungo su questa struttura dati, vi darò qualche buona risorsa per approfondimenti. Una volta determinati quali siano i candidati frequenti questi vengono inseriti nel pool dei frequent finali, pool che contiene quindi frequent itemset con cardinalità diversa.&lt;/p&gt;  &lt;p&gt;Dopo tutta questa parte algoritmica penso che sia opportuno mostrare con un semplice esempio come l'algoritmo operi su un semplice database giocattolo sul quale sia fissato come supporto minimo il 50%.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_AprioriStepsSample.gif" /&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Analizzando &lt;strong&gt;Apriori &lt;/strong&gt;possiamo mettere in evidenza alcuni &lt;strong&gt;bottleneck &lt;/strong&gt;(questa è per te ginaluca!!!) che derivano principalmente dall'approccio di generazione dei candidati adottato. I &lt;strong&gt;candidati generati &lt;/strong&gt;con un supporto relativamente basso possono essere decine se non &lt;strong&gt;centinaia di milioni&lt;/strong&gt;, inoltre per effettuare il conteggio del supporto è necessario eseguire un numero di &lt;strong&gt;scansioni del database &lt;/strong&gt;pari alla lunghezza del frequent pattern più lungo. Vediamo quindi adesso la seconda famiglia di algoritmi, quelli senza generazione dei candidati.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;ESTRAZIONE FREQUENT SENZA GENERAZIONE DEI CANDIDATI&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In questa famiglia di algoritmi, che non richiede la generazione dei candidati, rientra l'algoritmo maggiormente efficiente in fatto di Association Mining ovvero &lt;a href="http://citeseer.ist.psu.edu/han99mining.html" target="_blank"&gt;&lt;strong&gt;FPGrowth&lt;/strong&gt;&lt;/a&gt;. In FPgrowth, il metodo di ricerca degli itemset frequenti si basa su una &lt;strong&gt;tecnica ricorsiva di tipo divide-et-impera&lt;/strong&gt;, grazie alla quale il problema di trovare pattern frequenti lunghi (come accade in Apriori) si trasforma nel trovare dapprima quelli più corti (passo divide) per poi concatenarli tra loro (passo impera); questa logica permette di evitare completamente una fase di generazione dei candidati e quindi automaticamente anche il computo dei supporti (i passi più onerosi diApriori). Il funzionamento interno di FPgrowth ha ben poco in comune con quello iterativo di Apriori e si sviluppa lungo un albero ricorsivo nel quale ogni nodo è rappresentato da una particolare struttura dati detta &lt;strong&gt;FPtree&lt;/strong&gt;. Questa struttura (albero di prefissi) &lt;strong&gt;memorizza in forma compatta e completa &lt;/strong&gt;informazioni quantitative relative ai &lt;strong&gt;pattern frequenti&lt;/strong&gt;. Ecco in sintesi come opera la ricorsione:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Al passo generico di ricorsione si genera l’FPtree tramite due precise informazioni: un sotto-database detto &lt;strong&gt;Conditional Pattern Base &lt;/strong&gt;(o CPB)      &lt;br /&gt;e un pattern prefisso &lt;em&gt;alpha&lt;/em&gt;, entrambi ricavati al passo precedente. L’FPtree ottenuto è detto &lt;strong&gt;conditional FPtree&lt;/strong&gt;. Il CPB è una proiezione del database originale nella quale si considerano solo gli item frequenti che co-occorrono insieme al pattern prefisso &lt;em&gt;alpha&lt;/em&gt;. Il pattern prefisso è semplicemente una sequenza di item frequenti&lt;/li&gt;    &lt;li&gt;Dall’FPtree così calcolato, se non vuoto, si ricavano n CPB ad esso associati e si estende il pattern prefisso &lt;em&gt;alpha &lt;/em&gt;ricevuto con un opportuno item frequente Bi, specifico del CPBi i-esimo. Si ottengono quindi n coppie {CPBi, alpha U Bi}.&lt;/li&gt;    &lt;li&gt;Si effettuano n chiamate ricorsive al punto 1,una per ogni singola coppia&lt;/li&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;p&gt;Il passo di inizializzazione (radice della ricorsione) prevede la costruzione di un FPTree direttamente dal database originale e da un pattern frequente nullo&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Detto questo vi lascio alcuni fonti da dove reperire ulteriori informazioni specialmente per FPGrowth che ho solamente introdotto; come elaborato per un esame del mio corso di studi insieme al mio collega &lt;a href="http://gianluca82.altervista.org/index.html" target="_blank"&gt;Gianluca Ghettini&lt;/a&gt; abbiamo implementato e comparato in &lt;strong&gt;c# sia Apriori che FPGrowth&lt;/strong&gt;; questo compito ha portato alla creazione di un progetto su codeplex che va sotto il nome di &lt;a href="http://www.codeplex.com/fpminer" target="_blank"&gt;&lt;strong&gt;FPMiner&lt;/strong&gt;&lt;/a&gt; dove è possibile sia scaricare i sorgenti degli algoritmi sopra esposti che la &lt;a href="http://cid-b1dd817b243b9def.skydrive.live.com/self.aspx/Pubblica/DelTongo,Ghettini%20-%20Apriori%20FPgrowth.pdf" target="_blank"&gt;&lt;strong&gt;relazione finale&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;dove vengono approfonditi gli algoritmi che vi ho illustrato effettuando una approfondita analisi delle performance.&lt;/p&gt;  &lt;p&gt;Ad maiora...&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b912492b-09b0-421b-9849-c35baf60274e" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Data%20Mining" rel="tag"&gt;Data Mining&lt;/a&gt;,&lt;a href="http://technorati.com/tags/AI" rel="tag"&gt;AI&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;ol&gt;   &lt;br /&gt;&lt;/ol&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/92243.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/04/16/92243.aspx</guid>
            <pubDate>Wed, 16 Apr 2008 17:01:37 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/92243.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/04/16/92243.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/92243.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/92243.aspx</trackback:ping>
        </item>
        <item>
            <title>Data Mining Algorithms : Microsoft Association Rules Introduction</title>
            <category>University Stuff</category>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/04/15/92218.aspx</link>
            <description>&lt;p&gt;Oggi voglio analizzare ed illustrare uno dei task maggiormente ricorrenti quando si ha a che fare con operazioni di Data Mining, l' &lt;strong&gt;Association Mining&lt;/strong&gt;. Farò riferimento sia all' implementazione fornita all' interno della suite di algoritmi di Data Mining inclusi in SSAS che ad ulteriori approcci maggiormente efficienti.Defiamo innanzitutto che cosa sia l'Association Mining con riferimento a possibili contesti applicativi.&lt;/p&gt;
&lt;p&gt;Un algoritmo di Association Mining permette di identificare all' interno di un insieme di &lt;strong&gt;prodotti (itemset)&lt;/strong&gt; delle regole che &lt;strong&gt;correlano&lt;/strong&gt; la presenza di un insieme di prodotti con quella di un altro insieme; vengono quindi dapprima estratti dei &lt;strong&gt;pattern frequenti&lt;/strong&gt; e successivamente create delle &lt;strong&gt;regole di associazione&lt;/strong&gt; che descrivono come i vari item (item) co-occorrano all' interno ad esempio di un database transazionale. Chiariamo meglio il concetto con un esempio autoesplicativo; supponiamo di dover effettuare data mining su un database transazionale di un supermercato (scusate l'originalità!!!); gli acquisti dei clienti del supermercato vengono quindi memorizzati come transazione nel database transazionale; ogni transazione conterrà quindi una lista di item (latte,birra,mele....) acquistati da un cliente in una visita al supermercato&lt;/p&gt;
&lt;p&gt; &lt;img style="margin: 0px 0px 0px 100px;" alt="Fasi Algoritmo Association Rule" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/WetBlog/2368/o_AssocPhases.gif" /&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Lo schema precedente illustra le due fasi principali che caratterizzano un algoritmo di Association Mining. La fase computazionalmente più onerosa e critica per le prestazione dell' intero sistema è la prima ovvero quella in cui si cerca di estrarre i pattern frequenti( itemset con supporto maggiore della soglia di supporto minimo). Per comprendere meglio la terminologia presente nello schema dobbiamo dare alcune definizioni che ci permettono di descrivere lo scenario di mining in termini maggiormente appropriati; gli elementi che entrano in gioco sono:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Un &lt;strong&gt;&lt;font size="2"&gt;i&lt;/font&gt;nsieme&lt;/strong&gt; I= &lt;font size="3"&gt;i&lt;/font&gt;&lt;font size="1"&gt;1,&lt;font size="3"&gt;i&lt;/font&gt;2,&lt;font size="3"&gt;i&lt;/font&gt;3....&lt;font size="3"&gt;i&lt;/font&gt;N &lt;/font&gt;&lt;font size="2"&gt;di &lt;strong&gt;item&lt;/strong&gt; distinti&lt;/font&gt; &lt;/li&gt;
    &lt;li&gt;&lt;font size="2"&gt;Una &lt;strong&gt;transazione&lt;/strong&gt; T vista come sottoinsieme di I, T c I&lt;/font&gt; &lt;/li&gt;
    &lt;li&gt;&lt;font size="2"&gt;Una &lt;strong&gt;regole associativa&lt;/strong&gt; espressa nella forma A--&amp;gt;B dove A e B sono itemset tali che AcT, BcT ed A intersezione B={insieme vuoto}&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font size="2"&gt;Per eseguire l'estrazione dei pattern frequenti e delle regole di associazione si utilizzano due indici che vanno sotto il nome di &lt;strong&gt;Supporto &lt;/strong&gt;e &lt;strong&gt;Confidenza&lt;/strong&gt;(&lt;strong&gt;Probabilità&lt;/strong&gt;)&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Supporto (Support)&lt;/strong&gt;
    &lt;ul&gt;
        &lt;li&gt;Misura statistica che fornisce la popolarità di un itemset, viene quindi definito per un itemset A come numero di transazioni checontengono A rapportato al numero di transazioni totali
        &lt;ul&gt;
            &lt;ul&gt;
                &lt;ul&gt;
                    &lt;ul&gt;
                        &lt;ul&gt;
                            &lt;ul&gt;
                                &lt;ul&gt;
                                    &lt;li&gt;&lt;strong&gt;Support(A)= NumTransazione(A)&lt;/strong&gt; &lt;/li&gt;
                                &lt;/ul&gt;
                            &lt;/ul&gt;
                        &lt;/ul&gt;
                    &lt;/ul&gt;
                &lt;/ul&gt;
            &lt;/ul&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Confidenza (Conf)&lt;/strong&gt;
    &lt;ul&gt;
        &lt;li&gt;Misura statistica legata ad un regola di associazione, indicata talvolta come probabilità condizionata, rappresenta la probabilità condizionale che una transazione che include un itemset A ne includa anche un altro B
        &lt;ul&gt;
            &lt;ul&gt;
                &lt;ul&gt;
                    &lt;ul&gt;
                        &lt;ul&gt;
                            &lt;ul&gt;
                                &lt;ul&gt;
                                    &lt;li&gt;&lt;strong&gt;Conf(A--&amp;gt;B) = Probabilità(B|A) = Support(A,B)/Support(A)&lt;/strong&gt; &lt;/li&gt;
                                &lt;/ul&gt;
                            &lt;/ul&gt;
                        &lt;/ul&gt;
                    &lt;/ul&gt;
                &lt;/ul&gt;
            &lt;/ul&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Come al solito un semplice esempio con riferimento alla tabella transazionale mostrata nello schema precedente ci farà prendere confidenza con gli indici di Supporto e Confidenza. Supponiamo di voler calcolare le due grandezze per la &lt;strong&gt;regola di associazione&lt;/strong&gt; che ha come antecedente l' itemset composto da {Pannolini,Latte} e come conseguente {Birra}&lt;/p&gt;
&lt;p align="center"&gt;&lt;strong&gt;Pannolini,Latte --&amp;gt; Birra&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt;Cominciamo calcolando il supporto dell' itemset composto da {Pannolini,Latte,Birra} per poi utilizzarlo all'interno del calcolo della confidenza della regole &lt;/p&gt;
&lt;p align="center"&gt;&lt;strong&gt;&lt;em&gt;Support(Pannolini,Latte,Birra) =&lt;/em&gt;NumTransazioni(Pannolini,Latte,Birra)/NumTotaleTransazioni=2/5&lt;/strong&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;strong&gt;&lt;em&gt;Conf(Pannolini,Latte--&amp;gt;Birra) = &lt;/em&gt;Support(Pannolini,Latte,Birra)/Support(Pannolini,Latte) = 2/3 = 0.66 = 66%&lt;/strong&gt;&lt;/p&gt;
&lt;p align="left"&gt; &lt;/p&gt;
&lt;p align="left"&gt;La regola di associazione sopra esposta ci dice quindi che con buona probabilità (66%) un cliente che compra dei pannolini e del latte comprerà anche la birra. Per avere un'analisi qualitativa di un certo rilievo tutti i vari algoritmi di frequent pattern mining ricevono quindi come parametri di input due soglie relative al &lt;strong&gt;supporto &lt;/strong&gt;ed alla &lt;strong&gt;confidenza minima &lt;/strong&gt;ammissibili. Voglio evidenziare come anche all' interno di Sql Server Analysis Service sia possibile specificare il &lt;strong&gt;supporto &lt;/strong&gt;e la &lt;strong&gt;confidenza minima &lt;/strong&gt;anche se non è possibile assegnare valori arbitrariamente bassi in quanto &lt;strong&gt;SSAS &lt;/strong&gt;effettua una &lt;strong&gt;stima &lt;/strong&gt;in base alla &lt;strong&gt;potenza di calcolo &lt;/strong&gt;presente sulla macchina definendo dei valori limite. Solitamente ad esempio in scenari commerciali non si scende al di sotto del' 1% di supporto. Riassumendo quanto visto finora gli algoritmi di &lt;strong&gt;association mining &lt;/strong&gt;fungono da vero e proprio motore di &lt;strong&gt;conteggio di correlazione&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="left"&gt;Nel prossimo post verranno analizzati gli approcci che si possono adottare nel determinare gli itemset frequenti...&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ca17027d-cef1-4b3e-8eeb-853777b79fcf" style="margin: 0px; padding: 0px; display: inline;"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Data%20Mining" rel="tag"&gt;Data Mining&lt;/a&gt;,&lt;a href="http://technorati.com/tags/AI" rel="tag"&gt;AI&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/92218.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/04/15/92218.aspx</guid>
            <pubDate>Tue, 15 Apr 2008 15:57:04 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/92218.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/04/15/92218.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/92218.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/92218.aspx</trackback:ping>
        </item>
        <item>
            <title>Academic Club restart</title>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/WetBlog/archive/2008/02/11/91133.aspx</link>
            <description>&lt;p&gt;Dopo un paio di mesi di lavoro e sbattimenti con Photoshop, Expression Web ed infine con l'sdk di Community Server 2007, sono riuscito a mettere online la nuova versione (quasi completa) del portale dedicato ad &lt;a title="http://academiclub.org/Default.aspx" href="http://academiclub.org/Default.aspx"&gt;Academic Club&lt;/a&gt;, associazione composta da studenti e ricercatori che condividono la passione per il framework .NET;&lt;/p&gt;  &lt;p&gt;Ringrazio i ragazzi di &lt;a href="http://www.dotnetmarche.org/"&gt;DotNetMarche&lt;/a&gt; per gli ottimi appunti messi a disposizione e prometto che appena ho un pò di tempo, scriverò una survival guide per chi decida di avventurarsi nella creazione di un tema custom from scratch per Community Server;  il portale contiene alcuni webcast interessanti, nei prox giorni ne metteremo online altri; &lt;/p&gt;  &lt;p&gt;Ad maiora...&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/WetBlog/aggbug/91133.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Luca Del Tongo</dc:creator>
            <guid>http://blogs.ugidotnet.org/WetBlog/archive/2008/02/11/91133.aspx</guid>
            <pubDate>Mon, 11 Feb 2008 18:04:30 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/WetBlog/comments/91133.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/WetBlog/archive/2008/02/11/91133.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/WetBlog/comments/commentRss/91133.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/WetBlog/services/trackbacks/91133.aspx</trackback:ping>
        </item>
    </channel>
</rss>