| | |
| 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 Bydlisko: Krásno n/Ky... | Napísal m@-nX: 19.04.2007 14:31 | |
|
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 |
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 Bydlisko: Krásno n/Ky... | Napísal autor témy m@-nX: 19.04.2007 20:44 | |
|
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 |
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 Bydlisko: Krásno n/Ky... | Napísal autor témy m@-nX: 19.04.2007 21:53 | |
|
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 Bydlisko: Krásno n/Ky... | Napísal autor témy m@-nX: 04.05.2007 9:41 | |
|
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 Bydlisko: Trnava | Napísal stewe: 04.05.2007 20:30 | |
|
: ))) 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 Bydlisko: Krásno n/Ky... | Napísal autor témy m@-nX: 04.05.2007 21:47 | |
|
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 |
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 Bydlisko: Krásno n/Ky... | Napísal autor témy m@-nX: 05.05.2007 22:31 | |
|
...si robte srandu
|
|
Registrovaný: 17.11.06 Prihlásený: 31.12.07 Príspevky: 677 Témy: 9 |
koho?
|
|
Registrovaný: 10.05.07 Prihlásený: 10.05.07 Príspevky: 2 Témy: 0 | Napísal logha: 10.05.2007 13:36 | |
|
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 Bydlisko: Krásno n/Ky... | Napísal autor témy m@-nX: 10.05.2007 22:06 | |
|
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 Bydlisko: KE | Napísal zero0x: 11.05.2007 6:01 | |
|
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 Bydlisko: Krásno n/Ky... | Napísal autor témy m@-nX: 11.05.2007 12:00 | |
|
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 |
---|
| Algoritmus v Ostatné | 3 | 785 | 08.12.2009 18:25 ac.milan | | algoritmus v Assembler, C, C++, Pascal, Java | 11 | 547 | 13.12.2010 21:43 ac.milan | | Algoritmus v Ostatné | 1 | 695 | 14.12.2009 15:13 Draex | | Algoritmus v Technológia .NET | 4 | 549 | 09.07.2013 22:35 ThePlaky | | algoritmus - datum v Ostatné | 3 | 558 | 16.12.2009 12:43 ac.milan | | Algoritmus MD5 v PHP, ASP | 12 | 1655 | 22.11.2008 11:18 Flety | | C ++ algoritmus v Assembler, C, C++, Pascal, Java | 6 | 527 | 16.11.2014 18:57 dano123 | | Hladám algoritmus v PHP, ASP | 3 | 364 | 05.01.2013 17:11 Ďuri | | Algoritmus pomoc v Ostatné | 4 | 829 | 04.01.2010 18:43 Shwollo | | algoritmus heeeelp v Assembler, C, C++, Pascal, Java | 6 | 708 | 06.12.2007 16:55 tearan | | vyvojovy diagram - algoritmus v Ostatné | 3 | 735 | 26.11.2010 23:06 Daron | | Geneticky algoritmus - program v Assembler, C, C++, Pascal, Java | 1 | 551 | 31.05.2015 2:16 expresado | | Optimalny sifrovaci algoritmus v Bezpečnosť a firewally | 0 | 637 | 25.10.2009 15:56 SkyHiRider | | Zostavte algoritmus a program v Assembler, C, C++, Pascal, Java | 2 | 1051 | 11.05.2007 20:34 jumbo79 | | Nový algoritmus rozoznávania obrázkov v Novinky | 2 | 418 | 12.04.2007 8:15 Numline1 | | Alexa mení algoritmus merania návštevnosti v Novinky | 14 | 700 | 17.04.2008 19:43 pa3ck |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|