Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Snapdragon Soung Gen 2 è la piattaforma Qualcomm per i dispositivi audio sempre più integrati nel mondo dell'intelligenza artificiale: al prorpio interno tanta potenza elaborativa per gestire al meglio le necessità d'uso dell'agentic AI
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-02-2010, 13: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 13:30.
omniaforever è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 13:36   #2
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13045
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, 13: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 13:59.
omniaforever è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 14: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 14:50.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 15: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 16:02.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2010, 19: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, 21: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, 00: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


Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Eni mette un tetto ai prezzi dei carbura...
BYD Seagull (Dolphin Surf), l'elettrica ...
Multa milionaria per un data center del ...
F-Droid 2.0 si aggiorna con una nuova gr...
Microsoft ridisegna Copilot: dalla chat ...
Volkswagen porterà 20 videogiochi...
Troppa IA storpia: OpenAI licenzia in tr...
Marathon, Bungie svela i contenuti dell'...
Autunno, tempo di potature: i tagliasiep...
Meta Muse, due sviluppatori riescono a o...
Google AI Pro gratis: festa a sorpresa p...
MacSync colpisce macOS usando i calendar...
L'agente IA cancella 48 mila file in 103...
Jensen Huang avverte: l'AI può aiutare a...
Elettrico Renault in arrivo in Spagna: 6...
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: 03:30.


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