- Ukryj cytowany tekst -- Pokaz cytowany tekst -Subversor wrote:
> Witam
> Byc moze ten problem powinienem dac na pl.comp.programming ale ze pisze to w
> javie ,stosuje serializacje itp. wiec pisze to tu :)
> Problem wydawalo by sie jest prosty, otoz jest pewna sytuacja:
> - sa wyscigi samochodow
> - rodzaji samochodow jest np 65 //pomiajamy ich parametry itd.
> - do wyscigu staja po 4 samochody
> wyscigow jest.. tyle ile kombinacji mozliwych samochodow czyli np. (1 2 3 4)
> (1 2 3 5) ale tez (4 4 3 3)) i tych kombinacji jest ponad 800 000 (to
> jeszcze nie duzo)
> glownym problemem ze te wyscigi od bywaja sie na roznych torach i tych torow
> jest dosyc DUZO ( ponad 2 miliony) i kazdy ma swoja specyfike
> moim celem jest zapamietanie wszystkich wynikow (lub prawie wszystkich)
> wyscigow, jako ze 800 tys x 2 miliony daje dosyc duza liczbe a na dysku mam
> "troche" mniej wolnego miejsca
> (chcialbym sie zmiescic w okolo 30 GB, 50 jeszcze bym przebolal).
> Problem polega tez na tym ze nie mam zbytnio czasu na testy (gdyz bedzie
> tylko prawdopodobnie jedna proba i marze o tym zeby ta proba zajela rosadny
> czas )
> i nie wiem jakie wyniki beda wychodzily (nie potrafie ich nawet
> przewidziec) - (byc moze zawsze bedzie wygrywal samochod nr 13 :P, nastepnie
> 17 itd.)
> ale musze zalozyc bardziej pesymistycznie ze wyniki beda rozne (ale nie
> przypadkowe)
> Byc moze niektorzy zastanawiaja sie dlaczego np. nie wygrywa kazdego wyscigu
> np. 13 skoro jest najlepsza,
> otoz (pomijam cala specyfike wyscigu) w syscigu np. 13 1 2 3 wygrywa 13 w 13
> 4 5 6 tez 13 (no bo jest statystycznie najlepsza)
> ale w wyscigach np. 13 1 2 6 wygrywa 1 (dlaczego? otoz zachodza pewne
> interakcje miedzy pojazdami i 6 dla pewna moc 1 bo 6 nie lubi 13 tak w
> uproszeniu)
> aha ,zapomnialem o w sumie malo waznym szczegole wyscig moze skonczyc sie
> porazka wszystkich 4 samochodow (wypadek)
> Moja wyobrazenie o zapisie tego.
> jest kalasa:
> Class Tor{
> string nazwa:
> inne duperele...
> Wyscigi wscigi;
> }
> i to ja zapisuje na dysk (czyli cos kolo 2 miliony plikow ;) )
> przeznaczam 30 GB na te pliki czyli na plik przypada 15kb
> czyli musze upchnac w objekcie wyscigi (15kb) 800 tys wynikow, jezeli to nie
> mozliwe
> chce upchnac jak najwiecej. (reszte na oko :P czy jak to mowia
> statystycznie)
> Moja wstepna idea
> mam 800 000 wynikow
> int[] statystycznie najlepsze[66] ->poukladane wg. liczby wygranych (czyli
> nasza 13 jest na poczatku)
> boolean[][] przegrane=new boolean[65][66];->zapisane z kim wygrywa dany
> rodzaj.czyli prawdopodobnie 13 bedzie miala ze wygrywala z wszystkimi
> rodzajami
> ale
> niestety druga (17) z kolei tez bedzie miala wszystkie 66 true nawet byc
> moze 13 (bo w jakism wyscigu byc moze z nia wygra)
>
(wiec
> dla pierwszych ilus bedzie to to samo co tablica "statystycznie najlepsze"
> tablica wyjatkow - w niej beda trzymane wyjatki (bedzie ich tyle ile mi sie
> zmiesci w tych 15 kb) i np. te wyscigi 17 w ktorych wygrala ona z 13,
> w tablicy tej beda wg. ilosci wygranych, czyli
> wyjatki najzadziej wygrywajacego samochodu(ale jednak czasem wygrywajacego)
> zostana niestety
> prawodpodobnie pominiete.
jesli dobre zrozumialem, chcesz zachowac na dysku informacje [tor, nr
wyscigu, samochod, miejsce], zgadza sie? jesli tak, to zapomnij o
serializacji obiektow. po pierwsze bedzie to kompletnie niewydajne, po
drugie zachowujesz niepotrzebne informacje. to, co tak naprawde chcesz
zachowac to wlasnie te cztery informacje: tor, numer wyscigu, samochod i
zajete miejsce. dopiero pozniej przy prezentacji wynikow doczytasz sobie
informacje np. o samochodzie nr 1 i torze nr 24.
druga sprawa to jak te informacje zapisac zeby zajely najmniej miejsca.
wezmy sobie na przyklad tor 1, w ktorym biora udzial samochody 1,2,3,4
(wyscig 1) i 2,3,4,5 (wyscig 2) i zapiszmy to w postaci [tor:
n_wyscigow: (s1 s2 s3 s4) ...], tak aby czworka w nawiasie odpowiadala
jednemu wyscigowi (s1 odpowiadalo samochodowi, ktory zajal pierwsze
miejsce, s2 - temu ktory zajal drugie miejsce itd):
[1: 2: (2 4 3 1) (2 3 4 5)] - oznacza ze na torze 1 w wyscigu 1,
samochod nr 2 zajal pierwsze miesce, 4 - drugie, 3 - trzecie, 1 -
czwarte, a w wyscigu 2, samochod 2 zajal pierwsze miejsce, 3 - drugie, 4
- trzecie, 5 - czwarte.
Jak widzisz do zapisu takiej informacji wystarczy 10 bajtow: [1 2 2 4 3
1 2 3 4 5]. co wiecej, dane dla kazdego toru mozna potraktowac dowolnym
algorytmem pakujacym i przy wiekszej liczbie wyscigow na torze okaze sie
ze miejsca bedzie potrzeba o 50% mniej.
trzecia sprawa to oszacowanie najbardziej pesymistycznego wariantu,
czyli ze na kazdym torze bierze udzial kazda czworka z 65 samochodow i
kazdy samochod z tej czworki zajmuje dowolne miejsce w wyscigu.
Liczba kombinacji 4 sposrod 65 samochodow to 677040, kazdy z nich moze
byc na jednym z 4! miejsc, wiec wynikowo daje to 16248960 kombinacji dla
jednego toru. torow mamy 2mln, w sumie dostajemy 16248960 * 2mln =
32497920000000 kombinacji. ile to zajmie na dysku? 32497920000000
(bajty) / 1024 (kb) / 1024 (mb) / 1024 (gb) = ok. 30266 GB, a tak na
prawde to jeszcze wiecej, bo nr toru (jesli jest ich 2mln) w jednym
bajcie nie zapiszesz. wyglada to troche pesymistycznie, ale jesli
zastosujesz jakakolwiek kompresje zapisywanych danych moze okazac sie ze
na dysku 50GB niechcacy sie zmiescisz :)
pozdrawiam,
m.
|