Diskuze: Algoritmus: společné oblastni ve 2D poli
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Tak jsem přišel na řešení s celkem pěknou náročností (maximálně O(M2 N2)). Napsal jsem třídu v JavaSCriptu, která s tímto algoritmem pracuje. Má několik závislostí na mých dalších třídách. Jsou to <strong>dge.Rectangle</strong> (podobná třída, jako je třeba Rectangle z Javy nebo ze C#, jen je implementovaný jako Immutable Object) a <strong>dge.CollisionMap</strong>, což je vlastně 2D pole s několika metodami navíc pro lepší manipulaci. Samotná třída je napsána po vzoru Johna Resiga (http://ejohn.org/…inheritance/)
Algoritmus hledá obdélník od levého horního rohu. Pro každý bod se snaží rozšířit základ (Rectangle 1x1) dolů, vpravo a po diagonále. Ukládá si obsah jednotlivých nalezených oblastí, který pak porovnává a vybere ten největší (pro každý bod pole).
Třída má jednoduché rozhraní. V konstruktoru požaduje 2D pole (v mém
případě objekt typu dge.CollisionMap, lze to ale celkem snadno upravit).
Metoda next() najde největší obdélník v poli a odstraní ho ze zásobníku
(kopie pole). Pokud již žádný obdélník v poli není, vrátí 0. Tohle
konkrétní pole zabralo 7 iterací algoritmu (pro každý obdélník složitost
max. O( M2 N2)) Čím větší oblasti se ve 2D poli
nachází, tím logicky méně krát se musí algoritmus (resp. metoda .next())
provést. U tohohle pole zrovna zbyly 2 samostatné oblasti 1x1. Takové oblasti
by mohl algoritmus klidně ignorovat a zpracovávat je až později s
vykreslením a algoritmus by se tak mohl provést jen 5x, ale to už se mi
nechtělo implementovat 
Animace ještě ukazuje průběh algoritmu. V JavaScriptu jde celkem rychle.
Třída MaxRectangle: http://www.itnetwork.cz/dev-lighter/33
Díky
Nebyla to zrovna
sranda. Lámal jsem si nad tím hlavu dva dny. Když jsem to hledal na
internetu, našel jsem dokonce méně náročné řešení, než tady ukazuji,
ale to se mi nepovedlo implementovat, protože to vysvětlení bylo strašně
nejasné. Jsem ale rád, že mám alespoň tohle. Můžu spustit jen jednou a
výsledky zapsat do cache třeba nebo JSON a už to nemusím znovu generovat
ale pro pole o velikosti 42*11
zpracování webkitu trvalo nějakých 15ms
EDIT: někdy se pokusím odstranit ty závislosti a napíšu o tom sem,
protože o tom nikde nic není
Teď je to vysvětlení a kód pro ostatní asi celkem nepoužitelné.
Takže tohle je taková brute-force? Prostě to zkouší pokládat obdélníky kam jdou a pak vybere největší a vymázne ho?
Tak trochu
Akorát při tom
rozšiřování se to snaží rozšiřovat, jen když to má smysl, takže tam
nemusím znova procházet všechna pole.
Zobrazeno 6 zpráv z 6.