Stromové struktury a tridici algoritmy

Anonym

Stromové struktury a tridici algoritmy
« kdy: 16. 11. 2017, 09:00:25 »
Byl jsem upozornen pri pohovoru do jedne firmy ve které se dělají inf. systémy v Node.js, že vstupní test je "těžký" a mám se podívat na stromové struktury, snad i třídící algoritmy tuším.

Dělám v Javě a přijde mi to trochu divné. Nikdy jsem nepotřeboval dávat cokoliv do stromů nebo používal special třídící algoritmy typu quicksort atp.

Důvod je ten, že když potřebuju něco třídit, tak prostě použiju hashset. V podstatě setřízené pole nějakých hodnot, nad kterým se provede vyhledávání typu rozděl a panuj, se chová úplně stejně, jako průchod vyváženým binárním stromem. Protojsem nemusel nikdy ani implementovat strom. Hashset prostě nahradí jak třídění, tak vyhledávání a proto jsem zřejmě v životě nikde quickosrt napsaný neviděl.

Jsou to pro mě prostě nějaké scifi věci, které jsem se sice učil v nějakých základech algoritmizace, ale nikdy jsem je nikde nepoužil. Proto mě překvapuje, že by to snad někde běžně implementovávali v Javascriptu.

Dokonce i snad nějaké struktury typu LinkedList jsou v 99% případů nanic, rychlejší je ArrayList.

Možná jsou vyjímky pro velké objemy dat, vím že DB používají třeba R-stromy, ale opět, implementovat takové věci při vývoji IS mi přijde teda dist scifi.

Tak co, pletu se? Nechám se překvapit.


Kit

Re:Stromové struktury a tridici algoritmy
« Odpověď #1 kdy: 16. 11. 2017, 10:10:32 »
Node.js nemá s Javou nic společného.

Je to jen test na to, jak zvládáš algoritmizaci. V projektu to pak nenajdeš.

Whoever

Re:Stromové struktury a tridici algoritmy
« Odpověď #2 kdy: 16. 11. 2017, 10:23:40 »
Človeče sorry, ale ak chceš triediť HashSetom, tak zjavne by sa ti trocha vhľadu do tých štruktúr zišlo :) resp. dobre, povedzme že si sa pomýlil a chcel si TreeSet, ale ak stále nechápeš, prečo by niekedy nebolo výhodnejšie na to jednorázovo pustiť quicksort, tak ten test docela splnil účel.

Anonym

Re:Stromové struktury a tridici algoritmy
« Odpověď #3 kdy: 16. 11. 2017, 11:29:12 »
Node.js nemá s Javou nic společného.

Je to jen test na to, jak zvládáš algoritmizaci. V projektu to pak nenajdeš.

To bylo tak strasne poucne... Naco ten test na algoritmizaci teda je, kdyz to nikdo realne nepouziva?

Re:Stromové struktury a tridici algoritmy
« Odpověď #4 kdy: 16. 11. 2017, 11:44:11 »
Přesně jak píše Whoever – máte v tom pěkný hokej. Pro začátek vůbec nemusíte studovat, jak které algoritmy fungují – bude stačit, když si zjistíte, k čemu slouží, co je to třídění, co je řazení, co je vyhledávání, co je metoda „rozděl a panuj“. HashSet sice interně používá třídění, ale je to třídění na základě hashe, takže je to jen interní implementace. Uživatel HashSet používá pro vyhledávání hodnot, řazení hodnot v HashSetu je „náhodné“. K vyhledávání v HashSetu ani ve vyváženém binárním stromu se nepoužívá metoda rozděl a panuj, poněkud tam schází ta fáze „rozděl“. Tvrzení, že LinkedList je rychlejší než ArrayList, také není pravdivé – ono těch několik implementací Listu v Javě není proto, že by jedna byla dobrá a ostatní špatné a neměly by se používat. Ty různé implementace jsou tam proto, že se v různých situacích chovají různě, takže pro některá využití je vhodnější LinkedList a pro některá zase ArrayList.

Nechápu, proč se zkoušení z algoritmů dává do vstupních pohovorů pro programátory, protože drtivá většina programátorů řeší jiné typy úloh a opravdu nepotřebují znát, jak je implementován quicksort nebo ArrayList – ale měli by vědět, jaké jejich charakteristiky jsou důležité a umět si je zjistit, když to budou potřebovat. Ale evidentně takový test odhalí aspoň případy, kdy někdo ani neví, k čemu které datové struktury slouží a jak se používají.


Kiwi

Re:Stromové struktury a tridici algoritmy
« Odpověď #5 kdy: 16. 11. 2017, 13:07:55 »
Nechápu, proč se zkoušení z algoritmů dává do vstupních pohovorů pro programátory, protože drtivá většina programátorů řeší jiné typy úloh a opravdu nepotřebují znát, jak je implementován quicksort nebo ArrayList – ale měli by vědět, jaké jejich charakteristiky jsou důležité a umět si je zjistit, když to budou potřebovat. Ale evidentně takový test odhalí aspoň případy, kdy někdo ani neví, k čemu které datové struktury slouží a jak se používají.

Já zase nechápu uchazeče o místo, kteří mají potřebu potenciálního zaměstnavatele poučovat o tom, co vlastně potřebuje a co ne a na co se jich má ptát. Připadá mi to poněkud absurdní i u studentů, když tu žehrají na to, že po nich na školách chtějí, aby se učili "zbytečnosti", ale že už jim to vadí i u zaměstnavatelů, to je vážně vrchol. Existuje takové trefné české pořekadlo o kozlu zahradníkem.

Zaměstnavatel si ověřuje, zda uchazeč o místo programátora umí programovat - no co si to dovoluje! Hlavně po mně nechtějte nic, u čeho bych musel trochu potrápit hlavu, dejte mi přesnou specifikaci a k tomu knihovny, co už všechno řeší, já vám to v Javě polepím dohromady, za což budu chtít nejmíň tak 120 tisíc měsíčně, protože to je přece děsně mentálně náročná práce, a buďte rádi, že máte tu čest mě zaměstnávat. Je fakt, že takový dojem ve mně poslední léta, kdy jsem ještě vedl pohovory, z nových uchazečů stále více sílil.

Sakra! Když na to nemáte IQ, tak na ty školy nelezte a běžte se živit něčím, na co intelektuálně stačíte - třeba točením popelnic! Programátor, který neumí programovat, je totiž i zadarmo drahý. A jak nám jako studentům říkával na škole Virius - programátor, který nezná základní třídící algoritmy, to ani není programátor.

Kit

Re:Stromové struktury a tridici algoritmy
« Odpověď #6 kdy: 16. 11. 2017, 13:20:58 »
A jak nám jako studentům říkával na škole Virius - programátor, který nezná základní třídící algoritmy, to ani není programátor.

V těch lepších školách kromě třídicích algoritmů učí i řadicí algoritmy. Takové řazení tříděním, to je pecka!

Kiwi

Re:Stromové struktury a tridici algoritmy
« Odpověď #7 kdy: 16. 11. 2017, 13:55:43 »
A jak nám jako studentům říkával na škole Virius - programátor, který nezná základní třídící algoritmy, to ani není programátor.

V těch lepších školách kromě třídicích algoritmů učí i řadicí algoritmy. Takové řazení tříděním, to je pecka!

A na základních školách se za mých mladých let mimo jiné vysvětlovalo, co to jsou synonyma. Kde jsou ty časy...

Kit

Re:Stromové struktury a tridici algoritmy
« Odpověď #8 kdy: 16. 11. 2017, 14:04:55 »
A jak nám jako studentům říkával na škole Virius - programátor, který nezná základní třídící algoritmy, to ani není programátor.

V těch lepších školách kromě třídicích algoritmů učí i řadicí algoritmy. Takové řazení tříděním, to je pecka!

A na základních školách se za mých mladých let mimo jiné vysvětlovalo, co to jsou synonyma. Kde jsou ty časy...

Kde vidíš nějaká synonyma? V tělocviku jste setřiďovali podle velikosti? My jsme se vždy museli seřadit. Jablka jsme také neřadili do bedýnek, ale třídili.

Whoever

Re:Stromové struktury a tridici algoritmy
« Odpověď #9 kdy: 16. 11. 2017, 14:33:32 »
A vôbec, netvárme sa že tie algoritmické testy sú nejaký IŤácky ekvivalent IQ testu, sú to normálne praktické veci, ktorých základy by schopný programátor mal vedieť "by heart", nie len podľa náhladu do Stack O. alebo API. OP pekne oddemonštroval k čomu je to dobré, nikto nikde po nikom nechce aby implementoval quicksort, RB strom alebo haldu, ale bez ich znalostí je človek odsúdený k produkovaniu úplne nezmyselných performance bottleneckov v štýle produkovania zosortených polí z HashSetu, lebo nemáš potuchy jak to funguje, či to nejde lepšie a že vôbec existuje niečo lepšie.

Re:Stromové struktury a tridici algoritmy
« Odpověď #10 kdy: 16. 11. 2017, 14:59:03 »
A jak nám jako studentům říkával na škole Virius - programátor, který nezná základní třídící algoritmy, to ani není programátor.

V těch lepších školách kromě třídicích algoritmů učí i řadicí algoritmy. Takové řazení tříděním, to je pecka!

A na základních školách se za mých mladých let mimo jiné vysvětlovalo, co to jsou synonyma. Kde jsou ty časy...

Kde vidíš nějaká synonyma? V tělocviku jste setřiďovali podle velikosti? My jsme se vždy museli seřadit. Jablka jsme také neřadili do bedýnek, ale třídili.

Ceska terminologie neni stastne zvolena, ale je takova, jaka je. Se s tim smir.

x14

  • ***
  • 182
    • Zobrazit profil
    • E-mail
Re:Stromové struktury a tridici algoritmy
« Odpověď #11 kdy: 16. 11. 2017, 15:15:44 »
A na základních školách se za mých mladých let mimo jiné vysvětlovalo, co to jsou synonyma. Kde jsou ty časy...
Tak pro absolventa základní školy by se to za synonyma považovat dalo. Ale programátor by v tom rozdílu měl mít jasno.

Kit

Re:Stromové struktury a tridici algoritmy
« Odpověď #12 kdy: 16. 11. 2017, 15:20:40 »
Kde vidíš nějaká synonyma? V tělocviku jste setřiďovali podle velikosti? My jsme se vždy museli seřadit. Jablka jsme také neřadili do bedýnek, ale třídili.

Ceska terminologie neni stastne zvolena, ale je takova, jaka je. Se s tim smir.

Česká terminologie je zvolena v daném případě správně, rozděluje anglické homonymum sort podle sémantiky na slova třídit a řadit. Mimo programování si to lidé nepletou.

Naopak my máme jako homonymum například pole. Anglicky se to rozlišuje na field, array, ... Hromada vývojářů označuje slovem pole i většinu kolekcí, čímž do toho vnáší slušný chaos.

Re:Stromové struktury a tridici algoritmy
« Odpověď #13 kdy: 16. 11. 2017, 15:30:50 »
Já zase nechápu uchazeče o místo, kteří mají potřebu potenciálního zaměstnavatele poučovat o tom, co vlastně potřebuje a co ne a na co se jich má ptát.
Já nejsem uchazeč o místo. A zaměstnavatele nepoučuju, jenom jsem podotkl, že tenhle typ testu zpravidla zjišťuje něco jiného, než zaměstnavatel od programátora potřebuje.

Zaměstnavatel si ověřuje, zda uchazeč o místo programátora umí programovat - no co si to dovoluje!
Právě že tak to není. „Umět programovat“ může znamenat spoustu různých věcí, a ve většině případů to není „umět z paměti napsat quicksort“. Naopak pro většinu programátorů dnes platí, že „umět programovat“ mimo jiné znamená vědět, že quicksort nebudu implementovat sám, protože existuje spousta implementací, které jsou lepší než to, co bych naimplementoval sám. V lepším případě pak platí také to, že „umět programovat“ znamená vědět, že dnešní počítače jsou mnohem složitější, než byly počítače v šedesátých letech minulého století, takže naivní implementace quicksortu může být velmi pomalá v porovnání s jinými implementacemi, pokud nebude brát v úvahu třeba různě rychlý přístup k různým keším RAM, zamykání paměti, vícevláknové procesory, více pipline v jednom vlákně procesoru, predikci skoků apod.

Mimochodem, je hezké, jak akademici pořád uvádějí quicksort, i když v reálném světě jsou někdy efektivnější jiné algoritmy. Což je mimochodem další z dovedností, které by měla mít většina programátorů – nespoléhat na to, že nejrychlejší je přece quicksort, protože se to tak učí ve škole – ale umět posoudit, jaké vlastnosti mají data, která chci řadit, a podle toho vybrat vhodný řadicí algoritmus. A také posoudit, zda vůbec je nutné ta data řadit…

Programátor, který neumí programovat, je totiž i zadarmo drahý.
Akorát že programátor, který neumí programovat, klidně může z paměti vystřihnout quicksort. Protože „umět programovat“ právě znamená něco jiného.

Jenda

Re:Stromové struktury a tridici algoritmy
« Odpověď #14 kdy: 16. 11. 2017, 18:37:33 »
Hm, proto je možná poslední dobou různý software tak záhadně pomalý  ::)

V podstatě setřízené pole nějakých hodnot, nad kterým se provede vyhledávání typu rozděl a panuj, se chová úplně stejně, jako průchod vyváženým binárním stromem. Protojsem nemusel nikdy ani implementovat strom.

A co třeba insert do takové struktury? (pro rýpaly: ano, znám děravé setříděné takypole, které má find, insert i delete amortizovaně n*logn)

Ceska terminologie neni stastne zvolena, ale je takova, jaka je. Se s tim smir.

Jedno je normální porovnávací sort a druhé neporovnávací (např. radix sort nebo counting sort).