Ordinamento cronologico di un vettore di struct

di il
12 risposte

Ordinamento cronologico di un vettore di struct

Ciao a tutti devo ordinare cronologicamente (considerando data e ora) una grande quantità di dati acquisita da un file .csv e già elaborata ed inserita in un vector<struct>:

  struct LetturaDaContatore {
    int year;
    int month;
    int day;
    int hh;
    int mm;
    int ss;
    int consumption;
    string custumer;
};
Con alcuni suggerimenti e aiuti sono arrivato a mettere insieme questo algoritmo che funziona ma una volta dato il file con tutti i dati in input risulta lento e impossibile da elaborare totalmente...

long int valuta (LetturaDaContatore x)
{
    return (x.ss)+(x.mm)*60+(x.hh)*3600+(x.day)*3600*24+(x.month)*3600*24*31+(x.year)*3600*24*365;
}

vector<LetturaDaContatore> ordina (vector<LetturaDaContatore> data){
    unsigned i, j;
    vector<LetturaDaContatore> sortedData;
    long int current=0;
    LetturaDaContatore temp;
    
    for(i = 0; i<data.size(); i++){
        bool inserita=false;
        for (int k=0; k<sortedData.size(); k++){
            if (valuta(data[i]) != valuta(sortedData[k]))
                inserita=false;
            else {
                inserita=true;
                break;
            }
        }
        if (inserita==false){
            current = valuta(data[i]);
            temp = data[i];
            for(j = 0; j<data.size();j++){
                if (valuta(data[j]) < current){
                    bool trovata = false;
                    for (int k=0; k<sortedData.size(); k++){
                        if (valuta(data[j]) != valuta(sortedData[k]))
                            trovata=false;
                        else {
                            trovata=true;
                            break;
                        }
                    }
                    if (trovata == false){
                        current= valuta(data[j]);
                        temp= data[j];
                    }
                    
                }
            }
            
            sortedData.push_back(temp);
        }
    }
    
    return sortedData;
}

qualcuno riesce a suggerirmi un algoritmo più "intelligente". Si tratta di un file csv di 1597284 righe.

12 Risposte

  • Re: Ordinamento cronologico di un vettore di struct

    Non ho capito come fai quell'ordinamento ma dovresti abbandonare quel codice ed usare il metodo std::sort
    
    #include <algorithm>:
    
    std::sort(data.begin(), data.end());
    
    ridefinendo l'operatore < nella struttura
    
    bool operator < (const LetturaDaContatore& itm) const
    
  • Re: Ordinamento cronologico di un vettore di struct

    Ok! ma come posso fare in modo che confronti i dati mediante la funzione valuta?
    
    
    long int valuta (LetturaDaContatore x)
    {
        return (x.ss)+(x.mm)*60+(x.hh)*3600+(x.day)*3600*24+(x.month)*3600*24*31+(x.year)*3600*24*365;
    }
    
  • Re: Ordinamento cronologico di un vettore di struct

    Usi la valuta nel codice dell'operatore <
  • Re: Ordinamento cronologico di un vettore di struct

    Capito! La ridefinizione dell'operatore comporta l'uso delle classi?
    Quando mi hai detto di ridefinire l'operatore con struttura intendevi nella struct?
  • Re: Ordinamento cronologico di un vettore di struct

    Si, nella struct
  • Re: Ordinamento cronologico di un vettore di struct

    Ho provato in questo modo nella struct:
    struct LetturaDaContatore {
        int year=0;
        int month=0;
        int day=0;
        int hh=0;
        int mm=0;
        int ss=0;
        int consumption=0;
        int valuta = (ss)+(mm)*60+(hh)*3600+(day)*3600*24+(month)*3600*24*31+(year)*3600*24*365;
        bool operator < (const LetturaDaContatore &itm) const {return valuta < itm.valuta;};
        string custumer;
    };
    
    e ho aggiunto la funzione sort nell'ordinamento:
    
    #ifndef order_h
    #define order_h
    
    #include "data.h"
    #include <stdio.h>
    #include <algorithm>
    
    long int valuta (LetturaDaContatore x)
    {
        return (x.ss)+(x.mm)*60+(x.hh)*3600+(x.day)*3600*24+(x.month)*3600*24*31+(x.year)*3600*24*365;
    }
    
    vector<LetturaDaContatore> ordina (vector<LetturaDaContatore> data){
        
        sort(data.begin(), data.end());
        
        return data;
    }
    
    #endif /* order_h */
    
    tuttavia risulta ancora non ordinata
  • Re: Ordinamento cronologico di un vettore di struct

    stefanoferrario ha scritto:


    Ho provato in questo modo nella struct:
    struct LetturaDaContatore {
        int year=0;
        int month=0;
        int day=0;
        int hh=0;
        int mm=0;
        int ss=0;
        int consumption=0;
        int valuta = (ss)+(mm)*60+(hh)*3600+(day)*3600*24+(month)*3600*24*31+(year)*3600*24*365;
        bool operator < (const LetturaDaContatore &itm) const {return valuta < itm.valuta;};
        string custumer;
    };
    
    e ho aggiunto la funzione sort nell'ordinamento:
    
    #ifndef order_h
    #define order_h
    
    #include "data.h"
    #include <stdio.h>
    #include <algorithm>
    
    long int valuta (LetturaDaContatore x)
    {
        return (x.ss)+(x.mm)*60+(x.hh)*3600+(x.day)*3600*24+(x.month)*3600*24*31+(x.year)*3600*24*365;
    }
    
    vector<LetturaDaContatore> ordina (vector<LetturaDaContatore> data){
        
        sort(data.begin(), data.end());
        
        return data;
    }
    
    #endif /* order_h */
    
    tuttavia risulta ancora non ordinata
  • Re: Ordinamento cronologico di un vettore di struct

    Ciao, non ho più ricevuto alcuna risposta... qualcuno sa darmi qualche indicazione?

    Grazie mille!!
  • Re: Ordinamento cronologico di un vettore di struct

    Io sarei solamente in grado di suggerirti un algoritmo di complessità nlogn:
    https://it.wikipedia.org/wiki/Quicksor

    Saluti
  • Re: Ordinamento cronologico di un vettore di struct

    Ho già tentato una soluzione del genere ma con algoritmi del genere impiega davvero troppo tempo!
  • Re: Ordinamento cronologico di un vettore di struct

    Per quanto ne so i migliori algoritmi di ordinamento basati sul confronto, hanno quel genere di complessità.
    Ma quanto lo vorresti veloce?? su 1 milione di dati non ci dovrebbe mettere poi cosi tanto
  • Re: Ordinamento cronologico di un vettore di struct

    stefanoferrario ha scritto:


    Ho già tentato una soluzione del genere ma con algoritmi del genere impiega davvero troppo tempo!
    Hai davvero usato il quicksort e non va bene? Sicuro? Lo mostri il codice che hai usato?
Devi accedere o registrarti per scrivere nel forum
12 risposte