-
Fototrend

Új hozzászólás Aktív témák
-
Joooe
tag
válasz
Radíros
#2401
üzenetére
Nem az input benyalása a megoldás asszem, elvileg megfelelő pufferrelést séróból meg kéne hogy oldja egyszeri folyamatos végigolvasás esetén.
Maga az is műveletigényes egy kicsit, hogy a szöveges formában tárolt számokból összeállítani az inteket.
De érdekes, ezt tudja valaki miért lehet lassabb?
<fstream>-mel:
ifstream be;
be.open(''be.txt'');
int n,m,p;
be >> n;
be >> m;
be >> p;
p--;
int honnan, hova;
for (int i=0; i<m; i++)
{
be >> honnan;
be >> hova;
honnan--;
hova--;
// itt csinálunk valamit
}
be.close();
<stdio.h>-val:
int n,m,p;
FILE* be = fopen(''be.txt'',''rt'');
fscanf(be,''%d %d %d'',&n,&m,&p);
p--;
int honnan, hova;
for (int i=0; i<m; i++)
{
fscanf(be,''%d %d'',&honnan, &hova);
honnan--;
hova--;
// itt csinálunk valamit
}
fflush(be);
fclose(be);
Az utóbbi kb. fele-haramada idő alatt végez egy 1 megás szövegfájllal.
Nem nagyon szoktam STL filekezelést használni, gondolom ennyire nyomorék nem lehet, mit szúrok el?
[Szerkesztve] -
Joooe
tag
válasz
Radíros
#2395
üzenetére
''Visszavonom!!!
10000 csúcssal és 64 bit gépi szószélességgel számolva:
157 * 10^8 * 14 ~ 300 GHz-es proci kellene 1mp futásidőhöz
(szekvenciálisan, csővezeték és cimzésműveletek elhanyagolva)''
Valószínűleg pontatlanul idézte a feladatot a kérdező, és csak egy konkrét csúcson átmenő köröket kell vizsgálni.Így nincs szükség a teljes tranzitív lezárt meghatározására.
Ezt azért gonodlom, mert én is egy hasonló feladatot csináltam (na nem magamnak, hál'isten az alga csak a távoli múltból dereng már nekem
)
Az algoritmus érdemi részének futási idejét sikerült olyan 0,015 s-re csökkenteni ezzel a módszerrel még a leghúzósabb inputokon is. (AMD 3200 procin, párhuzamosítás nélkül)
Ami viszont iskolai szivatás a dologban: bizonyos teszt inputok esetén ha semmi mást nem csinál a program, csak kb. be >> szam; módszerrel standard folyamműveletekkel végigolvassa az inputot (De ezen kívül tényleg semmit nem csinál, nem konstruál gráfot, nem vizsgál feltételeket, stb.) már az kifut a futási időlimitből az inputok egy részén
[Szerkesztve] -
Joooe
tag
Most gyorsan átlapoztam a K&R-t de nem látom annak garanciáját, hogy ez így működni fog. Ilyen méretekben valószínűleg működik, mert a hardver adottságaiból adódóan defaultból int-ként végzi el a számolást és aztán annak ''int-té castolásakor'' ugye nem történik semmi, tehát marad a helyes eredmény.
De ha ugyanezt az elvet követjük amit alkalmaztál, és ugyanakkor kevésbé vasbarát méretekig növeljük a dolgot:
unsigned __int64 mix32(unsigned __int32 h, unsigned __int32 l)
{
return (h << 32) + l;
}
esetben már túlcsordul.
unsigned __int64 mix32(unsigned __int32 h, unsigned __int32 l)
{
return ((__int64)h << 32) + l;
}
Így viszont jó.
Lehet hogy működik, de én biztosabbnak érzem mindig explicit módon castolni ilyen bites játszadozásoknál:
unsigned int assign16(unsigned char LD, unsigned char HD)
{
return ((unsigned int)HD << 8 | (unsigned int)LD) >> 3;
}
De ha ez csak az én ''szám íze'' szerint van így akkor bocsi
[Szerkesztve] -
Joooe
tag
nem tudom hogy működik ez a kód egyes fordítók lelkivilága szerint, meg most így hirtelen a szabványt sem hasítom, de nekem gyanús, hogy a kifejezés egyik oldala az unsigned char marad a kiértékelés során, és így a 256-tal szorzás mondjuk úgy egy kisebb túlcsordulást okoz

Én még nem találkoztam olyan implementációval (tudom hogy van) ahol az int ne 32 bit lenne
-
Joooe
tag
Én inkább egy bitmátrixot tartanék megfelelőnek erre a feladatra.
A memóriában az is elfér (10000^2/8 = kb. 12 MB)
Bár elgondolkodtató, hogy ez a megközelítés nem használja ki az élek relatíve alacsony számát.
Ami gyorssá teheti a megvalósítást, hogy ha a mátrix azt mutatja, hogy az i-edik csúcsból elérhető a j-edik, akkor a j-edik sort hozzá VAGY-oljuk az i-edik sorhoz, ezzel tovább bővítve az i-ből elérhető csúcsok listáját, azokkal ami j-n keresztül elérhető.
Ez mindenféle implementációban elvégzendő művelet, hogy megvizsgáljuk, hogy mi van ha arra megyünk, de azt hiszem így tudjuk leggyorsabban megtenni. Így processzortól függően egyetlen művelet során nagyon sok (64?) csúcsra történik meg a vizsgálat.
Az még egy kicsit elgondolkodtató, hogy mikor végeztünk, hiszen ezt többször el kell végezni, de ha végeztünk, akkor azokat a csúcsokat listázzuk amire mátrix[i,i]=1, azaz elérhető magából maga, azaz tagja valamely irányított körnek.
[Szerkesztve]
[Szerkesztve]
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
- Synology NAS
- Forza sorozat (Horizon/Motorsport)
- OLED TV topic
- Kókuszdió: Ryzen ( Zen4 / Zen5) – amikor a „normális működés” magyarázatra szorul
- Diablo IV
- CADA, Polymobil, és más építőkockák
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Építő/felújító topik
- One otthoni szolgáltatások (TV, internet, telefon)
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- További aktív témák...
- Dell 14 Latitude 5430 FHD IPS i7-1255U vPro 4.7Ghz 10mag 16GB 256GB Intel Iris XE Win11 LTE Garancia
- BESZÁMÍTÁS! Gigabyte Z390 i7 9700K 16GB DDR4 512GB SSD RX 7600 8GB Kolink VOID ADATA 600W
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RX 9070 16GB GAMER PC termékbeszámítással
- Xeon E5 1650 v3, 2680 v3, 2690 v3 processzorok
- GEN5!!! 14/12GB/s 1TB Gen5x4 NVMe SSD, 1 év gar
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest


)


