Hirdetés
- Samsung Galaxy Z Fold7 - ezt vártuk, de…
- Bemutatkozott a Poco X7 és X7 Pro
- Nem lesz olcsó a Realme GT 8 Pro Európában
- Milyen okostelefont vegyek?
- Honor Magic8 Pro - bevált recept kölcsönvett hozzávalókkal
- Félő, hogy az okosszemüveg a szexuális zaklatók játékszere lesz
- Fotók, videók mobillal
- Mától Huawei okosórákkal is lehet érintésmentesen fizetni
- Poco X8 Pro Max - nem kell ide sem bank, sem akkubank
- Yettel topik
-
Mobilarena

Ú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
Hirdetés
● olvasd el a téma összefoglalót!
- Keresünk iPhone 15/15 Plus/15 Pro/15 Pro Max
- ÁRGARANCIA!Épített KomPhone i9 14900KF 64GB RAM RTX 5080 16GB GAMER PC termékbeszámítással
- 27% - LG UltraGear 27GS93QE-B OLED Monitor! 2560x1440 / 240Hz / 0.03ms / G-SYNC / FreeSync
- Bomba ár! Lenovo ThinkPad E14 G2i - i5-11G I 8GB I 256SSD I 14" FHD I Cam I W11 I Gari!
- Bomba ár! HP EliteBook 840 G9 - i7-1270P I 16GB I 512SSD I 14,1" WUXGA I Cam I W11 I Gar!
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest


)


