Torna indietro   Hardware Upgrade Forum > Software > Programmazione

BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-02-2010, 14:08   #1
omniaforever
Senior Member
 
Iscritto dal: Apr 2009
Messaggi: 1926
soluzione algoritmica

allora ragazzi, mi servirebbe un aiuto algoritmico..
in c# ma alla fin anche in pseudo codice mi sta bene..

sostanzialmente io ho una stringa del genere(con più coppie di numeri, anche formati da più cifre):
1-2|2-3|3-4|5-6|6-7|8-9
dovrei suddividerla in sottostringhe in modo da avere in ognuna di esse tutte le coppie del tipo a-b mostrate in precedenza che contengono un elemento in comune,..nel caso
sottostringa a) 1-2-3-4 (ma mi starebbe bene anche in 1-2-2-3-3-4, che deriva dall'unione di 1-2 con 2-3 e 2-3 con 3-4 che contengono i primi il 2 in comune e i secondi il 3)

sottostringa b) 5-6-7 (o 5-6-6-7 che derivano dall'unione di 5-6 con 6-7)

sottostringa c) 8-9

premesso che so come splittare in sottostringhe in coppie a-b(splitting sul carattere |), ed inoltre estrarre da ognuna di queste coppie il singolo numero a o b (ulteriore spit sul carattere -), ma mi interessava proprio la soluzione algoritmica per ottenere ciò che voglio..
grazie
__________________
Come installare la rom cucinata V11-7 fixed di Hyperx:
http://www.hwupgrade.it/forum/showpo...ostcount=21774

Ultima modifica di omniaforever : 20-02-2010 alle 14:30.
omniaforever è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 14:36   #2
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13069
In pratica se ho capito bene vorresti estrarre da:

1-2 e 2-3

1-3? giusto?

Se è così non dovrebbe essere molto complicato, dovresti tener conto in pratica degli elementi:

(a, b) (c, d) tali che b=c e a quel punto derivare la nuova coppia (a, d).
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 14:57   #3
omniaforever
Senior Member
 
Iscritto dal: Apr 2009
Messaggi: 1926
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
In pratica se ho capito bene vorresti estrarre da:

1-2 e 2-3

1-3? giusto?

Se è così non dovrebbe essere molto complicato, dovresti tener conto in pratica degli elementi:

(a, b) (c, d) tali che b=c e a quel punto derivare la nuova coppia (a, d).
no, voglio creare diverse concatenazioni che mi uniscono tutte le coppie a-b che hanno almeno un elemento in comune: cioè se ho a1-b1 e a2-b2 deve accadere che a1==a2 oppure a1==b2 oppure b1==a2 oppure b1==b2 ed in questo caso concatenerò
nel caso 1-2|2-3|3-4|5-6|6-7|8-9, lo concatnazioni finali dovranno essere 1-2|2-3|3-4( semplificando togliendo i doppioni:1-2-3-4) poi 5-6|6-7(senza doppioni 5-6-7) e poi 8-9
__________________
Come installare la rom cucinata V11-7 fixed di Hyperx:
http://www.hwupgrade.it/forum/showpo...ostcount=21774

Ultima modifica di omniaforever : 20-02-2010 alle 14:59.
omniaforever è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 15:44   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Edita il titolo perche' non e' conforme.

Inizio con una proposta bruta e poco efficiente.
Complessita' O(N^2 Log N)

Codice:
class Program
{
    static void Main(string[] args)
    {
        string src = "1-2|5-6|3-2|6-7|9-8|3-4";

        var coupleStrings = src.Split('|');

        // Parso e ordino le coppie secondo l'elemento minore
        var CoupleOrdered = coupleStrings.Select(cs => new Couple(cs))
                                         .OrderBy(cp => cp.NumA)
                                         .ToArray();            
                          
        // Conterra' per ciascuna coppia ordinata quale e' il suo gruppo finale         
        Dictionary<int, int> Clusters = new Dictionary<int, int>();

        // Costruisco i Cluster.
        // Doppio ciclo O(N^2)
        // Per ciascun elemento se ancora non fa parte di un cluster
        //  Ne creo uno e ve lo assegno.
        // Ciclo sui successivi e ciascuno di quelli che sono insieme al pilota
        // li assegno allo stesso cluster del pilota.            
        int maxGroup=0;
        int ln = CoupleOrdered.Count();
        for (int t = 0; t < ln; t++)
        {
            int CurrentGroup;
            Couple reference = CoupleOrdered[t];
            if (!Clusters.TryGetValue(t, out CurrentGroup))
            {
                Clusters[t] = maxGroup;
                CurrentGroup = maxGroup;
                maxGroup++;
            }
            
            for (int u = t+1; u < ln; u++)
            {
                Couple other = CoupleOrdered[u];
                if (reference.IsTogetherWith(other))
                {
                    Clusters[u] = CurrentGroup;
                }
            }
        }

        // Raggruppo i Cluster di Couple secondo l'ordinale di gruppo
        // Per ogni elemento del gruppo considero la coppia originale
        // Della coppia originale ottengo l'array dei suoi 2 valori
        // Per ciasucn cluster quindi unisco insieme tutti
        //   gli array da 2 valori di tutte le coppie (SelectMany)
        // Ottengo quindi un array di stringhe per ciascun gruppo
        // Spool-out di un record per gruppo, con l'ordinale e la stringa
        //    composta dai valori distinti e ordinati comma-separated 
        var res = from cluster in Clusters
                  group cluster by cluster.Value into grp
                  let OriginalValues = grp.Select(gr => gr.Key)
                                          .SelectMany(oi=>CoupleOrdered[oi].DNum)                                                          
                                          .Distinct()
                                          .OrderBy(oi=>oi)
                                          .Select(oi=>oi.ToString())
                                          .ToArray()
                  select new
                  {
                      GrpKey = grp.Key,
                      Data = string.Join(",", OriginalValues)
                  };
                  
        // Spool-out su Console.
        var resFinalizer = res.ToList();
        resFinalizer.ForEach(Console.WriteLine);
        Console.ReadKey();
    }

    public class Couple
    {                        
        public Couple(string src)                
        {
            var strspl = src.Split('-');
            int numA = int.Parse(strspl[0]);
            int numB = int.Parse(strspl[1]);                
            NumA = Math.Min(numA, numB);
            NumB = Math.Max(numA, numB);
            DNum = new int[2] { NumA, NumB };
        }
                    
        public int NumA { get; private set; }
        public int NumB { get; private set; }            
        public int[] DNum {get; private set;}

        public bool IsTogetherWith(Couple other)
        {
            return (NumA == other.NumA || NumA == other.NumB || NumB == other.NumA || NumB == other.NumB);
        }
    }
}
Risultato
Codice:
{ GrpKey = 0, Data = 1,2,3,4 }
{ GrpKey = 1, Data = 5,6,7 }
{ GrpKey = 2, Data = 8,9 }
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 20-02-2010 alle 15:50.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 16:36   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Getto anche una soluzione migliore.
O(N)
passando attraverso matrici di adiacenze e un simil algoritmo flood-fill

Lo so, oggi mia moglie lavora e non mi passa un c...o
ma ora esco e vado con un amico ai festeggiamenti del capodanno Cinese

A sto giro non commento.
Ciau.

Codice:
class Program
{
public class Couple
    {                        
        public Couple(string src)                
        {
            var strspl = src.Split('-');
            int numA = int.Parse(strspl[0]);
            int numB = int.Parse(strspl[1]);                
            NumA = Math.Min(numA, numB);
            NumB = Math.Max(numA, numB);
            DNum = new int[2] { NumA, NumB };
        }
                    
        public int NumA { get; private set; }
        public int NumB { get; private set; }            
        public int[] DNum {get; private set;}

        public bool IsTogetherWith(Couple other)
        {
            return (NumA == other.NumA || NumA == other.NumB || NumB == other.NumA || NumB == other.NumB);
        }
    }

    static void Main(string[] args)
    {
        string src = "1-2|5-6|3-2|6-7|9-8|3-4";

        var coupleStrings = src.Split('|');

        // Parso le coppie
        var Couples = coupleStrings.Select(cs => new Couple(cs))                                             
                                   .ToArray();            
        
        var Matrix = new Dictionary<int, List<int>>();            

        // Matrice Adiacenze
        foreach(var couple in Couples)            
        {
            var NumA = couple.NumA;
            var NumB = couple.NumB;
            AddMat(Matrix, NumA, NumB);
            AddMat(Matrix, NumB, NumA);
        }

        // FloodFill
        int CurGroup = 0;

        var res = new Dictionary<int, HashSet<int>>();            

        while (Matrix.Count != 0)
        {                
            var cline = Matrix.First();
            Stack<int> CurrentFiller=new Stack<int>(cline.Value);                
            res[CurGroup] = new HashSet<int>{cline.Key};
            Matrix.Remove(cline.Key);
            while (CurrentFiller.Count>0)
            {                
                var cd = CurrentFiller.Pop();
                res[CurGroup].Add(cd);
                List<int> brother;
                if (Matrix.TryGetValue(cd, out brother))
                {
                    CurrentFiller.PushMany(brother);
                    Matrix.Remove(cd);
                }
            }
            CurGroup++;
        }

        var spooler = from r in res
                      let vals = r.Value
                                .OrderBy(val => val)
                                .Select(val => val.ToString())
                                .ToArray()
                      select new {
                          GrpKey = r.Key,
                          Data = string.Join(",", vals)
                      };

        // Spool-out su Console.
        var resFinalizer = spooler.ToList();
        resFinalizer.ForEach(Console.WriteLine);
        Console.ReadKey();
    }

    public static void AddMat(Dictionary<int, List<int>> Matrix, int NumA, int NumB)
    {
        List<int> line;
        if (!Matrix.TryGetValue(NumA, out line))
        {
            line = Matrix[NumA] = new List<int>();
        }
        line.Add(NumB);      
    }  
}

public static class Extensions
{
    public static void PushMany<T>(this Stack<T> domain, IEnumerable<T> data)
    {
        foreach (T t in data)
            domain.Push(t);
    }
}
Risultato

Codice:
{ GrpKey = 0, Data = 1,2,3,4 }
{ GrpKey = 1, Data = 5,6,7 }
{ GrpKey = 2, Data = 8,9 }
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 20-02-2010 alle 17:02.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 20:37   #6
omniaforever
Senior Member
 
Iscritto dal: Apr 2009
Messaggi: 1926
strepitoso!grazie
__________________
Come installare la rom cucinata V11-7 fixed di Hyperx:
http://www.hwupgrade.it/forum/showpo...ostcount=21774
omniaforever è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 22:15   #7
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da omniaforever Guarda i messaggi
strepitoso!grazie
Non e' per un esercizio vero?
Perche' tanto, anche se lo fosse, ti sgamerebbero subito.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2010, 01:56   #8
omniaforever
Senior Member
 
Iscritto dal: Apr 2009
Messaggi: 1926
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Non e' per un esercizio vero?
Perche' tanto, anche se lo fosse, ti sgamerebbero subito.
nono...mi serviva questa piccola parte per la mia tesi (ed onestamente già l'avevo trovata e volevo un confronto qui..diciamo che la mia soluzione ci sta il doppio della tua prima )
__________________
Come installare la rom cucinata V11-7 fixed di Hyperx:
http://www.hwupgrade.it/forum/showpo...ostcount=21774
omniaforever è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
SpaceX e Singulus: stretto un accordo pe...
Binance avvisa: un bug di iOS mette a ri...
Apple corregge 9 vulnerabilità su iPhone...
Microsoft inaugura il Pavilion a Roma, c...
Black Friday, l'errore che può co...
Lotus avrà un V8 ibrido da 670 CV...
IBM: solo il 26% delle imprese dimostra ...
Hacker contro hacker e danni per 740.000...
Xiaomi SkyNomad, boom da 27.147 auto in ...
Logitech concede un giorno di ferie ai s...
Amazon, questi mini PC hanno un display ...
BYD prepara una rivale di smart #2? Il b...
Amazon, 3 robot tagliaerba ECOVACS GOAT ...
La cifratura di WhatsApp e Signal funzio...
Motori elettrici cinesi contro quelli oc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:34.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v