<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ programmazione - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ programmazione - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 07 May 2026 08:46:52 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/tag/programmazione/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Strutture Dati: Array — Una Introduzione Visuale per Principianti ]]>
                </title>
                <description>
                    <![CDATA[ Impara a conoscere le strutture dati che usi ogni giorno. 👋 Benvenuto! Iniziamo con un po' di necessario contesto. Ho qualche domanda per te: ✅ Ascolti musica sul tuo smartphone? ✅ Mantieni un elenco di contatti sul telefono? ✅ Hai mai visto una classifica durante una competizione? Se la tua ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/strutture-dati-array/</link>
                <guid isPermaLink="false">64a66f27aedaa5069ba96f62</guid>
                
                    <category>
                        <![CDATA[ programmazione ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Mon, 17 Jul 2023 08:08:11 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/07/1_plaTqL5DDa2MgqeK-0EClg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/data-structures-101-arrays-a-visual-introduction-for-beginners-7f013bcc355a/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Data Structures 101: Arrays — A Visual Introduction for Beginners</a>
      </p><h3 id="impara-a-conoscere-le-strutture-dati-che-usi-ogni-giorno-">Impara a conoscere le strutture dati che usi ogni giorno.</h3><p>👋 Benvenuto! Iniziamo con un po' di necessario contesto. Ho qualche domanda per te:<br>✅ Ascolti musica sul tuo smartphone?<br>✅ Mantieni un elenco di contatti sul telefono?<br>✅ Hai mai visto una classifica durante una competizione?</p><p><strong>Se la tua risposta è "sì" a una qualsiasi di queste domande, allora è quasi certo che hai usato gli array e non lo sapevi nemmeno!<strong><strong><strong> 😃 </strong></strong></strong></strong>Gli array sono strutture di dati molto potenti che memorizzano <strong>elenchi di elementi</strong>. Hanno infinite applicazioni. Sono molto importanti nel mondo dell'informatica.</p><p>In questo articolo imparerai i pro e i contro degli array, la loro struttura, le operazioni che puoi eseguire su di essi e i casi d'uso.</p><p><strong>Cominciamo!<strong> <strong><strong>👍</strong></strong></strong></strong></p><h3 id="-approfondimento-della-struttura-di-base-degli-array">🔎 Approfondimento della struttura di base degli array</h3><p>Per capire come funzionano, è molto utile visualizzare la memoria del tuo computer come una griglia, proprio come quella qui sotto. Ogni parte di informazione viene conservata in uno di quei piccoli elementi (i quadrati) che compongono la griglia.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/uxNDqnrhHuS197WjrTeak8WQq2QZKAJD5xp4" class="kg-image" alt="uxNDqnrhHuS197WjrTeak8WQq2QZKAJD5xp4" width="800" height="495" loading="lazy"></figure><p>Gli <strong>a<strong>rray </strong></strong>si avvalgono di questa struttura a "griglia" per <strong>conservare elenchi di informazioni correlate in posizioni di memoria adiacenti </strong>al fine di garantire estrema efficienza nel trovare questi valori. 🔳🔳🔳🔳</p><p><strong>Puoi visualizzare la struttura di un array in questo modo<strong>:</strong></strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-06-10-00-22.png" class="kg-image" alt="HjKZtf6JKxcrH8t51iRrId-4lTqjOlGtICip" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-06-10-00-22.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-06-10-00-22.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-06-10-00-22.png 1193w" sizes="(min-width: 720px) 720px" width="1193" height="544" loading="lazy"></figure><p><strong>Gli elementi di un array sono adiacenti nella memoria. </strong>Se devi accedere a più di uno di essi, il processo è estremamente ottimizzato in quanto il tuo computer sa già dove si trova il valore.</p><p>Stupendo, non è vero? Impariamo come avviene dietro le quinte! 😃</p><h4 id="-classificazione"><strong><strong>📚 Classifica</strong>z<strong>ion</strong>e</strong></h4><p>Gli array sono classificati come <strong>Strutture Dati Omogenee</strong> in quanto conservano <strong>elementi dello stesso tipo</strong>.</p><p>Possono conservare numeri, stringhe, valori booleani (vero e falso), caratteri, oggetti e così via. Ma <strong>una volta definito il tipo di valore che dovrà contenere il tuo array, tutti i suoi elementi dovranno essere dello stesso tipo. Non puoi "mischiare" elementi di tipi diversi<strong>.</strong></strong></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/sbk9-CGxQ5VKddqpz9S12GxpR26I8f8e0hj6" class="kg-image" alt="sbk9-CGxQ5VKddqpz9S12GxpR26I8f8e0hj6" width="800" height="290" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-06-10-11-43.png" class="kg-image" alt="oS1i6uyY71HPvrPCVEqEVDpscFgyeUCAwlPN" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-06-10-11-43.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-06-10-11-43.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-06-10-11-43.png 1191w" sizes="(min-width: 720px) 720px" width="1191" height="511" loading="lazy"></figure><h3 id="-leggere-valori-la-magia-inizia-"><strong><strong>👀 </strong>Leggere Valori<strong> — </strong>La Magia Inizia<strong>!</strong></strong></h3><p>Il meraviglioso potere degli array proviene direttamente dalla loro <strong>efficienza nell'accedere ai valori</strong>. Questo avviene grazie alla loro struttura tipo griglia. Esaminiamo il processo in maggiore dettaglio.🔍</p><p><strong>Quando crei un array<strong>:</strong></strong><br>- Lo assegni a una variabile. 👈<br>- Definisci il tipo di elementi che dovrà contenere. 🎈<br>- Definisci la sua dimensione (il numero massimo di elementi). 📚</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/xzGLFN8ymKFdxyZWHk4YInJ6cyQQHxUJiJQX" class="kg-image" alt="xzGLFN8ymKFdxyZWHk4YInJ6cyQQHxUJiJQX" width="713" height="144" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> Not</strong>a<strong>:</strong></strong> Il nome che assegni a questa variabile è molto importante in quanto lo utilizzerai successivamente nel tuo codice per accedere e/o modificarne i valori.</p><p>Ma come puoi dire al computer di accedere a un particolare valore? Qui gli indici hanno un ruolo vitale!</p><h4 id="1-indici"><strong><strong>1️⃣ Indic</strong>i</strong></h4><p><strong>Si usa quello che viene chiamato "indice" </strong>per accedere a un valore in un array. È un numero che fa riferimento alla posizione in cui il valore è conservato.</p><p>Come puoi vedere nel diagramma qui sotto, il primo elemento dell'array viene indirizzato usando l'indice 0. Mano a mano che ti sposti verso destra, il valore dell'indice aumenta di uno per ciascuno spazio in memoria.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-46-35.png" class="kg-image" alt="TuWNHRYkAgpBEjuszG9DElXUIAf8Osw2z--7" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-08-09-46-35.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-08-09-46-35.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-46-35.png 1218w" sizes="(min-width: 720px) 720px" width="1218" height="489" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> Not</strong>a<strong>: </strong></strong>So che partire a contare da 0 invece che da 1 può sembrare strano, ma è quella che viene chiamata <a href="https://en.wikipedia.org/wiki/Zero-based_numbering" rel="noopener">Numerazione a base zero</a>. È molto comune in informatica.</p><p><strong>La sintassi generale per accedere a un elemento è </strong><code><strong><strong><strong><strong>&lt;</strong></strong></strong>VariabileArray<strong><strong><strong>&gt;[&lt;ind</strong></strong></strong>ice<strong><strong><strong>&gt;]</strong></strong></strong></strong></code></p><p><strong>Per esempio<strong><strong><strong>:</strong></strong></strong></strong><br>Se il tuo array è associato alla variabile <code><strong><strong><strong><strong>myArray</strong></strong></strong></strong></code> e vuoi accedere al primo elemento (indice 0), dovresti usare <code><strong><strong><strong><strong>myArray[0]</strong></strong></strong></strong></code></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/Yu9nSlzmHkZV4e7f7sulFIamSwWONw4wNcpg" class="kg-image" alt="Yu9nSlzmHkZV4e7f7sulFIamSwWONw4wNcpg" width="800" height="360" loading="lazy"></figure><h4 id="2-memoria"><strong><strong>2️⃣ Memor</strong>ia</strong></h4><p>Ora che sai come accedere ai valori, vediamo come sono conservati gli array nella memoria del computer. <strong>Quando definisci la dimensione di un array, tutto lo spazio in memoria corrispondente alla dimensione viene "riservato" da quel momento in poi </strong>per valori futuri che vorresti poter inserire.</p><p><strong><strong><strong><strong>💡 Not</strong></strong></strong>a<strong><strong><strong>:</strong></strong></strong></strong> Se non riempi tutto l'array con valori, quello spazio verrà riservato e mantenuto vuoto fino a quando non lo farai.</p><p><strong>Per esempio<strong>:</strong></strong><br>Diciamo che definisci un array di dimensione 5 ma inserisci un solo valore. Tutto lo spazio rimanente sarà vuoto e "riservato" in memoria, in attesa di future assegnazioni.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/7Hoys8sq0RuDF4-Rgr4WRD4RrImGhtQmzR9P" class="kg-image" alt="7Hoys8sq0RuDF4-Rgr4WRD4RrImGhtQmzR9P" width="800" height="258" loading="lazy"></figure><p>Questa è la chiave: gli array sono estremamente efficienti nell'accedere ai valori in quanto tutti gli elementi sono conservati in spazi contigui di memoria. <strong>In questo modo, il computer sa esattamente dove cercare per trovare le informazioni che hai richiesto</strong>.</p><p><strong>Ma<strong><strong><strong>… </strong></strong></strong></strong>c'è un aspetto negativo 😞 in quanto non è <strong>efficiente dal punto di vista della memoria</strong>. Stai riservando memoria per operazioni future che potrebbero non accadere mai. <strong>Ecco perché gli array sono consigliati in situazioni dove sai in anticipo quanti elementi andrai a conservare</strong>.</p><h3 id="-operazioni-dietro-le-quinte-"><strong><strong>🔧 Opera</strong>z<strong>io</strong>ni<strong> — </strong>Dietro le quinte<strong>!</strong></strong></h3><p>Ora che sai cosa sono gli array, quando vengono usati e come conservano i loro elementi, approfondiremo le operazioni che si possono compiere su di essi come l'inserimento e l'eliminazione.</p><h4 id="1-inserimento-benvenuto-"><strong><strong>1️⃣ Inser</strong>imento<strong> — </strong>Benvenuto<strong>!</strong></strong></h4><p>Supponiamo di avere un array di dimensione 6 e di avere ancora spazio vuoto all'interno. Vogliamo inserire un elemento "e" all'inizio dell'array (indice 0), ma questa posizione è già occupata dall'elemento "a". Cosa dovremmo fare?</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/JX8sviJCpwXkWT6mZ4fDIwzSNFDUZ0C8LfrP" class="kg-image" alt="JX8sviJCpwXkWT6mZ4fDIwzSNFDUZ0C8LfrP" width="800" height="480" loading="lazy"></figure><p><strong>Per inserire elementi negli array</strong>, spostiamo tutti gli elementi già presenti che si trovano alla destra della posizione di inserimento di una posizione in avanti verso destra. L'elemento "a" ora sarà a indice 1, l'elemento "b" a indice 2 e così via…</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/8KFz74m1v5dPBzXGr5IXAvt3a5XFbzL78gVs" class="kg-image" alt="8KFz74m1v5dPBzXGr5IXAvt3a5XFbzL78gVs" width="800" height="476" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> Not</strong>a<strong>: </strong></strong>Potresti aver bisogno di creare una variabile per tenere traccia del valore dell'ultimo indice che contiene elementi. Nel diagramma qui sopra, l'array viene riempito fino all'indice 4 prima dell'inserimento. In questo modo, puoi determinare se l'array è pieno e quale indice dovresti utilizzare per inserire un elemento alla fine.</p><p>Dopo aver fatto questo, il nuovo elemento viene inserito con successo. 👏</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/VqmOSyTnIvPWbkw9p1PIhenPthaxd3bHxzvS" class="kg-image" alt="VqmOSyTnIvPWbkw9p1PIhenPthaxd3bHxzvS" width="800" height="265" loading="lazy"></figure><h4 id="-aspetta-un-minuto-cosa-succede-se-l-array-pieno"><strong><strong>⚠️ </strong>Aspetta un minuto! Cosa succede se l'array è pieno<strong>?</strong></strong></h4><p>Cosa pensi che accada se l'<strong>array è pieno e cerchi di inserire </strong>un elemento? 😱</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-06-12-00-45.png" class="kg-image" alt="IlI473xQSRYYCMjlcF0YMSOs-Kca2hqqupGk" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-06-12-00-45.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-06-12-00-45.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-06-12-00-45.png 1188w" sizes="(min-width: 720px) 720px" width="1188" height="805" loading="lazy"></figure><p><strong><strong>In </strong>questo caso devi creare un array nuovo più grande, poi copiare manualmente tutti gli elementi nel nuovo array. </strong>Questa operazione è <strong>molto onerosa dal punto di vista del tempo</strong>. Immagina cosa accadrebbe se avessi un array con milioni di elementi! Potrebbe volerci moltissimo tempo per completare l'operazione. ⏳</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/P2q2OaohnsEPDa3KMu3e6eOJaPpw-bpufH95" class="kg-image" alt="P2q2OaohnsEPDa3KMu3e6eOJaPpw-bpufH95" width="734" height="477" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> Not</strong>a<strong>: </strong></strong>L'unica eccezione a questa regola, laddove l'inserimento è molto veloce, è quando inserisci un elemento alla <strong>fine</strong> dell'array (alla posizione di indice alla destra dell'ultimo elemento) e c'è ancora spazio disponibile. Questo viene fatto con un tempo costante O(1).</p><h4 id="2-cancellazione-ciao-ciao-"><strong><strong>2️⃣ </strong>Cancellazione<strong>— </strong>Ciao Ciao<strong>!</strong></strong></h4><p>Diciamo ora che vuoi eliminare un elemento dall'array.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/yG5HNXTX7Xj7aXAstjEMU2VNWHkEZXtG9q5z" class="kg-image" alt="yG5HNXTX7Xj7aXAstjEMU2VNWHkEZXtG9q5z" width="753" height="253" loading="lazy"></figure><p>Per mantenere l'efficienza per l'accesso casuale (essere in grado di accedere in modo estremamente veloce all'array tramite un indice) gli elementi devono essere conservati in spazi contigui di memoria. <strong>Non puoi semplicemente eliminare l'elemento e lasciare uno spazio vuoto</strong>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-07-16-36-01.png" class="kg-image" alt="bd9KRk22FyVVrW3RJEKvCd8y-VAJQodeABOD" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-07-16-36-01.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-07-16-36-01.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-07-16-36-01.png 1189w" sizes="(min-width: 720px) 720px" width="1189" height="491" loading="lazy"></figure><p>Dovresti spostare di una posizione a sinistra gli elementi situati dopo l'elemento che vuoi cancellare.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/G13PaxPTyIQRCBJdh2Ioup-4jM-qlDMnTVd7" class="kg-image" alt="G13PaxPTyIQRCBJdh2Ioup-4jM-qlDMnTVd7" width="755" height="290" loading="lazy"></figure><p>Alla fine l'array risulterà questo 👇. Come puoi vedere, "b" è stato eliminato con successo.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/85yhQ9XK19hJ2paBhkb9Cf0-8v52DO0igncc" class="kg-image" alt="85yhQ9XK19hJ2paBhkb9Cf0-8v52DO0igncc" width="753" height="255" loading="lazy"></figure><p><strong><strong><strong><strong>💡 Not</strong></strong></strong>a<strong><strong><strong>: </strong></strong></strong></strong>La cancellazione è molto efficiente quando rimuove l'<strong>ultimo</strong> elemento. Visto che devi creare una variabile che tenga traccia dell'ultimo indice che contiene un elemento (nel diagramma qui sopra, 3), puoi rimuovere direttamente l'elemento usando l'indice.</p><h4 id="3-trovare-un-elemento"><strong><strong>3️⃣ </strong>Trovare un elemento</strong></h4><p>Hai tre opzioni per trovare un elemento in un array:</p><ul><li><strong>Se conosci la sua posizione</strong>, usa l'indice.</li><li><strong>Se non conosci la sua posizione e i tuoi dati sono ordinati</strong>, puoi usare degli algoritmi per ottimizzare la tua ricerca, come la Ricerca Binaria.</li><li><strong>Se non conosci la sua posizione e i dati non sono ordinati</strong>, devi scorrere tutti gli elementi nell'array e verificare se l'elemento corrente è quello che stai cercando (vedi la serie di diagrammi qui sotto).</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-21-57.png" class="kg-image" alt="hlrl4kdBl3eM8cT7DXJX7rItWeHzTvrretfG" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-08-09-21-57.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-08-09-21-57.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-21-57.png 1227w" sizes="(min-width: 720px) 720px" width="1227" height="553" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-24-17.png" class="kg-image" alt="nFz0jZQu4dtAqv4fauEE-7zVqxtGlKVVfKew" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-08-09-24-17.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-08-09-24-17.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-24-17.png 1227w" sizes="(min-width: 720px) 720px" width="1227" height="553" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-26-50-1.png" class="kg-image" alt="hxcwNp-VfOem0psPkl26HCLrILCR1mlrdpku" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-08-09-26-50-1.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-08-09-26-50-1.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-26-50-1.png 1227w" sizes="(min-width: 720px) 720px" width="1227" height="553" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-29-22.png" class="kg-image" alt="dEd3ArmSERT63fk95KSlKwwCqdwjvUBAOQen" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-08-09-29-22.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-08-09-29-22.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-08-09-29-22.png 1227w" sizes="(min-width: 720px) 720px" width="1227" height="553" loading="lazy"></figure><h3 id="-riepilogando-"><strong><strong>👋 </strong>Riepilogando <strong>…</strong></strong></h3><ul><li><strong>Gli array sono strutture dati estremamente potenti</strong> che conservano elementi dello stesso tipo. Il tipo degli elementi e la dimensione dell'array sono fissi e definiti in fase di creazione.</li><li><strong>La memoria è allocata immediatamente</strong> dopo che l'array è creato ed è vuota fino a quando non assegni i valori.</li><li>Gli <strong>elementi sono posti in posizioni contigue di memoria</strong>, in modo che vi si possa accedere in modo molto efficiente (accesso casuale O(1) = tempo costante) usando gli <strong>indici</strong>.</li><li>Gli <strong>indici partono da 0</strong>, non da 1 come siamo abituati.</li><li>L'<strong>inserimento di elementi</strong> all'inizio o in mezzo all'array comporta lo spostamento degli elementi verso destra. Se l'array è pieno, occorre creare un nuovo array di maggiori dimensioni (il che non è molto efficiente). L'inserimento alla fine dell'array è molto efficiente - tempo costante O(1).</li><li>La <strong>rimozione di elementi</strong> dall'inizio o nel mezzo dell'array comporta lo spostamento di tutti gli elementi verso sinistra per evitare di lasciare uno spazio vuoto in memoria. Questo garantisce che gli elementi siano conservati in spazi di memoria contigui. La rimozione di un elemento alla fine dell'array è molto efficiente in quanto cancelli solo l'ultimo elemento senza spostare gli altri.</li><li><strong>Per trovare un elemento</strong>, devi controllare l'intero array fino a quando non lo trovi. Se i dati sono ordinati, puoi usare algoritmi come la Ricerca Binaria per ottimizzare il processo.</li></ul><blockquote><em><em>“</em>Impara dal passato, vivi nel presente, spera nel futuro. La cosa importante è non smettere di fare domande<em>.”</em></em><br><br><em><em>— Albert Einstein</em></em></blockquote><h4 id="-grazie-"><strong><strong>👋 </strong>Grazie<strong>!</strong></strong></h4><p>Spero vivamente che ti sia piaciuto il mio articolo. ❤️<br><strong>Seguimi su</strong> <a href="https://twitter.com/Estefania_CN_" rel="noopener">Twitter</a> per trovare altri articoli come questo. 😃</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Strutture Dati: Grafi — Un'Introduzione Visuale per Principianti ]]>
                </title>
                <description>
                    <![CDATA[ Impara a conoscere le strutture dati che usi ogni giorno 👋 Benvenuto! Iniziamo con un po' di necessario contesto. Ho qualche domanda per te: ✅ Usi Google Search? ✅ Usi Google Maps? ✅ Usi i siti di social media? Se la tua risposta è "sì" a una qualsiasi di queste ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/strutture-dati-grafi-unintroduzione-visuale-per-principianti/</link>
                <guid isPermaLink="false">649d2ba0697af406bfa1e64b</guid>
                
                    <category>
                        <![CDATA[ programmazione ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Mon, 10 Jul 2023 12:33:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/06/1_EBtSVCSmRvw40Bmu9vP69A.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/data-structures-101-graphs-a-visual-introduction-for-beginners-6d88f36ec768/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Data Structures 101: Graphs — A Visual Introduction for Beginners</a>
      </p><h4 id="impara-a-conoscere-le-strutture-dati-che-usi-ogni-giorno"><strong>I</strong>mpara a conoscere le strutture dati che usi ogni giorn<strong>o</strong></h4><p>👋 Benvenuto! Iniziamo con un po' di necessario contesto. Ho qualche domanda per te:<br><strong><strong>✅ </strong>Usi<strong> Google Search?</strong></strong><br><strong><strong>✅ </strong>Usi<strong> Google Maps?</strong></strong><br><strong><strong>✅ </strong>Usi i siti di <strong>social media?</strong></strong></p><p><strong>Se la tua risposta è "sì" a una qualsiasi di queste domande, allora hai sicuramente utilizzato i grafi e non lo sapevi nemmeno! Sorpreso?</strong> 😲 Lo ero anch'io! Questo articolo ti fornirà un'introduzione visiva al mondo dei grafi, al loro scopo, elementi e tipi.</p><p><strong>Queste strutture di dati hanno davvero attirato la mia attenzione grazie alle loro incredibili capacità.</strong> Sono così potenti che non immagini nemmeno quanto possano essere diverse le loro applicazioni nel mondo reale. Cominciamo! 😁</p><h3 id="-applicazioni-nel-mondo-reale-la-magia-inizia-"><strong><strong>🌐 </strong>Applicazioni nel Mondo Reale <strong>— </strong>La Magia Inizia<strong>!</strong></strong></h3><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/7Fthyp4QpNDWIPHyw-ufGzUtNambSqhQzamA" class="kg-image" alt="7Fthyp4QpNDWIPHyw-ufGzUtNambSqhQzamA" width="571" height="340" loading="lazy"></figure><p><strong>I grafi sono usati in diversi settori e campi<strong>:</strong></strong></p><ul><li>I<strong> sistemi <strong>GPS</strong> e<strong> Google Maps</strong></strong> usano i grafi per trovare il percorso più breve da una destinazione a un'altra.</li><li>I<strong> S<strong>ocial Network</strong></strong> usano i grafi per rappresentare le connessioni tra utenti.</li><li>L'algoritmo di<strong><strong> Google Search</strong></strong> usa i grafi per determinare la rilevanza dei risultati della ricerca.</li><li>La <strong>Ricerca Operativa</strong> è un campo che utilizza i grafi per trovare il percorso ottimale per ridurre i costi di trasporto e consegna di beni e servizi.</li><li>Anche la <strong>chimica<strong> </strong></strong>usa i grafi per rappresentare le molecole!!! ❤️</li></ul><p>Le loro applicazioni sono fantastiche, vero?<br>Iniziamo il nostro viaggio attraverso questo mondo! 😄</p><h3 id="-ti-presento-i-grafi-"><strong><strong>🔵 </strong>Ti Presento i<strong> Gra</strong>fi<strong>!</strong></strong></h3><p>Ora che hai un po' di contesto, iniziamo parlando del loro scopo principale e degli elementi che li costituiscono.</p><p><strong>I grafi sono usati per rappresentare, trovare, analizzare e ottimizzare connessioni tra gli elementi (case, aeroporti, luoghi, utenti, articoli ecc.<strong>).</strong></strong></p><p>Questo è &nbsp;un esempio dell'aspetto di un grafo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/vQ77VuGVlTR95GgMxzyKqydIqoRJcPcWrigy" class="kg-image" alt="vQ77VuGVlTR95GgMxzyKqydIqoRJcPcWrigy" width="654" height="411" loading="lazy"><figcaption>Grafo.</figcaption></figure><h4 id="-elementi-costitutivi"><strong><strong>💠 </strong>Elementi Costitutivi</strong></h4><p>Sono sicuro che avrai notato due elementi principali nel diagramma qui sopra: dei cerchi e delle linee spesse che li connettono tra loro. Sono chiamati rispettivamente <strong>nodi</strong> (nodes) e <strong>connessioni</strong> (edges).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-10-08-39-29-1.png" class="kg-image" alt="9KFiyFYi9bMktsJkMKLKaeJl31heUN9A-xrr" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-10-08-39-29-1.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-10-08-39-29-1.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-10-08-39-29-1.png 1061w" sizes="(min-width: 720px) 720px" width="1061" height="853" loading="lazy"></figure><p><strong>Entriamo nei dettagli<strong>! <strong><strong>👍</strong></strong></strong></strong></p><ul><li><strong><strong>Nod</strong>i<strong>:</strong></strong> sono gli &nbsp;<strong><strong>element</strong>i</strong> che creano la rete. Potrebbero rappresentare <strong>case, luoghi, aeroporti, porti, fermate d'autobus, edifici, utenti</strong>, praticamente qualunque cosa tu possa rappresentare come collegata ad altri elementi simili in una rete.</li><li><strong>Connessioni<strong>:</strong></strong> sono <strong>collegamenti </strong>tra i nodi. Potrebbero rappresentare <strong>strade, voli, percorsi di autobus, una connessione tra due utenti in un <strong>social network,</strong></strong> o qualunque cosa che potrebbe possibilmente rappresentare una connessione tra nodi nel contesto nel quale stai operando.</li></ul><h4 id="-cosa-succede-se-non-ci-sono-connessioni"><strong><strong>😱 </strong>Cosa Succede Se Non Ci Sono Connessioni<strong>?</strong></strong></h4><p>Se due nodi non sono collegati tra loro, vuol dire che <strong>non esiste connessione diretta tra i medesimi</strong>. Ma non ti spaventare! 😩 Potresti essere comunque in grado di andare da un nodo all'altro <strong>seguendo una serie di connessioni</strong>, come se passassi per diverse strade per raggiungere la tua destinazione finale. 🚛️ 🚛 🚛</p><p>Per esempio, nel diagramma qui sotto, sebbene non vi sia <strong>diretta</strong> connessione tra il <strong>nodo</strong> <strong>viola</strong> (a sinistra) e il <strong>nodo giallo</strong> (a destra), puoi comunque raggiungerlo dal nodo viola passando per il nodo arancione, poi per il nodo rosa, quindi per quello verde e arrivare finalmente al nodo giallo. 🏁</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/5GifDfcnk5D15YwlbmewVveYhSAkMhWKCnfm" class="kg-image" alt="5GifDfcnk5D15YwlbmewVveYhSAkMhWKCnfm" width="800" height="378" loading="lazy"><figcaption>Nessuna connessione diretta tra il nodo viola e quello giallo.</figcaption></figure><p>Questo è un aspetto chiave dei grafi, puoi <strong>trovare l'elemento desiderato seguendo i percorsi a disposizione<strong>.</strong></strong></p><h3 id="-notazione-e-terminologia"><strong><strong>🌟 Nota</strong>z<strong>ion</strong>e<strong> </strong>e<strong> Terminolog</strong>ia</strong></h3><p>È molto importante imparare il "linguaggio" formale per lavorare con i grafi:</p><ul><li><code><strong><strong>|V|</strong></strong></code> = <strong>Numero totale di vertici (nodi) </strong>in un grafo.</li><li><code><strong><strong>|E|</strong></strong></code> = <strong>Numero totale di connessioni</strong> in un grafo.</li></ul><p>Nell'esempio che segue, &nbsp;<code><strong><strong>|V| = 6</strong></strong></code> in quanto ci sono sei nodi (i cerchi) ed <code><strong><strong>|E| = 7</strong></strong></code><strong><strong> </strong></strong>poiché ci sono sette connessioni (le righe).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/5vbqwpnuO8nAdj51kN4Bk8ozdpL6WYWkkQHu" class="kg-image" alt="5vbqwpnuO8nAdj51kN4Bk8ozdpL6WYWkkQHu" width="663" height="382" loading="lazy"><figcaption>Grafo.</figcaption></figure><h3 id="-tipi-di-grafo"><strong><strong>📚 T</strong>ipi<strong> </strong>di Grafo</strong></h3><p>I grafi sono classificati in base alle caratteristiche delle loro connessioni. <strong>Vediamoli in dettaglio<strong>! <strong><strong>😃</strong></strong></strong></strong></p><h4 id="1-grafi-orientati"><strong><strong>1️⃣ </strong>Grafi Orientati</strong></h4><p><strong>Nei grafi orientati, le connessioni hanno una direzione. </strong>Vanno da un nodo all'altro, e non c'è modo di tornare al nodo iniziale usando quella connessione.</p><p>Come puoi vedere nel diagramma qui sotto, <strong>le connessioni ora hanno delle frecce che puntano verso una specifica direzione. Pensa a queste connessioni come a strade a senso unico</strong>. Puoi andare in una direzione per raggiungere la tua destinazione, ma non puoi tornare indietro facendo la stessa strada, devi cercare un percorso alternativo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/9KWaj30YcJDBhvteJvkQQ7YvOu3PVaPBaXpw" class="kg-image" alt="9KWaj30YcJDBhvteJvkQQ7YvOu3PVaPBaXpw" width="623" height="366" loading="lazy"><figcaption>Grafo Orientato</figcaption></figure><p>🍕 Per esempio se per un servizio di consegna pizza a domicilio creiamo un grafo &nbsp;che rappresenta una città, due case (i nodi) potrebbero essere <strong>connesse da una strada a senso unico</strong>. Potresti andare dalla casa A alla casa B passando per questa strada, ma non potresti ritornare, quindi dovresti utilizzare un percorso alternativo.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/U7ZcYL5X54m06sKCuQ3wv8K2-Ka7ixE67nxg" class="kg-image" alt="U7ZcYL5X54m06sKCuQ3wv8K2-Ka7ixE67nxg" width="655" height="498" loading="lazy"></figure><p><strong><strong><strong><strong>💡</strong></strong> Not</strong>a<strong>: </strong></strong>In un grafo orientato, <strong>potresti non essere in grado di ritornare al tuo luogo di partenza in alcun modo</strong> se non esiste un percorso con le direzioni appropriate. 😞 Nel diagramma che segue, puoi notare che puoi andare dal nodo viola a quello verde, ma puoi vedere anche che non c'è modo di tornare dal nodo verde a quello viola, in quanto le connessioni sono "strade a senso unico".</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/CPepyBE1XXy7fcXemQXQZGbncbZ4RCPH9Ezx" class="kg-image" alt="CPepyBE1XXy7fcXemQXQZGbncbZ4RCPH9Ezx" width="800" height="382" loading="lazy"><figcaption>Punto di non ritorno</figcaption></figure><h4 id="2-grafi-non-orientati"><strong><strong>2️⃣ </strong>Grafi Non Orientati</strong></h4><p><strong><strong>In </strong>questo tipo di grafi, le connessioni non sono orientate (non hanno una direzione specifica)<strong>. </strong></strong>Pensa a questo tipo di connessioni come a strade a doppio senso. Puoi andare da un nodo all'altro e tornare indietro usando lo stesso "percorso".</p><p><strong><strong><strong><strong>💡</strong></strong> Not</strong>a<strong>: </strong></strong>Quando vedi un diagramma di un grafo dove le connessioni non hanno frecce che puntano verso una specifica direzione, puoi assumere che il grafo non è orientato.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-10-08-54-31.png" class="kg-image" alt="kgILL-2f3arDbAUOwFKLRFxp2khpvvZ5J9vF" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2023/07/Screenshot-from-2023-07-10-08-54-31.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2023/07/Screenshot-from-2023-07-10-08-54-31.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2023/07/Screenshot-from-2023-07-10-08-54-31.png 1216w" sizes="(min-width: 720px) 720px" width="1216" height="695" loading="lazy"></figure><p>🍕 Per il nostro servizio di consegna pizze a domicilio significherebbe che il veicolo per le consegna può andare <strong>dalla sorgente alla destinazione e tornare indietro usando la stessa strada o percorso</strong> (con sollievo del guidatore! 😇).</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/ijCoLsVRLPWxVTmUI13tnv-aTOtyiHHonk11" class="kg-image" alt="ijCoLsVRLPWxVTmUI13tnv-aTOtyiHHonk11" width="651" height="483" loading="lazy"></figure><p>Nel grafo qui sotto potresti andare <strong>dal nodo viola a quello verde e tornare indietro seguendo lo stesso percorso</strong>, quindi non raggiungerai un punto di non ritorno. 😌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/Fe2wHkUPwhxYxdd9LXschmm2VfNaMhiiHJrb" class="kg-image" alt="Fe2wHkUPwhxYxdd9LXschmm2VfNaMhiiHJrb" width="800" height="401" loading="lazy"><figcaption>Puoi tornare indietro!</figcaption></figure><h3 id="-pesi-s-pesi-"><strong><strong>🏋 </strong>Pesi<strong>? — </strong>Sì, Pesi<strong>!</strong></strong></h3><h4 id="1-grafici-ponderati"><strong><strong>1️⃣ </strong>Grafici Ponderati</strong></h4><p><strong>Nei grafici ponderati, ciascuna connessione ha un valore associato (chiamato peso<strong>)</strong></strong>. Questo valore viene usato per rappresentare una data relazione quantificabile tra i nodi che collega.</p><p>Per esempio i pesi potrebbero rappresentare <strong>distanza, tempo, il numero di connessioni condivise tra due utenti in un</strong> <strong><strong>social network,</strong></strong> o qualsiasi cosa che potrebbe essere usata per descrivere la connessione tra nodi nel contesto nel quale stai lavorando.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/H1ASU4s0MP52QUyuqo4LIjlvZcR4kn7lkq2V" class="kg-image" alt="H1ASU4s0MP52QUyuqo4LIjlvZcR4kn7lkq2V" width="646" height="389" loading="lazy"><figcaption>Grafico Ponderato</figcaption></figure><p>Questi pesi sono usati dall'<strong><a href="https://www.freecodecamp.org/italian/news/lalgoritmo-dei-cammini-minimi-di-dijkstra-una-dettagliata-introduzione-grafica/">algoritmo di Dijkstra</a></strong> per ottimizzare le rotte per trovare i percorsi più brevi o meno costosi tra i nodi in una rete.</p><h4 id="2-grafi-non-ponderati"><strong><strong>2️⃣ </strong>Grafi Non Ponderati</strong></h4><p>Nei grafi non ponderati, al contrario, <strong>non abbiamo pesi associati alle loro connessioni</strong>. Un esempio di questo tipo di grafo si può trovare nei social network, dove le connessioni tra due utenti non possono essere quantificate. Pertanto la connessione non ha un peso.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/y5vDbTl6r5SZOxsjcpI1U68DuWFIe3D4zC6h" class="kg-image" alt="y5vDbTl6r5SZOxsjcpI1U68DuWFIe3D4zC6h" width="624" height="366" loading="lazy"><figcaption>Grafo non ponderato</figcaption></figure><p><strong><strong><strong><strong>💡</strong></strong> Not</strong>a<strong>: </strong></strong>Potresti aver notato che, fino ad ora, i nostri grafi hanno solo una connessione che connette ciascuna coppia di nodi. È normale chiedersi se potrebbero esserci più connessioni tra una coppia di nodi. In effetti questo è possibile con i &nbsp;<strong><a href="https://it.wikipedia.org/wiki/Multigrafo">Multigrafi</a></strong>! Essi possono avere più connessioni che connettono la stessa coppia di nodi.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/xE-qHRQhhKaBVgPhgm2xRzk6OJj5R1G2wtyd" class="kg-image" alt="xE-qHRQhhKaBVgPhgm2xRzk6OJj5R1G2wtyd" width="605" height="175" loading="lazy"><figcaption>Multigrafo.</figcaption></figure><h3 id="-numero-di-connessioni-un-fattore-importante"><strong><strong>🏆 Num</strong>ero di Connessioni<strong>! — </strong>Un Fattore Importante</strong></h3><p>È molto importante sapere se un grafo ha molte o poche connessioni in quanto questo è un fattore cruciale per decidere come vorrai rappresentare questa struttura dati nel tuo codice. <strong>Vediamo i diversi tipi<strong>! <strong><strong>👍</strong></strong></strong></strong></p><h4 id="1-grafo-denso"><strong><strong>1️⃣ </strong>Grafo Denso</strong></h4><p><strong>Sono i grafi che hanno molte connessioni. Ma, un momento<strong>! ⚠️ </strong></strong>So quello che starai pensando, come puoi quantificare "molte connessioni"? Questo è piuttosto soggettivo, giusto? 😇 Sono d'accordo con te, quindi quantifichiamole:</p><p>👉 <strong>Troviamo il numero massimo di connessioni in un grafo orientato. </strong>Se ci sono <code><strong><strong><strong><strong>|V|</strong></strong></strong></strong></code> nodi in un grafo orientato (sei, nell'esempio qui sotto), vuol dire che ogni nodo può avere fino a &nbsp;<code><strong><strong><strong><strong>|v|</strong></strong></strong></strong></code> connessioni (nell'esempio qui sotto, sei).</p><p>Questo perché <strong>ogni nodo potrebbe potenzialmente essere connesso con tutti gli altri nodi e con sé stesso</strong> (vedi il "loop" qui sotto). Pertanto il numero massimo di connessioni che il grafo può avere è <strong><strong><strong><strong> </strong></strong></strong></strong><code><strong><strong><strong><strong>|V|*|V|</strong></strong></strong></strong></code> , che rappresenta il numero totale di nodi moltiplicato per il numero massimo di connessioni che ogni nodo può avere.</p><p><strong>Quando il numero di connessioni nel grafo è vicino al numero massimo di connessioni, il grafo è denso<strong>. <strong><strong>😉</strong></strong></strong></strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/vyGE1CPDiqcjBx1X8BGpFt0bUXOWpn4CZABy" class="kg-image" alt="vyGE1CPDiqcjBx1X8BGpFt0bUXOWpn4CZABy" width="663" height="382" loading="lazy"><figcaption>Grafo.</figcaption></figure><p>💡 <strong><strong><strong><strong>Not</strong></strong></strong>a<strong><strong><strong>:</strong></strong></strong></strong> I “loop” si verificano quando un nodo ha una connessione che connette se stesso. Strano e interessante, vero? 😄</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/IDjXVX7CPToN73P5GO73qHdJBL1hhgS7msMV" class="kg-image" alt="IDjXVX7CPToN73P5GO73qHdJBL1hhgS7msMV" width="135" height="169" loading="lazy"><figcaption>Rappresentazione di un “loop”.</figcaption></figure><h4 id="2-grafi-sparsi"><strong><strong>2️⃣ Gra</strong>fi Sparsi</strong></h4><p><strong>I grafi sparsi hanno poche connessioni. </strong>Come puoi vedere nel diagramma qui sotto, non ci sono molte connessioni tra i nodi.</p><p><strong>Quando il numero di connessioni in un grafo è significativamente minore del numero massimo di connessioni, il grafo è sparso<strong><strong><strong>. 😉</strong></strong></strong></strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/i4OsBT4deG6soapNSKKTq-1DSQbV5vOFcBrN" class="kg-image" alt="i4OsBT4deG6soapNSKKTq-1DSQbV5vOFcBrN" width="647" height="379" loading="lazy"><figcaption>Grafo Sparso</figcaption></figure><h3 id="-ti-presento-i-cicli-"><strong><strong>⭕️ </strong>Ti Presento i Cicli<strong>!</strong></strong></h3><p><strong>Ora vediamo un concetto vitale per comprendere i grafi, i cicli<strong>.</strong></strong></p><p>Avrai probabilmente notato che, se segui una sequenza di connessioni in un grafo, potresti trovare il <strong>percorso che ti riporta allo stesso nodo</strong>. Questo è come "girare in tondo", esattamente come se stessi guidando per la tua città e prendessi un percorso che ti potrebbe portare al punto di partenza.</p><p><strong>Nei grafi, questi percorsi "circolari" sono chiamati cicli</strong>. Sono <strong>percorsi validi che iniziano e finiscono allo stesso nodo</strong>. Per esempio, nel diagramma qui sotto, puoi vedere che partendo da qualsiasi nodo puoi ritornarci seguendo le connessioni.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/f6A1AD4qMi8BlEgralqX1tFbjkurgOTrb21K" class="kg-image" alt="f6A1AD4qMi8BlEgralqX1tFbjkurgOTrb21K" width="386" height="372" loading="lazy"><figcaption>Ciclo semplice</figcaption></figure><p><strong>I cicli non sono sempre "isolati" in quanto possono fare parte di un grafo più grande</strong>. Puoi rilevarli facendo partire la tua ricerca da uno specifico nodo e cercando un percorso che ti riporta allo stesso nodo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/r2bS-ZNjPVqOXoOq3Z7OJrNoWCSLqemZzkmv" class="kg-image" alt="r2bS-ZNjPVqOXoOq3Z7OJrNoWCSLqemZzkmv" width="794" height="538" loading="lazy"><figcaption>Un ciclo in un grafo</figcaption></figure><h3 id="-riepilogando-"><strong><strong>👋 </strong>Riepilogando <strong>…</strong></strong></h3><ul><li><strong>I grafi sono strutture meravigliose</strong> che puoi usare quotidianamente tramite Google Search, Google Maps, GPS e i social media.</li><li>Sono usati per <strong>rappresentare elementi che condividono connessioni</strong>.</li><li>Gli elementi nel grafo sono chiamati <strong>nodi</strong> <strong>(nodes)</strong> i collegamenti tra loro <strong>connessioni (edges)</strong>.</li><li>I grafi possono essere <strong>orientati</strong>, quando le loro connessioni hanno uno specifico orientamento, simili alle strade a senso unico, oppure <strong>non orientati</strong>, quando le connessioni non hanno un orientamento specifico, simili alle strade a doppio senso.</li><li>Le connessioni possono avere un valore associato ad esse, chiamato <strong>peso</strong>.</li><li>Se un grafo ha molte connessioni si dice <strong>denso</strong>, altrimenti, se ha poche connessioni, viene detto <strong>sparso</strong>.</li><li>Una serie di connessioni può formare un <strong>ciclo</strong> se esse creano un percorso che ti consente di tornare al nodo di partenza.</li></ul><p><strong>Continua ad apprendere queste stupende strutture! Ne varrà sicuramente la pena per il tuo futuro di programmatore. </strong>In questo momento sto imparando le strutture dati e le trovo assolutamente affascinanti. 😃 🎆 ❤️</p><blockquote><em>La cosa importante è non smettere di fare domande. La curiosità esiste per ragioni proprie<em>. — Albert Einstein</em></em></blockquote><h4 id="-grazie-"><strong><strong>👋 </strong>Grazie<strong>!</strong></strong></h4><p>Spero davvero che tu abbia apprezzato il mio articolo. ❤️<br>Seguimi su<strong><strong> </strong></strong><a href="https://twitter.com/EstefaniaCassN">Twitter</a>. 😃</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come spiegare concetti di programmazione orientata agli oggetti a un bambino di 6 anni ]]>
                </title>
                <description>
                    <![CDATA[ Hai notato come durante i colloqui di lavoro vengono fatte sempre le stesse domande, ancora e ancora? Sono sicuro che sai cosa voglio dire. Ad esempio: > Dove ti vedi tra cinque anni? o ancora peggio: > Quale pensi che sia il tuo più grande punto debole? Datemi tregua. Rispondere ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-spiegare-concetti-di-programmazione-orientata-agli-oggetti-a-un-bambino-di-6-anni/</link>
                <guid isPermaLink="false">62f286d15cda1d06d40dd702</guid>
                
                    <category>
                        <![CDATA[ programmazione ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Tue, 30 Aug 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/08/1_EirXoYV7GgRi4frvcW-b0A.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to explain object-oriented programming concepts to a 6-year-old</a>
      </p><p>Hai notato come durante i colloqui di lavoro vengono fatte sempre le stesse domande, ancora e ancora?</p><p>Sono sicuro che sai cosa voglio dire.</p><p>Ad esempio:</p><blockquote>Dove ti vedi tra cinque anni?</blockquote><p>o ancora peggio:</p><blockquote>Quale pensi che sia il tuo più grande punto debole?</blockquote><p>Datemi tregua. Rispondere a questo domanda è un punto debole! In ogni caso, non è questo il punto.</p><p>Saranno anche delle domande banali, ma sono importanti perché danno delle informazioni su di te: il tuo stato d'animo attuale, la tua mentalità, il tuo punto di vista.</p><p>Quando rispondi, dovresti fare attenzione, per evitare di dire cose di cui potresti pentirti.</p><p>Oggi voglio parlare di una domanda di una tipologia simile a questa nel mondo della programmazione:</p><blockquote>Quali sono i principi fondamentali della programmazione orientata agli oggetti?</blockquote><p>Mi sono trovato da entrambi i lati di questa domanda. È uno di quegli argomenti che vengono chiesti spesso e che non puoi permetterti di non conoscere.</p><p>Di solito, gli sviluppatori junior ed entry-level si trovano a dover rispondere a questa domanda, perché è un modo per chi gestisce il colloquio per capire tre cose:</p><ol><li><strong>Il candidato si è preparato per il colloquio<strong>?</strong></strong><br>Punti bonus per una risposta immediata — dimostra un approccio serio.</li><li><strong>Il candidato ha passato la fase tutorial<strong>?</strong></strong><br>Capire i principi della programmazione orientata agli oggetti (OOP) dimostra di essere andati oltre il copia e incolla dai tutorial e di vedere le cose da una prospettiva più alta.</li><li><strong>Il candidato possiede una comprensione profonda o superficiale<strong>?</strong></strong><br>Il livello di competenza su questo argomento spesso eguaglia quello di molti altri. Fidati.</li></ol><p>I quattro principi della programmazione orientata agli oggetti sono <strong>incapsulamento</strong>, <strong>astrazione</strong>, <strong>ereditarietà<strong> </strong></strong>e <strong>polimorfismo</strong>.</p><p>Queste parole potrebbe spaventare uno sviluppatore principiante. E, nel complesso, le spiegazioni eccessivamente lunghe su Wikipedia a volte raddoppiano la confusione.</p><p>Ed è per questo che voglio fornire una spiegazione semplice, breve e chiara per ognuno di questi concetti. Potrebbe sembrare qualcosa da spiegare a un bambino, ma in realtà è proprio ciò che vorrei sentirmi rispondere durante un colloquio.</p><h3 id="incapsulamento"><strong>Incapsulamento</strong></h3><p>Diciamo di avere un programma con pochi oggetti che hanno diverse logiche e che possono comunicare tra di loro – secondo le regole definite nel programma.</p><p>L'incapsulamento viene raggiunto quando ogni oggetto mantiene <strong>privato </strong>il suo stato all'interno di una classe. Gli altri oggetti non hanno accesso diretto al suo stato, ma possono soltanto chiamare una lista di funzioni pubbliche – chiamate metodi.</p><p>Quindi, l'oggetto gestisce il suo stato attraverso dei metodi – e nessuna altra classe può modificarlo se non autorizzata esplicitamente. Se vuoi comunicare con l'oggetto, dovresti usare i metodi forniti, ma (di default) non puoi cambiarne lo stato.</p><p>Diciamo che stai costruendo un piccolo gioco di simulazione. Ci sono delle persone e c'è un gatto, che comunicano tra di loro. Vogliamo applicare l'incapsulamento, quindi incapsuliamo tutta la logica del gatto nella classe <code>Cat</code>. Potrebbe avere questo aspetto:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/M4t8zW9U71xeKSlzT2o8WO47mdzrWkNa4rWv" class="kg-image" alt="M4t8zW9U71xeKSlzT2o8WO47mdzrWkNa4rWv" width="800" height="522" loading="lazy"><figcaption>Puoi dare da mangiare al gatto (usando il metodo pubblico Feed), ma non puoi andare a modificare <em>direttamente </em>quanto è affamato (hungry).</figcaption></figure><p>In questo caso, lo "stato" del gatto è costituito dalle <strong>variabili private</strong> <code>mood</code>, <code>hungry</code>, <code>energy</code> e dal metodo privato <code>meow()</code>, che il gatto può chiamare ogni volta che vuole, mentre le altre classi non possono.</p><p>Ciò che possono fare è definito nei <strong>metodi pubblici </strong> <code>sleep()</code>, <code>play()</code> e <code>feed()</code>.<em><em> </em></em>Ognuno di questi modifica in qualche modo lo stato interno e può invocare <code>meow()</code>.<em><em> </em></em>Quindi, viene stabilito un legame tra lo stato privato e i metodi pubblici.</p><p>Questo è l'incapsulamento.</p><h3 id="astrazione"><strong>Astrazione</strong></h3><p>L'astrazione può essere intesa come un'estensione naturale dell'incapsulamento.</p><p>Nel design orientato agli oggetti, i programmi sono spesso estremamente estesi e oggetti separati comunicano molto tra di loro. Quindi gestire un codebase così esteso per anni – senza cambiamenti strada facendo – è complicato.</p><p>L'astrazione è un concetto finalizzato a semplificare questo problema.</p><p>Applicare un'astrazione significa che ogni oggetto dovrebbe mettere in mostra solo un meccanismo di alto livello.</p><p>Questo meccanismo dovrebbe nascondere i dettagli interni di implementazione, rivelando solamente le operazioni rilevanti per gli altri oggetti.</p><p>Pensa a una macchina del caffè. Fa un sacco di roba e produce rumori bizzarri dal suo interno. Ma tutto ciò che devi fare è mettere dentro il caffè e premere un bottone.</p><p>Preferibilmente, questo meccanismo dovrebbe essere facile da utilizzare e dovrebbe cambiare di rado. Pensa a un piccolo insieme di metodi pubblici che ogni altra classe può chiamare senza "conoscere" come funzionano.</p><p>Un altro esempio pratico di astrazione?<br>Pensa a come usi il tuo cellulare:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/hiX0NQOcZFShroq-a3FM5pFP2LV4UUI5mLle" class="kg-image" alt="hiX0NQOcZFShroq-a3FM5pFP2LV4UUI5mLle" width="796" height="451" loading="lazy"><figcaption>I telefoni cellulari sono complessi, ma usarli è semplice.</figcaption></figure><p>Interagisci con il tuo cellulare usando solamente pochi pulsanti. Cosa accade al suo interno? Non c'è bisogno che tu lo sappia – i dettagli di implementazione sono nascosti. Devi soltanto conoscere una breve lista di azioni.</p><p>I cambiamenti nell'implementazione – ad esempio, un aggiornamento del software – raramente influiscono sull'astrazione di cui fai uso.</p><h3 id="ereditariet-"><strong>Ereditarietà</strong></h3><p>Bene, abbiamo visto come l'incapsulamento e l'astrazione possono aiutarci a sviluppare e mantenere un codebase esteso.</p><p>Ma sai qual è un altro problema comune del design della programmazione orientata agli oggetti?</p><p>Spesso gli oggetti sono molto simili. Condividono una logica comune ma non sono completamente uguali.</p><p>Dunque, come possiamo riutilizzare una logica comune ed estrarre la logica unica in una classe separata? Un modo per farlo è tramite l'ereditarietà.</p><p>Questo si traduce nella creazione di una classe (figlia) derivata da un altra classe (genitore), formando una gerarchia.</p><p>La classe figlia riutilizza tutti i campi e i metodi della classe genitore (le parti comuni) e può implementarne di propri (parte unica).</p><p>Ad esempio:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/ZIm7lFjlrKeMWxcH8fqBapNkuSJIxW9-t9yf" class="kg-image" alt="ZIm7lFjlrKeMWxcH8fqBapNkuSJIxW9-t9yf" width="800" height="502" loading="lazy"><figcaption>Un insegnante privato è un tipo di insegnante, e ogni insegnante è un tipo di persona.</figcaption></figure><p>Se il nostro programma ha bisogno di gestire insegnanti pubblici e privati, ma anche altre persone come studenti, può implementare questa gerarchia di classi.</p><p>In questo modo, a ogni classe si aggiunge soltanto ciò che le è necessario riutilizzando la logica comune della classe genitore.</p><h3 id="polimorfismo"><strong>Polimorfismo</strong></h3><p>Ed eccoci alla parola più complicata! Polimorfismo deriva dal greco e vuol dire "molte forme".</p><p>Conosciamo già il potere &nbsp;dell'ereditarietà e lo sfruttiamo volentieri. Ma ecco che arriva un problema.</p><p>Ipotizziamo di avere una classe genitore e poche classi figlie che ereditano proprietà e metodi da questa. A volte potremmo aver bisogno di usare una collezione – ad esempio una lista – che contiene un mix di tutte queste classi. Oppure abbiamo un metodo implementato per la classe genitore – ma vorremmo usarlo anche per i discendenti.</p><p>Si può risolvere tutto ciò grazie al polimorfismo.</p><p>In parole povere, il polimorfismo fornisce un modo di usare una classe esattamente come il suo genitore, così che non ci sia confusione data dal mix dei vari tipi. Ma ogni classe figlia mantiene i propri metodi tal quali.</p><p>Questo avviene tipicamente definendo un'interfaccia (genitore) da riutilizzare. Definisce un gruppo di metodi comuni. Poi, ogni classe figlia implementa la propria versione di questi metodi.</p><p>Ogni volta che una collezione (come una lista) o un metodo si aspetta una istanza del genitore (in cui sono definiti i metodi comuni), il linguaggio si occupa di valutare l'implementazione corretta per il metodo comune – indipendentemente da quale figlio gli viene passato.</p><p>Dai un'occhiata allo schizzo dell'implementazione delle figure geometriche qui sotto. Riutilizzano un'interfaccia comune per calcolare l'area e il perimetro:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/8GySv1U8Kh9nVVyiTqv5cDuWZC7p0uARVeF0" class="kg-image" alt="8GySv1U8Kh9nVVyiTqv5cDuWZC7p0uARVeF0" width="800" height="599" loading="lazy"><figcaption>Triangolo, Cerchio e Rettangolo possono essere usati nella stessa collezione.</figcaption></figure><p>Avere tre figure che ereditano <code>Figure Interface</code> dal genitore, ti permette di creare una lista mista di <code>triangle</code>, <code>circle</code> e <code>rectangle</code>, che puoi trattare come lo stesso tipo di oggetto.</p><p>Poi, se questa lista prova a calcolare l'area di un elemento, il metodo corretto viene trovato ed eseguito. Se l'elemento è un triangolo, viene chiamata <code>CalculateSurface()</code> del triangolo. Se è un cerchio, viene chiamata <code>CalculateSurface()</code> del cerchio, e così via.</p><p>Se hai una funzione che opera con una figura usando i suoi parametri, non devi definirla tre volte – una volta per il triangolo, una volta per il cerchio e una volta per il rettangolo.</p><p>Puoi definirla una volta e accettare <code>Figura</code> come argomento. Se passi un triangolo, un cerchio o un rettangolo – finché implementano <code>CalculateParamter()</code> – il loro tipo non conta.</p><p>Spero che questo sia stato d'aiuto. Puoi usare direttamente queste stesse spiegazioni in un colloquio di lavoro.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
