Kezdőlap › Fórumok › Programozás › azonos mintazatok
- This topic has 12 hozzászólás, 2 résztvevő, and was last updated 14 years, 3 months telt el by
ktibi.
-
SzerzőBejegyzés
-
2011-03-31-22:03 #1889951
Hello,vannak kulonbozo szamu sorokbol allo fajljaim ket oszloppal, pl.FILE 1
Code:1 00014 00108 01119 1011FILE2
Code:5 01018 1111FILE3
Code:8 0110A kerdesem az lenne, hogy hogyan tudnam kiszurni a fajlokbol csak azokat a sorokat melyek sorszama (pontosabban az elso oszlopanak erteke) megegyezik, azaz ezt kapni eredmenyul:
Code:8 0111 1111 0110?
2011-04-01-05:35 #2202485Ha a file-ok nem túlságosan nagyok, akkor én egyszerre beolvasnám az összeset. (Így a leggyorsabb, legegyszerűbb.)Itt van pl. egy bash script rá, mely más elemzésre is alkalmas lehet.
Code:#!bin/bash# Beolvasás a file-okból (ha pl. az elválasztó karakter space, enter, amit az IFS megenged)datas_1=( $(cat 1.dat) )datas_2=( $(cat 2.dat) )datas_3=( $(cat 3.dat) )# Hány adat vannum_of_datas_1=${#datas_1[@]}num_of_datas_2=${#datas_2[@]}num_of_datas_3=${#datas_3[@]}# Ciklus futtatása (ez igazából bonyolultabb műveletekre is megfelel)i_1=0while [ $i_1 -lt $num_of_datas_1 ]; do2011-04-01-14:02 #2202486Koszi szepen a valaszt! 😉Teszteltem a dolgot es kicsit bajban vagyok a futasidovel.... Ha 6 db. 10 soros file-om van, amelyben ketto egyezet talalunk, akkor a script kb. 1 perc alatt fut le, amit furcsa, es rohadt lassu... :'( Mi lehet a baj? Hogyan lehetne javitani a progin?
2011-04-01-14:17 #2202487Hogy jön össze a 6? Ez pillanatnyilag 3 file-t hasonlít össze egyszerre és emelkedő sorszám esetén arról is gondoskodik, hogy ne legyen felesleges vizsgálat. (Persze, ha megfelelően átírtad a kódot, az más kérdés. Csak azt sem árt ellenőrizni… ennek most pill. jól kellene működnie.)Nálam 3 db 10 soros file elemzése, melyben 2 egyező adat van és az egyik egyező az utolsó sorban (minden file-ban), azaz a legrosszabb esetben 1 mp a futási idő.Ha gond van a sebességgel át kell írni pythonra, vagy inkább c-re. (Hát átírhatjuk c-re, csak akkor majd le kell fordítanod. Persze miután megtudom, hogy hogy jön össze a 6.)
2011-04-01-15:06 #2202488A 6 db. csak szimplan a 3 kiterjesztese, azaz most 6 db. file-om van.Pl.
Code:2 0001000000000000ilyen sorokbol all, ebbol viszont az emlitett ezres nagysagrendben file-onkent.Feltettem ide a file-okat es a scriptet is: http://addat.hu/52932a33/linuxforum.tar.gz.htmlHa futtatom, akkor latod majd, hogy sokaig fut... :-
2011-04-01-15:30 #2202489Ide is fel tudod tölteni és akkor nem kell szórakozni a letöltögetéshez. De azért mindjárt megnézem.
2011-04-01-15:37 #2202490Már rögtön mondom, hogy ne várj csodát, hisz 1-2 ezer adatod van minden file-ban, ami azt jelenti, hogy rossz esetben2000^6 = 6,4*10^19 összehasonlítást kell elvégezni, ami nem kevés. (Ugyanis az összehasonlítandó file-ok növelésével exponenciálisan nő, az adatokéval, persze csak lineárisan a ciklusok száma.)C-re átírva biztosan tudsz rajta gyorsítani, de a 6*10^19, az 6*10^19. 😉
2011-04-01-15:43 #2202491Lehetne valahogy javitani ezen, mert mindenkeppen ki kellene szurni ezeket a sorokat. Valahogy biztos lehet rovid ido alatt is „egyszeruen”… Van tipped?
2011-04-01-15:43 #2202492Még optimalizálhatjuk úgy, hogy amennyiben az első kettő nem egyezik, akkor ne futtassa le a ciklust. Ez nem egyezés esetén (ami valószínűbb) gyorsít, ha pedig egyezés van, akkor lassít, mivel van plusz vizsgálat.Azon kívül eltehetjük a memóriába a talált első értékeket indexeit egy-egy file-nál így a következő vizsgálatot már csak ettől kell elvégezni.De az az igazság, hogy én csak 3 file-ra gondoltam, aminél pl. 2000 sor csak 8 milliárd összehasonlítást jelentene, ami jóval kevesebb, mint így.
2011-04-01-16:51 #2202493Igen, nem konkretizaltam, hogy vegul >3 darab file esetere kellene; azert koszi szepen!Jo lenne valamit viszont kitalalni a >3 esetre, ami viszonylag "gyors"; gondolkozom...Szerk.: valoszinuleg az a leggyorsabb, ha szetdaraboljuk, azaz mindig csak 3 vagy ketto file-t vizsgalunk es utana az eredmenyt hasonlitjuk ossze egy masikkal es igy tovabb...
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz