Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zadatak sa pakovanjem vremenskih intervala

[es] :: Art of Programming :: Zadatak sa pakovanjem vremenskih intervala

Strane: < .. 1 2 3 4

[ Pregleda: 8495 | Odgovora: 69 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.eunet.rs.



+171 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 10:29 - pre 188 meseci
Evo ga:


C# code

Code:

public partial class Form1 : Form
    {
        const ulong maxDateValue = 6071500800;

        ulong yearOffset = 0;
        ulong dayOffset = 0;
        ulong hourOffset = 0;
        ulong minuteOffset = 0;

        public Form1() {
            InitializeComponent();

            this.dateTimePicker1.Value = new DateTime(1900, 10, 1, 1, 1, 1);
            this.dateTimePicker2.Value = new DateTime(1900, 10, 2, 1, 1, 1);


            yearOffset = 366 * 24 * 60 * 60;
            dayOffset = 24 * 60 * 60;
            hourOffset = 60 * 60;
            minuteOffset = 60;
        }


        private ulong PairDates(DateTime d1, DateTime d2) {

            ulong x = ConvertDate(d1);
            ulong y = ConvertDate(d2);

            ulong n = maxDateValue;
            ulong m = n - x + 2;
            ulong pos = 0;

            if (m > n) {
                pos = (ulong)(maxDateValue - y + 1);
            }
            else {
                pos = (ulong)((n - m + 1) * (n + m)) / 2 + (maxDateValue - y + 1);
            }

            return pos;
        }

        private ulong ConvertDate(DateTime d) {
            return  (ulong)(d.Year - 1900) * yearOffset + (ulong)d.DayOfYear * dayOffset + (ulong)d.Hour * hourOffset + (ulong)d.Minute * minuteOffset + (ulong)d.Second;
        }

        private void UnpairDates(ulong pairDate, out DateTime d1, out DateTime d2)
        {
            bool search = true;
            ulong sum = 0;
            ulong total = 0;
            ulong stepen = 1;

            while (search) {           

                stepen = stepen << 1;                
                total += stepen;
                sum = Sum(maxDateValue, maxDateValue - total + 1);

                if (sum >= pairDate)
                {                    
                    total -= stepen;

                    stepen = 1;                 
                    total += stepen;

                    sum = Sum(maxDateValue, maxDateValue - total + 1);                    

                    if (sum >= pairDate) {
                        break;
                    }                  
                }                
            }

            ulong ud1 = total;
            sum = Sum(maxDateValue, maxDateValue - total + 2);
            ulong ud2 = maxDateValue - (pairDate - sum) + 1;


            d1 = GetDate(ud1);
            d2 = GetDate(ud2);
        }


        private DateTime GetDate(ulong pos) {
            
            ulong year = pos / yearOffset;
            ulong day = (pos - year * yearOffset) / dayOffset;

            ulong hour = (pos - year * yearOffset - day * dayOffset) / hourOffset;
            ulong minute = (pos - year * yearOffset - day * dayOffset - hour * hourOffset) / minuteOffset;
            ulong second = pos - year * yearOffset - day * dayOffset - hour * hourOffset - minute * minuteOffset;            

            DateTime d = new DateTime(1900 + (int)year, 1, 1);
            DateTime d2 = d.AddDays(day - 1);
            

            return new DateTime(d2.Year, d2.Month, d2.Day, (int)hour, (int)minute, (int)second);
        }

        private ulong Sum(ulong n, ulong m)
        {
            return ((n - m + 1) * (n + m)) / 2;
        }

        private void button1_Click(object sender, EventArgs e) {
                   
            ulong res = PairDates(dateTimePicker1.Value, dateTimePicker2.Value);

            DateTime d1;
            DateTime d2;
            
            UnpairDates(res, out d1, out d2);

            dateTimePicker3.Value = d1;
            dateTimePicker4.Value = d2;
            
            textBox1.Text = res.ToString();
            
        }
    }


Kasnije cu ulepsati malo, nemojte obracati toliko paznju na imena, refaktor kasnije, i ovako nisam pola noci spavao;

Evo i solution za VS 2005.

E sad ako ovo radi posle ide objasnjenje. Mada mozda sam negde promasio za 1 bit. :)




Prikačeni fajlovi
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 10:57 - pre 188 meseci
Na stranu refaktor, mislim da ti ovo ne radi u opstem slucaju, posto se u encodingu nadas da mudjurezulat nece preci 64 bita ;)
A i decoding ti je mnogo spor, evo vec deset minuta crunchuje dva datuma u 2091 godini i ne izgleda blizu odgovora.

Imam i ja konja za trku, samo da zavrsim testiranja :) Za sada sam na oko 6 sekundi




Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 12:01 - pre 188 meseci
Ok, gotovo, isto C#, evo encode.decode, ceo sors sa pomocnim f-jama je zakacen. Imao sam malih problema sa tacnoscu TimeSpan vrednosti kad broj sekundi prelazi 32bita, ali je to sad reseno.

Code:
        static ulong Encode2DT(DateTime start, DateTime stop)
        {
            unchecked
            {
                ulong max = getMaximumSpan();
                // skloni detalje implementacije jezika, vazno je da dobijemo broj sekundi od 1.1.1900/0:0:0
                ulong startSpan = getSeconds(start);
                ulong stopSpan = getSeconds(stop);
                // validacija opsega
                System.Diagnostics.Debug.Assert(startSpan < max);
                System.Diagnostics.Debug.Assert(stopSpan < max);

                // osiguraj da je stop>=start
                sortSpans(ref startSpan, ref stopSpan);
                ulong totalSpan = stopSpan - startSpan;

                // ok, encoding
                ulong blob = 0;
                for (ulong cnt = 1; cnt <= startSpan; cnt++) blob += (max - cnt + 1);
                blob += totalSpan;
                return blob;
            }
        }

        static void Decode2DT(ulong blob, out DateTime start, out DateTime stop)
        {
            unchecked
            {
                ulong max = getMaximumSpan();
                // validacija opsega
                System.Diagnostics.Debug.Assert(blob < getMaximumBlob());

                // decoding
                ulong startSpan = 0;
                for (ulong cnt = 1; cnt <= max; cnt++)
                    if (blob >= (max - cnt + 1)) blob -= (max - cnt + 1);
                    else { startSpan = cnt - 1; break; }

                start = getDateFromSeconds(startSpan);
                stop = getDateFromSeconds(startSpan + blob);
            }
        }



Enc D1: 1900-01-01 00:00:00
Enc D2: 2091-12-31 23:59:59
Enc Encoding...
Enc Encoded: 16924967f
Enc Vreme encodinga: 00:00:00.0020000
Dec Decoding...
Dec Vreme decodinga: 00:00:00.0010000
Dec D1: 1900-01-01 00:00:00
Dec D2: 2091-12-31 23:59:59

Enc D1: 1900-01-01 00:00:01
Enc D2: 2091-12-31 23:59:59
Enc Encoding...
Enc Encoded: 2d2492cfe
Enc Vreme encodinga: 00:00:00.0040000
Dec Decoding...
Dec Vreme decodinga: 00:00:00
Dec D1: 1900-01-01 00:00:01
Dec D2: 2091-12-31 23:59:59

Enc D1: 2091-12-31 23:59:59
Enc D2: 2091-12-31 23:59:59
Enc Encoding...
Enc Encoded: febc1ad88acf6b3f
Enc Vreme encodinga: 00:00:13.4580000
Dec Decoding...
Dec Vreme decodinga: 00:00:22.2450000
Dec D1: 2091-12-31 23:59:59
Dec D2: 2091-12-31 23:59:59


Vreme progresivno raste sto je nizi datum blizi gornjoj granici jer ima vise iteracija.

Algoritam tretira parove kao elemente gornje trougaone matrice gde je jedna 0-based koordinata pocetni trenutak, a druga koordinata broj sekundi od tad do kraja (timespan) i gde vrednosti u matrici kontinualno rastu od 0 do (n2+n)/2-1. Iako encoding moze da se optimizuje matematicki:

p1=kn- ∑_(x=0)^(k-1) x
p1=kn-((k-1)^2+k-1)/2
p1= -(k^2)/2+kn+k/2

gde je k prvi trenutak a n maximalni span
medjurezultati ovoga ne bi stali u 64 bita (ako je k 33 bita k^2 moze biti 65 bita u nasoj postavci), i ovo bismo moglid a koristimo samo uz 128bit math ekstenzije.

Dekoding sa druge strane ne vidim kako optimizovati? Matematicari?


PS: Optimizovani release build je uradio pun span encoding/decoding za 4.7s/8.3s. (Core2 8400 x64 3Ghz)


[Ovu poruku je menjao mmix dana 26.10.2008. u 13:14 GMT+1]
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
Prikačeni fajlovi
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 12:15 - pre 188 meseci
SAd sam se setio jos nesto, moze se na osnovu prednosti prvog datuma videti da li je blizi pocetku ili kraju matrice pa mogu da se naprave dva iteratora, jedan koji vozi unapred od pocetka i drugi koji vozi unazad od kraja, to bi trebalo da presece vreme na pola. Probacu kasnije, idem sad malo da oladim mozak :)


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 13:47 - pre 188 meseci
@mmix

Da, to sa trougaonom matricom je rešenje. Čim otvorim firmu imaš posao kod mene. Šalim se. Ima jedan mali problem. Odakle mi firma. Ostalo je OK.

Ne znam šta vas je to toliko namučilo oko dekodiranja, ali evo C++ rešenja, pa merite vremena. Nisam ga optimizovao do kraja. Hteo sam da koristim što manji fragment jezika, a da se ipak vide sve formule koje su potrebne u postupku. Pikirao sam na jednostavnost za posetioce koji ne znaju C++. Takođe, sav račun je u 64 bita, tj. svi međurezultati su u opsegu od 0 do 264-1.

Code:

#include <iostream>

using namespace std;

// Compiler depended code. This is definition of unsigned 64-bit integer.
// This code can be compiled using GNU C++ compiler and MinGW C++ compiler.

typedef unsigned long long int UInt64;

// March is the first month in the modified calendar (number 0).
// January and February belong to the previous year.
// March = 0, April = 1, May = 2, June = 3, July = 4, August = 5,
// September = 6, October = 7, November = 8, December = 9, January = 10, February = 11
int days_in_month[12] = {31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28};

// Converts datetime to 64-bit unsigned integer.
UInt64 to_num(int year, int month, int day, int hour, int minute, int second) {
    UInt64 result = 0;
    
    // Conversion from standard calendar to the modified calendar.
    
    if (month < 3) {
        month += 9;
        year = year - 1;
    } else
        month -= 3;
    
    // Number of days in 400 years is 365.2425*400 = 146097.
    result = result + (year/400) * 146097;
    year = year % 400;
    // Number of days in 100 years (of the rest <400 years) is 365.25*100 = 36525.
    result = result + (year/100) * 36525;
    year = year % 100;
    // Number of days in 4 years (of the rest <100 years) is 365.25*4 = 1461.
    result = result + (year/4) * 1461;
    year = year % 4;
    // Number of days in one year (of the rest <4 years) is 365.
    result = result + year * 365;
    
    // Add the number of days in previous months.
    
    for (int m = 0; m < month; m = m + 1) {
        result += days_in_month[m];
    }
    
    // Add the number of previous days in month.
    
    result = result + day - 1;
    
    // Switch to seconds
    
    result = result * (24*60*60);
    
    // Add the number of previous seconds in the day.
    
    result = result + (60*60)*hour + 60*minute + second;
    
    return result;
}

void to_datetime(UInt64 number, int &year, int &month, int &day, int &hour, int &minute, int &second) {
    // Conversion from seconds since epoch to days and seconds in day;
    
    int days = number / (24*60*60);
    int seconds = number - days * (24*60*60);
    
    int year400 = days / 146097;
    year = 400 * year400;
    days = days - year400 * 146097;
    int year100 = days / 36525;
    year = year + 100 * year100;
    days = days - year100 * 36525;
    int year4 = days / 1461;
    year = year + 4 * year4;
    days = days - year4 * 1461;
    int year1 = days / 365;
    year += year1;
    days = days - year1 * 365;
    
    int m;
    
    for (m = 0; days >= days_in_month[m]; m = m + 1) {
        days = days - days_in_month[m];
    }
    
    month = m;
    day = days + 1;
    
    hour = seconds / (60*60);
    seconds = seconds - hour * (60*60);
    minute = seconds / 60;
    seconds = seconds - minute * 60;
    second = seconds;
    
    // Conversion from modified calendar to standard calendar.
    
    if (month < 10) {
        month = month + 3;
    } else {
        month = month - 9;
        year = year + 1;
    }
}

UInt64 epoch = to_num(1901, 1, 1, 0, 0, 0);

struct DateTime {
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};

UInt64 to_num(DateTime datetime) {
    UInt64 result = to_num(datetime.year, datetime.month, datetime.day,
                           datetime.hour, datetime.minute, datetime.second);
    
    result = result - epoch;
    
    return result;
}

DateTime to_datetime(UInt64 number) {
    DateTime result;
    
    number = number + epoch;
    to_datetime(number, result.year, result.month, result.day,
                        result.hour, result.minute, result.second);
    
    return result;
}

struct Time_interval {
    DateTime from;
    DateTime to;
};

// Returns n*(n+1)/2.
UInt64 binomial(UInt64 n) {
// Computing without overflow
    
    if (n % 2 == 0)
        return (n/2) * (n+1);
    else
        return n * ((n+1)/2);
}

UInt64 encode(Time_interval interval) {
    UInt64 from = to_num(interval.from);
    UInt64 to = to_num(interval.to);
    
    return binomial(to) + from;
}

Time_interval decode(UInt64 code) {
    UInt64 min = 0;
    // Computing constant 6,074,000,999 without overflow.
    // This is the greatest integer n such that n*(n+1)/2 < 2^64. 
    UInt64 max = 6074001;
    max = max * 1000;
    max = max - 1;
    
    // Binary search of the greatest number n such that n*(n+1)/2 <= code.
    while (min +1 < max) {
        UInt64 middle = (min + max) / 2;
        
        if (binomial(middle) > code)
            max = middle;
        else
            min = middle;
    }
    
    Time_interval result;
    
    result.to = to_datetime(min);
    result.from = to_datetime(code - binomial(min));
    
    return result;
}

ostream& operator<<(ostream &ostr, DateTime datetime) {
    ostr << datetime.year
         << "-" << datetime.month
         << "-" << datetime.day
         << " " << datetime.hour
         << ":" << datetime.minute
         << ":" << datetime.second;
    
    return ostr;
}

ostream& operator<<(ostream &ostr, Time_interval interval) {
    ostr << interval.from << " " << interval.to;
    
    return ostr;
}

istream& operator>>(istream &istr, DateTime &datetime) {
    char ch;
    
    istr >> datetime.year;
    istr >> ch;
    istr >> datetime.month;
    istr >> ch;
    istr >> datetime.day;
    istr >> datetime.hour;
    istr >> ch;
    istr >> datetime.minute;
    istr >> ch;
    istr >> datetime.second;
    
    return istr;
}

istream& operator>>(istream &istr, Time_interval &interval) {
    istr >> interval.from;
    istr >> interval.to;
    
    return istr;
}

int main() {
    cout << "Enter the time interval (from-to) in the format yyyy-mm-dd hh:mm:ss yyyy-mm-dd hh:mm:ss" << endl;
    Time_interval interval;
    cin >> interval;
    UInt64 code = encode(interval);
    cout << "It's 64-bit code is " << code << " (decimal)" << endl;
    Time_interval check = decode(code);
    cout << "Decoded interval is\n" << check << endl;
    
    return 0;
}



[Ovu poruku je menjao Nedeljko dana 26.10.2008. u 15:29 GMT+1]
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Prikačeni fajlovi
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 13:59 - pre 188 meseci
Nisam vas valjda toliko namučio? Ja samo lupio zadatak dok sam kucao poruku u temi "kako postati progrmer" i još zeznuo račun pa napisao 200 godina, a ono ispade tema od tri strane.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 14:03 - pre 188 meseci
Hoćete li uopštenje ovog zadatka, pa polako ka kompresiji šahovskih partija i pozicija? Imam algoritam.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-214.BVCOM.NET.



+1064 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 15:03 - pre 188 meseci
Nedeljko, izvinjavam se za juce malo sam se iznervirao umes da mi pogodis zivac ;)

ne radi ti resenje. Posto n(n+1)/2 sabiras sa nekim brojem to sto radis
binary search za n(n+1)/2 poredeci sa to+neki broj nista ti ne znaci mislim.

bmaxa@maxa:~$ ./nedeljko
Enter the time interval (from-to) in the format yyyy-mm-dd hh:mm:ss yyyy-mm-dd hh:mm:ss
1900-1-1 0:0:0 2000-1-1 0:0:0
It's 64-bit code is 4880117873397326400 (decimal)
Decoded interval is
1998-12-31 0:0:0 1999-12-31 23:59:59

Miljanovo resenje radi ali recimo da dekodira onih tvojih 8miliona datuma sa strima
za jednu sekundu po dekodingu, trebalo bi mu jedno 3meseca ;)
a kako sad izgleda bice da je jedno pola godine minimum.

Sta fali onom mom resenju, to moze da se primeni u praksi?

Pozdrav!
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 15:11 - pre 188 meseci
Nedeljko, mislim da imas bug negde u resenje, ne (de)kodira pun span dobro:

C:\>encoding
Enter the time interval (from-to) in the format yyyy-mm-dd hh:mm:ss yyyy-mm-dd hh:mm:ss
1900-01-01 00:00:00 2091-12-31 23:59:59
It's 64-bit code is 18163434907925668800 (decimal)
Decoded interval is
2090-12-30 23:59:59 2091-12-31 23:59:58


AL zanimljiv algoritam za dekoding, probacu da primenim kod mene.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 15:17 - pre 188 meseci
Branimire,

U rešenju je dozvoljen opseg godina od 1901-2092. Nije ni čudo što si dobio besmislen rezultat. Ako hoćeš od 1900 god. onda moraš da promeniš liniju UInt64 epoch = ...

Nisam hteo da opterećujem program proverama ulaza, ali to se ispostavio kao greška.

Nedostatak tvog rešenja je što nisi sve iskodirao sa 64 bita, već ti trebaju još 2 bita da bi odredio tip.

Za važi , pa sa onim pretraživanjem nema problema.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-214.BVCOM.NET.



+1064 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 15:19 - pre 188 meseci
Oki doki,
najbolji si.

Pozdrav!
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 15:24 - pre 188 meseci
Zaista me mrzi da merim brzinu onog mog programa, ali ako nekoga ne bi mrzelo, bio bih mu zahvalan.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 16:13 - pre 188 meseci
Kod mene ispade ispod 0.4 mikrosekunde za kodiranje i ispod 2 mikrosekunde za dekodiranje.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 16:36 - pre 188 meseci
Ako su vam ovakve teme zanimljive, mogu ja i da nastavim.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 16:49 - pre 188 meseci
Nije lose, samo sto ja prelazim nazad u pasivne posmatrace, pocinje mi novi projekat sutra i ne mogu vise da aktivno ucestvujem.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 17:10 - pre 188 meseci
Informacioni sistem fakulteta treba za svakog studenta da memoriše datum njegovog rođenja i datum rođenja njegovog oca. Pritom, fakultet mora da unese kako podatke o ranijim i sadašnjim studentima, tako i da ubuduće unosi podatke o novim studentima. Fakultet je ogroman, a hard disk mali.

Koliko je bitova potrebno po studentu za memorisanje ta dva podatka ako se zna:

- da su oba datuma u opsegu od 1900-1-1 do 2099-12-31, (posle se kupuje veći hard disk)
- da starosna razlika između oca i sina ne može biti manja od 16 godina (dakle, iznosi najmanje 5844 dana)?

P.S. Posle ubacujemo i dedu.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.eunet.rs.



+171 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala26.10.2008. u 17:32 - pre 188 meseci
@mmix
Jel gotov racun za onaj opseg :)

Elem,
Ja sam se iskreno namucio sinoc, u stvari enkoding mi nije bio problem, brzo se videlo da je u pitanju trougasta matrica, ali za dekoding nisam znao kako da namestim, prvo sto mi je padalo je O(n) search, ali sam znao da ce to da potraje mnogo dugo, pa mi je prvo sleedece palo da namestim algoritam brzine pretrage O(log n) ali sam tek sad vidim, pogresio u implementaciji.
Pogledacu vasa resenja, bas me interesuje implementacija dekodinga, posto za njega nisam imao nikakvu optimizovanu ideju.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala28.10.2008. u 11:07 - pre 188 meseci
Da li za novi zadatak nema interesovanja ili da objavim resenje?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-24.bvcom.net.



+1064 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala29.10.2008. u 17:26 - pre 188 meseci
Nedeljko, pazi ovo O(1) resenje ;)


Code:

const uint64_t maxDateValue = 6074000999ull;

uint64_t encodeDate(uint64_t start, uint64_t stop)
{
    uint64_t rc;
    if(stop-start>maxDateValue/2)
        rc = (maxDateValue/2-start)*maxDateValue+stop;
    else
        rc = (stop-start)*maxDateValue+start;
    return rc;
}

void decodeDate(uint64_t blob, uint64_t* start, uint64_t* stop)
{
    uint64_t s1 = blob/maxDateValue;
    uint64_t s2 = blob%maxDateValue;
    if(s1 + s2 >= maxDateValue)
    {
        *start = maxDateValue/2-s1;
        *stop = s2;
    }
    else
    {
        *start = s2;
        *stop = s1+s2;
    }
}


edit: pardon treba if(s1+s2>=max) zato sto je max neparan

Pozdrav!


[Ovu poruku je menjao Branimir Maksimovic dana 29.10.2008. u 23:35 GMT+1]
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Re: Zadatak sa pakovanjem vremenskih intervala30.10.2008. u 11:11 - pre 188 meseci
Ako je 0<=a<m i 0<=b<n, onda je code = a*n+b, a = code/n, b = code-a*n, 0<=code<m*n

Medjutim, na taj nacin ces zadatak sa kodiranjem intervala u opsegu od 192 godine sa rezolucijom od 1s resiti sa 65 bitova, jer je 0<=code<m*n. Kada bi posebno pamtio pocetak, a posebno kraj intervala, za svaki od njih bi ti trebalo 33 bita, pa bi ukupno potrosio 66 bitova. Ovako, kada ih pamtis "grupno" prethodnim algoritmom, treba ti 65 bitova. Medjutim, na taj nacin neces doboti resenje sa 64 bita, jer nisi iskoristio uslov da pocetak ne moze biti posle kraja, tj. imas i kodove "intervala" kod kojih je pocetak posle kraja. Da bi resio problem u 64 bita, moras iskoristiti i taj uslov koji odbacuje polovinu parova cime se stedi jos jedan bit.

P.S. Svaki algoritam koji resava ovaj problem (makar i grubom silom, kako god) ga resava u vremenu O(1). Sta mislis zasto.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: Art of Programming :: Zadatak sa pakovanjem vremenskih intervala

Strane: < .. 1 2 3 4

[ Pregleda: 8495 | Odgovora: 69 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.