NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.
Avatar
Luboš Běhounek Satik:20.1.2013 16:41

Vaším úkolem bude seřadit zadané velké množství (řádově stovky tisíc až milióny) náhodně vygenerovaných slov co nejrychleji.

Jak by měla vypadat struktura aplikace:

  1. Program se zeptá na počet slov
  2. Program v textové podobě vygeneruje (využitím standardní funkce random (nebo její obdoby) vybraného jazyku) zadaný počet slov, přičemž slovo může obsahovat pouze ascii znaky 'a'-'z' a jejich počet v jednom slově je také náhodný a je v rozmezí 1-4 znaků. Slova se mohou opakovat.
  3. Spustí se časovač, který měří dobu výpočtu
  4. Spustí se řadící funkce
  5. Spočítá se a vypíše celkový čas řazení
  6. Program se zeptá, jestli chceme seřazená slova vypsat na disk (pro rychlou kontrolu správnosti), a vypíše je do souboru, pokud vybereme ano (ideálně textová podoba, každé slovo na vlastní řádek, WIN-style zalamování řádků) :)

Program může být napsán v jakémkoliv jazyce, který je přeložitelný do něčeho spustitelného ve Windows.

Spustitelný soubor včetně zdrojových kódů mi posílejte na mail ulu-mulu@seznam.cz

Čas máte do pátku 25.01.2013 17:30, kdy zhruba začíná Devbook.cz sraz.
Pokud tam bude internet, tak sem hned napíšu seznam výsledků :) .

Řešitelé s řešením rychlejším než moje řešení mají na devbook srazu večeři ode mě zdarma (pokud se tento pátek srazu nezúčastníte, výhra se přenáší na příští srazy).

Pokud bude vaše řešení nejhůře 2x pomalejší než moje, máte u mě na srazu alespoň drink (také se přenáší).

Případné dotazy a nejasnosti do komentářů, nápady a diskuzi řešení si prosím nechte až po vyhlášení ;)

Odpovědět
20.1.2013 16:41
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Luboš Běhounek Satik:20.1.2013 17:27

Dodatek k řazení: kratší slova by měla být ve výstupu před delšími slovy.
Např.

a
aa
aaa

Nahoru Odpovědět
20.1.2013 17:27
https://www.facebook.com/peasantsandcastles/
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:20.1.2013 18:15

Jakože:
a
b
c
aa
bb
aaa
bbb

nebo:
a
aa
aaa
b
bb
bbb
c

Dá se to chápat různě :) ... a ještě dotaz máš ve windows nainstalované PHP? :)

Nahoru Odpovědět
20.1.2013 18:15
"nikdy nepiš nic 2x" (updated 10 years after: "Není nic špatného na tom napsat něco 2x")
Avatar
Odpovídá na Pavel Vosyka
Luboš Běhounek Satik:20.1.2013 18:18

Varianta 2:

a
aa
aaa
b
bb
bbb

Mám tu Wamp, takže PHP to být může :)

Nahoru Odpovědět
20.1.2013 18:18
https://www.facebook.com/peasantsandcastles/
Avatar
Michael Olšavský:20.1.2013 20:03

Můžu použít více vláken?

 
Nahoru Odpovědět
20.1.2013 20:03
Avatar
Luboš Běhounek Satik:20.1.2013 20:05

doublepost

Editováno 20.1.2013 20:05
Nahoru Odpovědět
20.1.2013 20:05
https://www.facebook.com/peasantsandcastles/
Avatar
Nahoru Odpovědět
20.1.2013 20:05
https://www.facebook.com/peasantsandcastles/
Avatar
TomBen
Tvůrce
Avatar
TomBen:20.1.2013 20:35

Jen pro zajímavost:
sortovací funkce v Game Makeru udělá 50000 slov za 140.81 vteřiny
na 1 vlákně o 2.3Ghz za výše uvedených podmínek.

Měli byste být lepší, ať svému oblíbenému jazyku neuděláte ostudu. :)

Nahoru Odpovědět
20.1.2013 20:35
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Odpovídá na TomBen
Drahomír Hanák:20.1.2013 20:54

To není zrovna extra výkon (resp. jde to o dost líp) :P

 
Nahoru Odpovědět
20.1.2013 20:54
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
TomBen:20.1.2013 20:57

To předpokládám.

Nahoru Odpovědět
20.1.2013 20:57
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
TomBen
Tvůrce
Avatar
TomBen:20.1.2013 21:02

GM obecně plýtvá výkonem kde jen může. Faktem je, že Mark Overmars
asi nečekal využití GM v jiných oblastech než PacMan & company. :D

Nahoru Odpovědět
20.1.2013 21:02
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Luboš Běhounek Satik:20.1.2013 21:23

Prave jsem zkusil svuj radici algoritmus a trochu me ten cas vydesil, premyslim, jestli ma cenu to optimalizovat, zkusil jste to jeste nekdo, abych mel od ceho se odrazit? :D

Nahoru Odpovědět
20.1.2013 21:23
https://www.facebook.com/peasantsandcastles/
Avatar
Frunta
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Frunta:20.1.2013 21:42

Chtěl bych se zeptat, jestli je vylosovaných 100 000 slov za jednu minutu a třicet osm sekund (1:38) dobrý čas, nebo jsem mimo ligu? :D

Editováno 20.1.2013 21:44
 
Nahoru Odpovědět
20.1.2013 21:42
Avatar
Luboš Běhounek Satik:20.1.2013 21:47

Pro porovnání: zatím jsem na 32ms pro seřazení 50 000 slov

Nahoru Odpovědět
20.1.2013 21:47
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Frunta
Luboš Běhounek Satik:20.1.2013 21:49

V čem to programuješ? Zkoušeli jsme zabudované řazení u kolekcí v Jave/C# a časy byly kolem 100ms :)

Nahoru Odpovědět
20.1.2013 21:49
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Frunta
Luboš Běhounek Satik:20.1.2013 21:52

A nepočítáš do té doby i generování těch slov? :D

Nahoru Odpovědět
20.1.2013 21:52
https://www.facebook.com/peasantsandcastles/
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Fugiczek:20.1.2013 21:54

Až na to že Java měla +-90ms a C# 150ms. Java vede! :D

 
Nahoru Odpovědět
20.1.2013 21:54
Avatar
Frunta
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Frunta:20.1.2013 21:55

Počítám pouze generování čísel. :D
Programuji v C++.

Editováno 20.1.2013 21:57
 
Nahoru Odpovědět
20.1.2013 21:55
Avatar
Odpovídá na Frunta
Luboš Běhounek Satik:20.1.2013 22:10

Zajimalo by me, co na generovani slov tak trva, muzes to poslat? (Cas se pocita az u razeni, takze tohle klidne zverejnit muzes)

A tady je kdyztak verze, co na generovani dat pouzivam ja:
http://pastebin.com/eFLgvnpY

Nahoru Odpovědět
20.1.2013 22:10
https://www.facebook.com/peasantsandcastles/
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Jančík:20.1.2013 22:11

A to si děláš vlastní sortící metodu? Já sme zkoušel to na těch kolekcích a mám časy řazení u 100k slov kolem 190ms. Ale taky to dost záleží na stroji na kterým to pustíš, sem přepnul z úspornýho režimu kde mi to trvalo seřadit 650ms za vysokej výkon a zrychlení bylo fakt velký.

Generování 100k slov mi trvá kolem 50ms.

Editováno 20.1.2013 22:12
Nahoru Odpovědět
20.1.2013 22:11
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Odpovídá na David Jančík
Luboš Běhounek Satik:20.1.2013 22:14

Jj, vlastni sort, ty sorty v kolekcich jsou univerzalni a umej sortovat vsechno, ale maj taky docela velkou rezii.

A vlastni algoritmus si muzu prizpusobit a optimalizovat podle dat a situace.

Nahoru Odpovědět
20.1.2013 22:14
https://www.facebook.com/peasantsandcastles/
Avatar
Frunta
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Frunta:20.1.2013 22:17

Nejspíše to mám plné neefektivních a zbytečných součástek.

http://pastebin.com/he2kvb0H

 
Nahoru Odpovědět
20.1.2013 22:17
Avatar
Odpovídá na Frunta
Luboš Běhounek Satik:20.1.2013 22:28

Myslim, ze to generovani je az zbytecne moc robustne napsane urcite hodne zpomaluje treba ten stringstream, pouzij tu moji verzi, taky to neni zadna slava, ale bezi to rychleji :) .

Nahoru Odpovědět
20.1.2013 22:28
https://www.facebook.com/peasantsandcastles/
Avatar
Luboš Běhounek Satik:20.1.2013 22:42

Trocha statistik k řazení slov dle zadaných kritérií:

Velikost souboru : 50 000 slov
Procesor : Intel Core 2 Quad Q9550 2,8GHz

Nativni sort PHP : 230ms
Nativni sort C# 32bit : 155ms
Nativni sort C# 64bit : 145ms
Nativni sort java : cca 90 ms
C++ vlastni sort 32bit : 6 ms

Nahoru Odpovědět
20.1.2013 22:42
https://www.facebook.com/peasantsandcastles/
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Jančík:20.1.2013 22:56

Hmm, já sme se 100k se dostal na 70ms. Ale to brzdí ta kolekce. I když do kompareru dám jen return 1; tak se pod 20ms nedostanu. Zítra ju vyhodim a uvidim co se s tím dá udělat.

Jinak dobrej nápad s tou soutěží ;) Ale C++ to nevyhraje, ani kdybych měl dělat ve Fortranu, Lue nebo nějakym takovym jazyce, kterej by měl bejt safra rychlej :D

Nahoru Odpovědět
20.1.2013 22:56
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Odpovídá na David Jančík
Luboš Běhounek Satik:20.1.2013 23:13

Ja misto stringu pouzivam nulou ukoncene pole charu jako se pouzivaly nekde pred 20-30 lety a misto kolekci pole, takze rezie temer nulova :)

A taky porovnavas 100k slov vs 50k slov (coz jsem teda zatim testoval jen kvuli tomu GM :) ), pokud nemas linearni slozitost algoritmu, tak 100k slov bude trvat vice nez dvojnasobek casu nez razeni 50k slov :)

Ja se dobrovolne porazit nenecham, i kdybych to mel prepsat cely do asm :D

Editováno 20.1.2013 23:17
Nahoru Odpovědět
20.1.2013 23:13
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:21.1.2013 8:54

100k slov mi připadá pro můj Atom málo. Nebylo by lepší soutěžit s 10M slovy? Jak dlouhá mají být ta slova?

Nahoru Odpovědět
21.1.2013 8:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Jančík:21.1.2013 9:24

Tak sem to udělal jak si říkal, dal sme tam pole charů a zbytek vypustil. Ale to řazení pak trvalo ještě dýl asi o 20ms. A to jsem zkoušel celkem rychlé metody řazení. Tak nevim, asi budu muset přemigrovat na jiné jazyk.

Nahoru Odpovědět
21.1.2013 9:24
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Jančík
Kit:21.1.2013 9:46

Zkus raději přemigrovat na jiný algoritmus. Bubblesort se na tohle opravdu nehodí :)

Nahoru Odpovědět
21.1.2013 9:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Kit
David Jančík:21.1.2013 10:03

Já sme nebublinkoval :D Ale taky sem zkoušel quick sort, ale nic moc. Pak sem zkoušel přes LINQ ten mě vycházel dycky nejrychlejš, ale na to C++ sme se furt nedostal. Nejrychlejác sem to měl kolem 30ms 50k slov.

Nahoru Odpovědět
21.1.2013 10:03
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Jančík
Kit:21.1.2013 10:56

Také záleží na typu procesoru a celkovém výkonu počítače. Když jsem zkoušel různé jazyky na různých PC, tak na jednom vítězilo C++, na jiném Java.

Nahoru Odpovědět
21.1.2013 10:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Neaktivní uživatel:21.1.2013 10:57

Luboš Běhounek Satik - Máš už hotový referenční program? Potřeboval bych se tě na něco zeptat ohledně mého řešení a nechtěl bych nějak ovlivnit to tvoje, kdybys na něm ještě pracoval :-D

Nahoru Odpovědět
21.1.2013 10:57
Neaktivní uživatelský účet
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:21.1.2013 11:14

Odpovědi na tvé otázky najdeš nahoře - 50k slov jsem tu zkoušel jen kvůli porovnání s gamemakerem, jinak to asi milióny nebo desetimilióny budou :)

Neaktivní uživatel :
Základ už mám, teď už jen ladím drobnosti, možná ještě to zkusím přepsat do asm.

Nahoru Odpovědět
21.1.2013 11:14
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:21.1.2013 16:03

Processor Inlel Core Duo (2.4GHz)
100 000 slov - generování 31 - 32 ms, řazení 31 - 32 ms
1 000 000 slov - generování 330 - 360 ms, řazení 660 - 720 ms
10 000 000 slov - generování - cca 3.5 s, řazení - cca 10.5 s
Psáno v C++.
Kompilováno v g++ (Dev-C++) se zapnitou maximální optimalizací.

 
Nahoru Odpovědět
21.1.2013 16:03
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:21.1.2013 16:17

To uz je docela slusny, zatim nejlepsi vysledek :)

Myslím, že hlavní měření můžeme provést na 10M nebo 100M slovech.

Nahoru Odpovědět
21.1.2013 16:17
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:21.1.2013 16:32

Myslim že 10M je akorát, 100M už je moc, to může trvat i několik minut.

 
Nahoru Odpovědět
21.1.2013 16:32
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:21.1.2013 16:34

Zatím jsem na 7 ms (řazení) pro 100k čísel, zadání jsem schválně napsal tak, aby bylo možné oproti běžnému sortování použít hodně drastické optimalizace.

Jinak napsáno a zkompilováno to mám v MSVS 2008.

Editováno 21.1.2013 16:36
Nahoru Odpovědět
21.1.2013 16:34
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:21.1.2013 16:39

Mě napad ještě jeden způsob jak porovnat řetezce, otázka je ale jestli bude rychlejší, spíš bych řek že ne, ale vyzkoušim to :D

 
Nahoru Odpovědět
21.1.2013 16:39
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:21.1.2013 16:44

No, teoreticky můžeme řadit až něco kolem 400M slov (teď jsem to zkoušel na svém alg. a zvládá to), ale záleží dost na tom, jaká je paměťová náročnost zvolených algoritmů :)

Nahoru Odpovědět
21.1.2013 16:44
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:21.1.2013 16:46

Jinak, měřil jsem to funkcí clock(), takže u těch 100k to asi nebude moc přesný, může to bejt 30, stejně tak 10 nebo 50. Proto jsem sem hodil i ty vyšší čísla, u těch už by to mělo bejt dostatečně přesný.

 
Nahoru Odpovědět
21.1.2013 16:46
Avatar
Luboš Běhounek Satik:21.1.2013 16:47

Koukni na funkce queryperformance, ty to umějí přesněji.

Nahoru Odpovědět
21.1.2013 16:47
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Lukáš Hruda
Michael Olšavský:21.1.2013 17:33

Co je to za algoritmus???? =-O :-D Mě to quicksortem(nebo alespoň napodobeninou) trvá 1 000 000 slov v c# zhruba 5 sekund!

 
Nahoru Odpovědět
21.1.2013 17:33
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michael Olšavský
Kit:21.1.2013 17:45

Tak to jsem si myslel, že se svým naprosto neoptimalizovaným Radixsortem v Javě na Atomu 1.6 GHz a časy

 100000 ...  361 ms generování,  248 ms sort
1000000 ... 2958 ms generování, 1608 ms sort

jsem patlal.

Neberte to jako konečné řešení. Javu se teprve učím a právě jsem dostal nápad, jak to radikálně zrychlit.

Nahoru Odpovědět
21.1.2013 17:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Michael Olšavský
Lukáš Hruda:21.1.2013 18:01

Je to Quick sort... záleží taky dost na tom jak máš napsaný porovnání řetězců a prohození, nesmíš je kopírovat celý.

 
Nahoru Odpovědět
21.1.2013 18:01
Avatar
Odpovídá na Michael Olšavský
Luboš Běhounek Satik:21.1.2013 18:07

C# má nějakou režii oproti C++ navíc a má některé vlastnosti, které se občas nehodí - např. ta, že všechny pole při vytváření vynuluje, což někdy není potřeba a zbytečně to snižuje výkon.

Používání low-level konstrukcí (char[] místo string, pole místo kolekcí) může taky urychlit výpočet, protože se sníží režie.

Míst k optimalizacím je tam spousta.

Když napíšu, že 10 000 000 slov řadím v jednom vlákně na 2,8GHz procesoru za méně než 200ms, budete mi to věřit? :)

Nahoru Odpovědět
21.1.2013 18:07
https://www.facebook.com/peasantsandcastles/
Avatar
Neaktivní uživatel:21.1.2013 18:20

Ač to nechápu, tak věřím :-D

Nahoru Odpovědět
21.1.2013 18:20
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Luboš Běhounek Satik:21.1.2013 19:00

V pátek sem hodím zdrojáky a lehce povysvětlím, co a jak dělám, pokud mě někdo nepřekoná :D

Nahoru Odpovědět
21.1.2013 19:00
https://www.facebook.com/peasantsandcastles/
Avatar
Fugiczek
Tvůrce
Avatar
Fugiczek:21.1.2013 19:26

Jen tak pro představu, základní funkce v Javě na řazení pole mi trvá 160ms a funkce na řazení kolekce 50ms při 50k slov na i5-2410M 2.30GHz.

 
Nahoru Odpovědět
21.1.2013 19:26
Avatar
TomBen
Tvůrce
Avatar
TomBen:21.1.2013 21:49

Hm, tak jsem vyvinul algoritmus na míru tomu zadání.
Je trochu atypický, ale vypadá, že dělá co má. :)

Přinutil jsem s tím GameMaker udělat 1M za 11.13sec. To sice není bůhvíco,
ale u gml kódu to bude pravděpodobně fyzikální hranice. Pro srovnání je
třeba uvést, že třídění stejného množství pomocí vestavěné funkce
( označované v návodech za rychlou ) jsem včera po třech hodinách
vypnul, protože hrozilo, že počítač obroste lišejníkem.

V rychlejších jazycích by ten princip třídil zřejmě celkem neskutečně.

Nahoru Odpovědět
21.1.2013 21:49
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Odpovídá na TomBen
Luboš Běhounek Satik:21.1.2013 21:55

Kdyžtak mi napiš zprávou, jaký postup jsi použil, třeba jsme použili stejný :)

Nahoru Odpovědět
21.1.2013 21:55
https://www.facebook.com/peasantsandcastles/
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 92.