Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
Autor | Správa |
---|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
Zdravim.
Chcel by som vediet ako by ste riesili zadanu ulohu. V hociakom jazyku...ide mi o algoritmus. Idealne by bolo keby spracoval danu ulohu v case pod 10 sekund na cca 2,4Ghz procesore
Zadanie
testovacie data (vstup / vystup)
http://knoweurope.eu/rd/test_in-out.zip
|
|
Registrovaný: 17.11.06 Prihlásený: 31.12.07 Príspevky: 677 Témy: 9 | 9 |
ja osobne by som to robil tak, že si vytovrím dynamické pole záznamov s dvoma hodnotami: string na slovo a integer na jeho počet. Začnem čítať vstup a každé slovo (nájdem ho tak, že zľava aj zprava bude medzera [čiže hladáš text ohraničenými medzerami] a zmažem z neho všetky čiarky, bodky a bodkočiarky) si uložím do nového indexu ak sa ešte nenachádza v poli alebo ak tam už je tak zvýšim jeho výskyt. Nakoniec zoradím pole podľa abecedy, prerátam tie hodnoty a vypíšem
|
|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
Hej taq nejak som to riesil..Ale namiesto pola som pouzil datovu strukturu zoznam. Ono je to dost problem ukladat to tam alebo aj do pola pretoze ked vezmes dalsie slovo a porvnavas so slovami v poli, ci uz take existuje musis prejst v najhorsom pripade cele pole...a ten vystup ma 12600 slov. Tak isto to riesi aj ten zoznam a trva to tomu algoritmu 5 minut a to som tam nerobil zoradenie vystupu a ulozenie vystupu do suboru...Idem to skusit s binarnym stromomom...inak tu je kod pre ten 5 minutovy
Kód: public class ListItem {
private String word; private int counter; private double entropia; private ListItem next; private ListItem prev; public ListItem (String word) { this.word = word; } public String getValue(){ return word; } public int getCount() { return counter; } public void increment() { counter++; } public void setEntropia(double entropia) { this.entropia = entropia; } public double getEntropia() { return entropia; } public void setNext(ListItem li) { next = li; } public ListItem getNext() { return next; }
public void setPrev(ListItem li) { prev = li; } public ListItem getPrev() { return prev; } }
import java.io.*; import java.util.*; import java.math.*;
public class Entropia { private String input, output; private String content = ""; private String line, token; private ListItem li; private List l; public Entropia(String input, String output) { this.input = input; this.output = output; l = new List(); } public void readInput() { try { FileReader fr = new FileReader(input); BufferedReader br = new BufferedReader(fr); while ((line = br.readLine()) != null) { line = line.replace('.', ' '); line = line.replace(',', ' '); line = line.replace(':', ' '); line = line.replace(';', ' '); line = line.replace('?', ' '); line = line.replace('!', ' '); line = line.replace("\'", ""); content = line; StringTokenizer st = new StringTokenizer(content); while (st.hasMoreTokens()) { token = (st.nextToken()); l.increment(); if (li == null) { li = new ListItem(token); l.insertFirst(li); li.increment(); continue; } else { li = l.getStart(); while (true) { if (li.getValue().equals(token)) { li.increment(); break; } if (li.getNext() == null) { li = new ListItem(token); l.insertFirst(li); li.increment(); break; } else { li = li.getNext(); continue; } } } } } } catch (IOException e) { System.out.print("chyba"); } } public void entropia() { li = l.getStart(); while(true) { if (li == null) { break; } li.setEntropia(Math.log(l.getCount()/li.getCount())/Math.log(2)); li = li.getNext(); } } public void test() { li = l.getStart(); System.out.println(li.getEntropia()); System.out.println(li.getValue()); } public static void main(String[] args) { Entropia e = new Entropia(args[0],args[1]); e.readInput(); e.entropia(); e.test(); } }
public class List { private ListItem head; private ListItem tail; private int countAll; public void insertFirst(ListItem li) { li.setNext(head); li.setPrev(null); head = li; } public void increment() { countAll++; } public int getCount() { return countAll; } public ListItem getStart() { return head; }
}
|
|
Registrovaný: 17.11.06 Prihlásený: 31.12.07 Príspevky: 677 Témy: 9 | 9 |
Urob si 24 (alebo koľko máme písmen) dynamických polí. Potom nemusíš prechádzať 12600 slov alebo ako si to písal ale len niekoľko stovák tých čo majú rovnaké začiatočné písmeno.
|
|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
heh..mno neviem..alokovat 24 poli...a potom rozhodovat v dakom switchi..to su tiez operaci..ale hej myslim ze by to dako urychlylo
|
|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
Tak som to konecne zbuchal
System asi takyto
Zo vstupneho suboru nacitam v cykle riadoky, tie ocesem o nepotrebne znaky a rozdelim na slova, ktore potom ukladam do stromu..lexikograficky vacsie slovo dolava, mensie doprava a ak sa rovnaju inkrementuje sa pocitadlo v uzli. Rekurzivnim prechadzanim stromu inOrder nastavujem entropia pricom ju aj odrazu zaokruhlujem a aktualne spracovavny uzol zapisem do zoznamu s hodnotami slova, poctu vyskytov a entropie a nasledne ten uzol stromu zmazem. Tak si vlastne prekopirujem cely povodny strom do zoznamu a z toho zoznamu vytvaram druhy strom do ktoreho uz ukladam podla hodnot entropie pricom ak sa hodnoty rovnaju vytvori sa v uzli novy zoznam a prida sa don slovo a pocet jeho vyskytov. Mno a potom uz znovu len prejdem strom inOrder pricom ked v danom uzli existuje zoznam tak ho vypise od zaciatku a samozrejme popritom prebieha zapis do vystupneho suboru....
co sa tyka casu tak mam 2jadrove Centrino (1,66Ghz) a trva to cca 2776 milisekund
|
|
Registrovaný: 09.03.07 Prihlásený: 28.07.09 Príspevky: 39 Témy: 7 | 7 Bydlisko: Trnava |
: ))) programatori musia mat iq najmenej 150 podla toho co a akym stylom to tu vsetko pisu : ))
|
|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
stewe píše: : ))) programatori musia mat iq najmenej 150 podla toho co a akym stylom to tu vsetko pisu : ))
kde tu pisal daky programator? ukaz som zvedavy
|
|
Registrovaný: 17.11.06 Prihlásený: 31.12.07 Príspevky: 677 Témy: 9 | 9 |
stewe píše: : ))) programatori musia mat iq najmenej 150 podla toho co a akym stylom to tu vsetko pisu : )) aj ja by som ho rád videl a pokecal s ním nech sa niečo naučím
|
|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
...si robte srandu
|
|
Registrovaný: 17.11.06 Prihlásený: 31.12.07 Príspevky: 677 Témy: 9 | 9 |
koho?
|
|
Registrovaný: 10.05.07 Prihlásený: 10.05.07 Príspevky: 2 Témy: 0 | 0 |
Ja by som jednoznacne pouzil hasovaciu tabulku, casova zlozitost vyhladavania je konstantna, takze nie je co riesit.Mozno by bol troxu problem s uporiadanim, ale ten sa da zriesit pomocu ukazatelov.
Strom je dobre riesenie, ale nie najlepsie
|
|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
mno co viem tak na vacsi objem dat je lepsi binarny strom..a vyhladavanie v hashovacej tabulke moze trvat taktiez dlhsie ale samozrejme zalezi na mohutnosti tej danej struktury + este to triedenie...ale tak ja som s riesenim spokojny a zadanie som splnil dokonca som to skusal na vstupe s 96mb textovym suborom co mal 12milionov slov a frci to do 30 sekund )) vsetko ma svoje + a -
ako ked posielas nieco na poste a poseru ti to
|
|
Registrovaný: 10.02.07 Prihlásený: 14.08.09 Príspevky: 255 Témy: 27 | 27 Bydlisko: KE |
neslo by to riesit cez DB?
vlozit vsetky tie slova do MySQL databazy, a potom ich zoskupit podla slova, a vratit tiez pocet jednotlivich slov..
aj ked to neriesi tvoj problem, lebo ty sa pytas na algoritmus.
_________________ drahi hackeri! teraz mozete okamzite premazat cely tento server! stlacte skratku ALT+F13 |
|
Registrovaný: 25.12.06 Prihlásený: 01.03.13 Príspevky: 239 Témy: 20 | 20 Bydlisko: Krásno n/Ky... |
mno neviem si celkom dobre predstavit ako by som mu to odovzdaval (asi aj s instalackou dakeho sql servera)
|
|
Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Technológia .NET | 4 | 592 | 09.07.2013 22:35 ThePlaky | | v Ostatné | 3 | 815 | 08.12.2009 18:25 ac.milan | | v Assembler, C, C++, Pascal, Java | 11 | 595 | 13.12.2010 21:43 ac.milan | | v Ostatné | 1 | 726 | 14.12.2009 15:13 Draex | | v Assembler, C, C++, Pascal, Java | 6 | 743 | 06.12.2007 16:55 tearan | | v Ostatné | 3 | 591 | 16.12.2009 12:43 ac.milan | | v PHP, ASP | 12 | 1708 | 22.11.2008 11:18 Flety | | v Assembler, C, C++, Pascal, Java | 6 | 559 | 16.11.2014 18:57 dano123 | | v PHP, ASP | 3 | 409 | 05.01.2013 17:11 Ďuri | | v Ostatné | 4 | 858 | 04.01.2010 18:43 Shwollo | | v Ostatné | 3 | 786 | 26.11.2010 23:06 Daron | | v Assembler, C, C++, Pascal, Java | 1 | 597 | 31.05.2015 2:16 expresado | | v Bezpečnosť a firewally | 0 | 672 | 25.10.2009 15:56 SkyHiRider | | v Novinky | 2 | 458 | 12.04.2007 8:15 Numline1 | | v Assembler, C, C++, Pascal, Java | 2 | 1088 | 11.05.2007 20:34 jumbo79 | | v Assembler, C, C++, Pascal, Java | 0 | 318 | 11.11.2014 18:37 janik12333 |
|