abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:44 | Nová verze

    Po roce vývoje od vydání verze 1.24.0 byla vydána nová stabilní verze 1.26.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.26.

    Ladislav Hagara | Komentářů: 0
    dnes 04:33 | Nová verze

    Byla vydána nová verze 6.2 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl povýšen na verzi 13.0.14.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána nová verze 30.0.0 frameworku pro vývoj multiplatformních desktopových aplikací pomocí JavaScriptu, HTML a CSS Electron (Wikipedie, GitHub). Chromium bylo aktualizováno na verzi 124.0.6367.49, V8 na verzi 12.4 a Node.js na verzi 20.11.1. Electron byl původně vyvíjen pro editor Atom pod názvem Atom Shell. Dnes je na Electronu postavena celá řada dalších aplikací.

    Ladislav Hagara | Komentářů: 0
    dnes 04:11 | Nová verze

    Byla vydána nová verze 9.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 220 vývojářů. Provedeno bylo více než 2 700 commitů. Přehled úprav a nových vlastností v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    včera 23:22 | IT novinky

    Evropský parlament dnes přijal směrnici týkající se tzv. práva spotřebitele na opravu. Poslanci ji podpořili 584 hlasy (3 bylo proti a 14 se zdrželo hlasování). Směrnice ujasňuje povinnosti výrobců opravovat zboží a motivovat spotřebitele k tomu, aby si výrobky nechávali opravit a prodloužili tak jejich životnost.

    Ladislav Hagara | Komentářů: 2
    včera 16:11 | Nová verze

    Bylo oznámeno (cs) vydání Fedora Linuxu 40. Přehled novinek ve Fedora Workstation 40 a Fedora KDE 40 na stránkách Fedora Magazinu. Současně byl oznámen notebook Slimbook Fedora 2.

    Ladislav Hagara | Komentářů: 8
    včera 13:44 | Upozornění

    ČTK (Česká tisková kancelář) upozorňuje (X), že na jejím zpravodajském webu České noviny byly dnes dopoledne neznámým útočníkem umístěny dva smyšlené texty, které nepocházejí z její produkce. Jde o text s titulkem „BIS zabránila pokusu o atentát na nově zvoleného slovenského prezidenta Petra Pelligriniho“ a o údajné mimořádné prohlášení ministra Lipavského k témuž. Tyto dezinformace byly útočníky zveřejněny i s příslušnými notifikacemi v mobilní aplikaci Českých novin. ČTK ve svém zpravodajském servisu žádnou informaci v tomto znění nevydala.

    Ladislav Hagara | Komentářů: 18
    včera 13:33 | Komunita

    Byla založena nadace Open Home Foundation zastřešující více než 240 projektů, standardů, ovladačů a knihoven (Home Assistant, ESPHome, Zigpy, Piper, Improv Wi-Fi, Wyoming, …) pro otevřenou chytrou domácnost s důrazem na soukromí, možnost výběru a udržitelnost.

    Ladislav Hagara | Komentářů: 0
    včera 13:00 | Nová verze

    Společnost Meta otevírá svůj operační systém Meta Horizon OS pro headsety pro virtuální a rozšířenou realitu. Vedle Meta Quest se bude používat i v připravovaných headsetech od Asusu a Lenova.

    Ladislav Hagara | Komentářů: 0
    včera 04:33 | IT novinky

    Společnost Espressif (ESP8266, ESP32, …) získala většinový podíl ve společnosti M5Stack, čímž posiluje ekosystém AIoT.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (72%)
     (10%)
     (2%)
     (17%)
    Celkem 705 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Konstantní složitost u jednosměrného spojového seznamu

    24.10.2010 23:03 | Přečteno: 2219× | Linux a další věci co má společného s IT

    Tak už jsem dlouho nenapsal žádný blog, tak jsem se rozhodl, že spojím užitečné se zábavou. Takže jelikož jsem v poslední době byl někým žádán abych mu poskytl svůj program pro názorný výpočet determinantu (Python a PyQt vše je v dokumentaci), tak ho vložím i sem. Třeba se to taky někomu bude hodit. Dál se pokusím najít Salxeso (pexeso psané v Javě, samozřejmě psané jako semestrálka, takže to není žádný zázrak) do kterého mi tady někdo taky dělal hrací karty.

    A teď se konečně dostáváme k věcem, na které jsem se zdejších odborníků chtěl zeptat, zda jsou vůbec proveditelné. Takže dostali jsme za úkol na C/C++ abychom napsali spojoví seznam. Na tom není nic těžkého podmínky byly jasně stanoveny, aby byl jednosměrný a aby obsahoval určité metody a to konkrétně: head(), first(), last(), isEmpty(), popFront(), pushFront(SItem), pushBack(SItem), insertAfter(SHandle *, SItem), concat(SList *), makeEmpty,moveAfter(SHandle *,SHandle *), moveToFront(SHandle *), moveToBack(SHandle *), remove(SHandle *). Na tom by nebylo nic složitého, ale máme další podmínku a to aby tyto metody měli konstantní časovou složitost, ale zde již narážím. Skoro všechny metody lze udělat s konstantní časovou složitostí ale pouze s dvousměrným seznamem (alespoň se tak domnívám). Konkrétně mi jde o tyto metody: insertAfter(SHandle *, SItem), makeEmpty, moveAfter(SHandle *,SHandle *), moveToFront(SHandle *), moveToBack(SHandle *), remove(SHandle *). U těchto metod totiž potřebujeme vědět předchůdce objektu (prvku) a jedinou možností, která mě napadá je si celý seznam projít a nalézt hledaného předchůdce, tudíž se dostáváme na časovou složitost algoritmu O(n). Navíc třeba metoda makeEmpty, která má celý spojoví seznam zahodit nelze v C++ realizovat, pokud používáme dynamické přidělování paměti, protože by nám objekty zůstali vyset v paměti, ale nevím jestli se i tohle počítá do časové složitosti toho algoritmu, ale řekl bych, že ano.

    Tak co jaký názor na to mát? Myslíte si někdo, že to půjde, nebo je to pouze špatně zadané? Nebo jsem úplný blbec (to jsem :-D)?

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    Saljack avatar 24.10.2010 23:07 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Příloha:
    Tady je ten program pro názorný výpočet determinantu.
    Sex, Drugs & Rock´n Roll.
    Saljack avatar 24.10.2010 23:09 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Příloha:
    A tady Salxeso nevím co je to za verzi, takže tam něco nemusí jít ale snad by to měla být ta poslední. Spuštění klasicky "java -jar salxeso.jar"
    Sex, Drugs & Rock´n Roll.
    24.10.2010 23:35 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    IMHO se ty operace dají udělat i s jednosměrně zřetězeným seznamem v konstantním čase, jenom to neni zrovna obvyklé řešení (to s "přesměrovánim" ukazatelů).

    Operaci vyjmout prvek lze totiž udělat i tak, že si zapamatuješ "obsah" prvku a ten nahradíš "obsahem" jeho následníka (včetně ukazatele na následující prvek).

    Každý má právo na můj názor!
    Saljack avatar 24.10.2010 23:41 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Jo tohle mě nenapadlo :-( tak by to šlo.
    Sex, Drugs & Rock´n Roll.
    Saljack avatar 24.10.2010 23:44 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Otázkou je, jestli tohle je zrovna dobré řešení a není náhodou celkem zbytečné. Nebude to už moc obecné, protože budu muset mít něco co ten objekt bude kopírovat a příjde mi to celkem zbytečné.
    Sex, Drugs & Rock´n Roll.
    Saljack avatar 25.10.2010 00:13 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Tak je to dobré řešení :-D, protože tam mám ukazatele na ty prvky, takže je stačí jenom prohodit a nemusím nic kopírovat. Takže dík.
    Sex, Drugs & Rock´n Roll.
    xxx avatar 24.10.2010 23:42 xxx | skóre: 42 | blog: Na Kafíčko
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Tak to jsem zvedavej jak. Ja totiz myslim, ze u toho jednosmerneho seznamu je hlavni problem se tim, abys nasel nejaky prvek, ze se nedostanes pod O(n). Abych to zjednodusil, predpokladejme obyceny jednosmerny spojovy seznam o N prvcich. Chci vratit N-1 prvek (to kdyby snad chtel mit nekdo pointr na last). Jak to udelat v N-1 krocich?
    Please rise for the Futurama theme song.
    xxx avatar 24.10.2010 23:49 xxx | skóre: 42 | blog: Na Kafíčko
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ha tak stara felacka struktura Tumic mi poradila, ze treba u insertAfter mam ptr na prvek za ktery chci vkladat, tak jako bych nic nerek.
    Please rise for the Futurama theme song.
    24.10.2010 23:44 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    jej, tak jsem byl pomalejší... ;-)
    25.10.2010 00:37 Martin Doucha | skóre: 23 | blog: Yet another blog
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Tohle má dva háčky:

    1) Bude to za konstantu jen za předpokladu, že kopírování datové položky je za konstantu. To obecně nemusí platit.

    2) Nepůjde smazat poslední prvek. I kdyby typ datové položky měl nějakou speciální "prázdnou" hodnotu, nebude jak správně aktualizovat ukazatel na konec seznamu, který je potřeba pro jiné operace.

    Jediná věc, která mě napadá, je předávat trhacím operacím seznam s hlavou, tedy předka skutečně trhané položky. Pak to fungovat bude.
    Saljack avatar 25.10.2010 00:40 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    1) Řešit nemusím, protože mám ty prvky jako ukazatele, tak je pouze nahradím. 2) To je pravda a celý se mi to asi zbořilo jak hromádka z karet.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 00:52 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    2) Nepůjde smazat poslední prvek. I kdyby typ datové položky měl nějakou speciální "prázdnou" hodnotu, nebude jak správně aktualizovat ukazatel na konec seznamu, který je potřeba pro jiné operace.

    Místo ukazatele na poslední prvek seznamu můžeš udržovat ukazatel na předposlední prvek.

    Každý má právo na můj názor!
    Saljack avatar 25.10.2010 00:54 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ale to nic nevyřeší, protože pak nebudeš mít zase ten ukazatel na ten předposlední, takže jsi v pytli :-(.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 00:58 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    ?! Ukazatel na předposlední prvek si právě budeš pamatovat. A jestli si myslel "poslední" místo "předposlední", tak k tomu se z předposledního lehce dostaneš v konstantnim čase...

    Každý má právo na můj názor!
    Saljack avatar 25.10.2010 01:03 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    No to sice jo, ale co když budeš potřebovat odebrat 2x za sebou poslední prvek, v tomto případě už nemůžeš zjistit ten předposlední prvek.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 01:14 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    Máš pravdu, teorie s předposlednim prvkem je blbost. Nicméně by to mělo jít udělat přes "fixní" poslední prvek seznamu. Tzn. poslední prvek seznamu by byl "speciální" prvek, který by se nikdy nemazal.

    Každý má právo na můj názor!
    Saljack avatar 25.10.2010 01:20 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    To ale taky nejde, protože já potřebuju vracet i ten poslední prvek a tím pádem bych musel ten seznam projít.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 01:39 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    Myslim to tak, že ten poslední prvek nebude navenek součástí seznamu. Seznam prostě pro N "uživatelskejch" prvků bude mít interně N + 1 prvků.

    Každý má právo na můj názor!
    25.10.2010 01:43 Martin Doucha | skóre: 23 | blog: Yet another blog
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Máš dvě možnosti. Buď ukazatel na poslední prvek v hlavičce seznamu ukazuje na prvek N+1, a pak je k ničemu, nebo ukazuje na prvek N, ale pak ho neumíš opravit při mazání prvku N.
    Saljack avatar 25.10.2010 08:04 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Takže to takhle nejde, můžete to ještě někdo porvrdit ať dneska nejsem za vola, když se ho na to budu ptát.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 12:11 Martin Doucha | skóre: 23 | blog: Yet another blog
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ono to jde, ale prostě musíš jako parametr dostávat ukazatele na předka a ne přímo na mazaný prvek.
    Saljack avatar 25.10.2010 12:32 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Jenže toho předka musíš někde nalézt a ten lze nalézt jenom za pomocí toho, že projdu celý seznam a to je opět lineární složitost, takže jsi stejně kde jsem akorát si problém rozložil na dva.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 13:30 Martin Doucha | skóre: 23 | blog: Yet another blog
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Jasně, ale o tuhle lineární složitost už se nemusíš starat, protože jí musí zaplatit ten, kdo ty operace volá. Obecně platí, že když máš operace insert, delete a findMin, tak všechny za konstantu mít nemůžeš (ani amortizovanou), aspoň jedna z nich musí mít složitost aspoň log(n).
    Saljack avatar 25.10.2010 13:40 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Jako šlo by to, ale bude to celkem divný, hlavně třeba u mazání dostávat předchůdce mazaného prvku je celkem blbost :-D.
    Sex, Drugs & Rock´n Roll.
    Saljack avatar 25.10.2010 13:41 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Je pravda, že tohle v zadání není :-D
    Sex, Drugs & Rock´n Roll.
    Gilhad avatar 25.10.2010 18:16 Gilhad | skóre: 20 | blog: gilhadoviny
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    No, urcite jde vymyslet priklad, kdy vysledek nejakeho vypoctu bude "tady je prvek, nastav ho takhle a ten za nim smaz" :)

    A navic, pokud se jedna o zadani ukolu do skoly, tak neni tak kriticky dulezite resit, k cemu by se to pouzivalo, pokud by se to snad nekdy pouzilo, ale je potreba resit jak to udelat, abych dodrzel zadani a ziskal pozadovany vysledek.

    (Ac to zni absurdne, tak pokud je pozadovana pouze konstantni casova narocnost, ale nikoli efektivita, tak by kazde to vloani mohlo jako vedlejsa spocist pi na tisic cisel a vysledek zahodit. Porad by to bylo konstatni v case, i kdyz absolutne neefektivni, cili zadani by to stejne doslovne splnilo. Takze pokud neni v zadani i hlavicka funkce, tak je teoreticky mozne si ji navrhnout tak, aby obsahovala pointer na predchozi prvek a osetrit specialni pripad zacatku seznamu.)
    25.10.2010 19:50 petris
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Vzhledem k tomu, ze v zadani nebyla konstantni operace next(), tak si muzes udelat ty ukazatele opacne. Pak jsou vsechny operace az na next a vymazani celeho seznamu konstantni.
    Saljack avatar 25.10.2010 20:06 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    next musí mít taky konstantní složitost.
    Sex, Drugs & Rock´n Roll.
    24.10.2010 23:39 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    insertAfter(SHandle *, SItem), makeEmpty, moveAfter(SHandle *,SHandle *), moveToFront(SHandle *), moveToBack(SHandle *), remove(SHandle *). U těchto metod totiž potřebujeme vědět předchůdce objektu (prvku)
    Předpokládám, že předchůdce je právě ten první parametr. Čili hledat ho nepotřebuješ: insertAfter(SHandle *item, SItem) {item->next = /*novej prvek*/;}
    moveToFront je jednoduché.
    A remove konstatně moc nejde, leda že bys hodnotu následujícího překopíroval do toho k odebrání, napojil ten následující za následujícím a uvolnil následující.
    moveToBack a moveAfter imho konstatně nepůjdou.
    makeEmpty nevím co znamená, ale jestli to zahrnuje uvolňování paměti všech, konstatní složitost to určitě mít nebude...
    24.10.2010 23:43 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Počkat, moveToFront vlastně jednoduché není, ledaže bys zase přehazoval hodnoty, což by se týkalo všech move* a pak by to bylo konstatní.

    Jinak můžeš se mrknout sem, složitost tam je popsaná..
    Saljack avatar 24.10.2010 23:51 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    To moveToFront je jednoduché, protože máš prvek, který je jako první (head) ale není součástí seznamu (tak to bylo v zadání). Jenže když ten prvek posuneš musíš ho z jeho pozice odebrat a musíš nějak udělat aby ten předcházející prvek odkazoval na ten další a to problém je, ale jde to řešit jak již někdo napsal výše tím, že se ten další prvek nakopíruje na místo prvku, který chci přesunout.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 00:12 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    že se ten další prvek nakopíruje na místo prvku, který chci přesunout.
    Jj, tak jsem to myslel. Dalo by se to udělat tak, že bys ty hodnoty do toho seznamu nevkládal přímo, ale přes pointer - "kopírování" by pak bylo jednoduchý. Ono s nějakým nasazením třeba templatů nebo něčeho by to v podstatě takhle dopadlo tak jako tak...
    Saljack avatar 25.10.2010 00:15 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    No oni naštěstí ty pointry (na ty objekty) jsou v zadání :-D takže jsem to měl už připravené jenom jsem to upravil :-D.
    Sex, Drugs & Rock´n Roll.
    Saljack avatar 25.10.2010 00:15 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ale to makeEmpty konstantně nejde :-(
    Sex, Drugs & Rock´n Roll.
    25.10.2010 00:30 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    Taky to jde, když pro seznam použiješ jeden "buffer" (kterej budeš třeba exponenciálně zvětšovat) a nebudeš alokovat paměť pro každý prvek zvlášť.

    Každý má právo na můj názor!
    Saljack avatar 25.10.2010 00:36 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ale tím už bych neměl konstantní třeba přidání prvku ne?
    Sex, Drugs & Rock´n Roll.
    25.10.2010 00:42 Martin Doucha | skóre: 23 | blog: Yet another blog
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Bude to amortizovaně konstantní. Jeden insert sice může způsobit kopii celého pole, ale při exponenciálním zvětšování počtu položek bude nasčítaný počet zkopírování jedné položky ku počtu položek celkem konstanta.
    Saljack avatar 25.10.2010 00:47 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Otázkou je, jestli amortizovaně konstantní je také konstantní u tohle si právě nejsem jistý.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 00:56 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    Správnou odpověď ti dá asi jenom zadavatel, tedy cvičící. Já bych to tipoval, že operace smazat seznam konstantní bejt nemusí, jenom to neni v zadání explicitně napsaný. V nejhoršim případě můžeš prostě jenom "vynulovat" ukazatel na začátek seznamu a argumentovat tim, že o uvolňování paměti se v zadání nic nepíše ;-).

    Každý má právo na můj názor!
    Saljack avatar 25.10.2010 00:59 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    No tak já tam to uvolnění nechám, s tím, že ten algoritmus bude mít konstantní složitost pokud ho vezmeme jako jazykově nezávislý ;-).
    Sex, Drugs & Rock´n Roll.
    Grunt avatar 27.10.2010 20:14 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    IMHO si zase cvičící/zadávající představuje, že ta metoda/funkce nacpe do nějakého pracovního registru nebo proměnné místo pointeru na začátek či libovolný prvek seznamu hodnotu NULL, čímž se ztratí jakákoliv reference na celý seznam a o zbytek se postará Garbage collector (jeho režije už se asi těžko nějak spojovat s programem samotným a většinou stejně to místo nevratí, ale označí ho za volné a bude použito pro další alokace v rámci frameworku, takže krom nějakého blbého papírování celkový propálený čas null komma null). Teda to by aspoň platilo pro C++. V céčku už by to bylo horší. Asi by to chtělo něco ve smyslu flagů pro každý prvek a určit jestli je prvek ještě k něčemu a nebo už k ničemu a dá se použít při dalším vkládání (nebudeš muset zbytečně alokovat, ale můžeš prvek rovnou požít a data v něm jen přepsat). No do realokace a zvětšovaní/zmenšovaní spojitého bufferu bych se určitě nepouštěl. To je blbost. Přijdeš tím skoro o všechny výhody spojovaného seznamu. To už z toho potom radši udělat nějaké chytřejší pole, čímž tu konstantní složitost zajistíš téměř určitě.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    Grunt avatar 27.10.2010 20:45 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    :-) a nebo si ten Garbage collector můžeš implementovat sám. Udělat ještě jeden seznam prvky alokované, ale jinak úplně na h*vn*, v případě že budeš chtít alokovat, tak můžeš mrknout do toho druhého seznamu a prvky už alokované jen znova přidělíš a ještě si do toho napíšeš nějakou čistící rutinu, která po nějaké časové periodě mrkne do toho druhého seznamu a pokud v něm bude nějaký prvek, tak ho podle pointerů projede a celý uvolní. U procedur z vnějšího rozhraní dodržíš zadání a jak se to dělá uvnitř už nikoho nemusí zajímat.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    25.10.2010 01:38 Martin Doucha | skóre: 23 | blog: Yet another blog
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    No, mazání seznamu po jednotlivých prvcích se dá spáchat i tak, že se ten seznam hodí do pomocného pointeru a při libovolné jiné operaci se z pomocného pointeru smaže nějaký konstantní počet prvků. Celkově tak nekonstantní složitost může mít jedině destruktor kontejneru, který musí zbytek uklidit najednou.
    Saljack avatar 25.10.2010 02:08 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    To by šlo :-D ale je to celkem prasárna :-D
    Sex, Drugs & Rock´n Roll.
    Josef Kufner avatar 25.10.2010 00:59 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Té kopii se dá vyhnout. Viz Qt Container Classes
    Hello world ! Segmentation fault (core dumped)
    25.10.2010 01:40 Martin Doucha | skóre: 23 | blog: Yet another blog
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Tahle technika je ale podvod, spoléhá na to, že log(n) je konstanta.
    Josef Kufner avatar 25.10.2010 01:54 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Naopak, ono to z toho tu (malou) konstantu dělá.
    Hello world ! Segmentation fault (core dumped)
    25.10.2010 02:27 Kvakor
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ale to makeEmpty konstantně nejde :-(
    Jde, ale ne standardní alokaci paměti. Je třeba použít jiný typ alokace, tj. buď si jí dělat osobně (např. přes mmap()), nebo použít nějaký hiearchický alokator, jako třeba obstack nebo talloc. Když pak chcete zahodit celý seznam, tak stačí jen zrušit kontajner, ve kterém jsou jednolivé objekty alokovány.
    25.10.2010 09:00 Martin Mareš
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Spoléháte ovšem na to, že mmap() má konstantní časovou složitost, což (1) Vám nikdo neslibuje, (2) není pravda.
    25.10.2010 21:18 Kvakor
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    V praxi se mmap()uje /dev/zero, což je metoda, jakou používají používají i standardní knihovny (vedle brk()/sbrk()). Za optimálních podmínek je odmapování otázka jediného volání jádra, takže v praxi nemá uživatelský program stejně žádnou rychlejší metodu, jak navrátit paměť operačnímu systému.

    V moderních OS je dokonce možné ještě dále snížit režii jádra použitím stránek větších než 4KB (běžně 1MB, u nejnovějších procesorů až 1GB), což má i kladný vliv na rychlost přístupu k této paměti (lepší využitím TBL cache). V ultimativním případě se dá celá komplikovaná struktura uvolnit v čase velmi blízkém O(1), tedy pokud se do takovéto olbřímí stránky vejde celá.

    Bohužel opravdu konstantí časová složitost opravdu zajistit nejde, ale dá se jí dost přiblížit zamknutím stránek v paměti a naplánování se jako realtime proces. Jenže pravé realtimové procesy stejně většinou nepoužívají klasickou dynamickou alokaci, buď mají všechny struktury statické, nebo přidělují bloky pevné velikosti.
    26.10.2010 09:09 Martin Mareš
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Režie mmap() zdaleka nezávisí jenom na stránkách, ale (zrovna v případě Linuxu, jiné systémy na tom jsou podobně) i na režii VMA-listů, které mají logaritmickou složitost vzhledem k počtu prvků – jsou to ve skutečnosti vyhledávací stromy, protože je potřeba umět pro nový blok paměti najít volné místo v adresním prostoru. Zamykání stránek od toho nepomůže.
    25.10.2010 07:03 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Operácie nad jednosmerne zreťazeným zoznamom nemajú konštantnú zložitosť, pretože ak chceš nájsť N-tý prvok, potrebuješ aspoň N posunutí. Čo ti bráni posúvať sa po tom zozname ďalej, aj keď si už našiel N-tý prvok? Nerob program optimálny. Rob program, ktorý vyhovuje zadaniu. ;-)
    Saljack avatar 25.10.2010 08:02 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    To s tou konstantní složitostí je právě součástí zadaní. Přesněji:

    Implementujte třídy SHandle, SItem a SList, reprezentující prvky jednosměrně zřetězeného seznamu. SList - samotný spojový seznam, SHandle - ukazatel na SItem, SItem - prvek seznamu Implementujte operace pro SList head(), first(), last(), isEmpty(), popFront(), pushFront(SItem), pushBack(SItem), insertAfter(SHandle *, SItem), concat(SList *), makeEmpty,moveAfter(SHandle *,SHandle *), moveToFront(SHandle *), moveToBack(SHandle *), remove(SHandle *) s konstantní složitostí a findNext(SItem *, SHandle *) se složitostí O(n).

    Sex, Drugs & Rock´n Roll.
    25.10.2010 09:40 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ešte raz: zadanie hovorí, že zložitosť má byť konštatná. Nehovorí, že algoritmus má byť rýchly (optimálny). Porovnaj nasledovné:

    
    found=false;
    
    for (c=str;*c; c++) if (*c=='a') { found=true; } for (c=str;*c;c++) if (*c=='a') { found=true; break; }
    printf("found %d\n",found);
    Saljack avatar 25.10.2010 10:16 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ale tohle je lineární složitost O(n).
    Sex, Drugs & Rock´n Roll.
    25.10.2010 10:19 qk_
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Tak samozrejme ze to jde. jde jen o vhodnou strukturu :) A kdyz mas to jako ukol tak by sis to mel sam vymyslet.

    Ale tak par rad. mit v spojaku data je blby kvuli jejich kopirovani, takze je lepsi tam mit spojak co ma kazdy prvek dva ukazatela data a next. Celej spojak by mel tyto dalsi udaje: prvni prvek specialni posledni prvek, kterej je koncovej

    a ted metody kde nevis: insertAfter(SHandle *, SItem), to mi prijde jednoduche vlozeni do seznamu, kde je problem?

    makeEmpty pokud pouzivas komulovanou slozitost tak neni problem. Obecne pokud chces uvolnovat data, tak se to problem.

    moveAfter(SHandle *,SHandle *) operave remove + insert after obe konstantni (dle zadani)

    moveToFront(SHandle *) to samy co vys - slozeni dvou konstantnich ( dat neco dopredu je v pohode)

    moveToBack(SHandle *) remove + vyuzijes specialni psoledni prvek tak jak je definovan

    remove(SHandle *) jak uz nekdo psal vyse, zkopirujes dva ukazatele nasledovnika do prvku, tim zustane predkovi validni ukazatel pokud odstranujes posledni prvek (posledni nespecialni). Tak na zacatku to snadno zdetekujes pres porovnani a udelas specialni prvek z toho odstranovanyho a odalokujes ten specialni ( tedy
    if next == end
      free (end);
      end = this;
    end;
    
    to ti zaruci, ze spojak stale ukazuje spravne.
    Saljack avatar 25.10.2010 10:28 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Tohle právě nejde, protože já potřebuj vědět pokaždé, který prvek je poslední a to pokud odeberu poslední prvek prostě nevím. Musím celý seznam znovu projít až na konec a tím už to není konstantní. Proto nejde odebírat (přesouvat) ty prvky konstantně. A jestli jsem to správně pochopil, tak to co jsi popsal s tím speciálním posledním prvkem vůbec nic neřeší a je to stejně lineární.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 10:31 qk_
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    neni, vzdy vys, ze posledni prvek je ten specialni.

    Tedy kdyz odeberes posledni normalni, tak specialni ma novou adresu stejnou mel ten posledni normalni ( trik je v tom, ze zachovavas adresu prechudce ).

    Ukaz mi operaci, kdy potrebujes znovu projit seznam a ja ti reknu, jak to udelat bez toho.
    Saljack avatar 25.10.2010 10:38 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Vrátit poslední prvek, po odebrání posledního "normálního".
    Sex, Drugs & Rock´n Roll.
    25.10.2010 10:52 qk_
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Jestli chapu co chces (tedy vratit jen data po remove, protoze PopLast tam nevidim), tak tenhle kod to dela
    def remove (link)
      if link.next == List.last
        data = link.data
        List.last = link
      else
        #normalni remove
      end
      return data
    end
    
    25.10.2010 10:56 qk_
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Ha, tak uz asi vidim tu problematickou metodu...je fakt, ze metoda last nevrati to co clovek ceka, ale bez ni by to fungovalo :)
    Saljack avatar 25.10.2010 11:02 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    To jo ale ta last by zase nebyla konstantní to je prostě začarovaný kruh :-D
    Sex, Drugs & Rock´n Roll.
    25.10.2010 13:01 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    To přece není až tak složité. Trik je v rozdílu mezi SHandle a SItem.

    SHandle je datová struktura pro uživatele transparentní; je to nějaký pointer do seznamu, s nímž uživatel nebude nic provádět, jen ho může podstrčit tomu API. (Tedy obdoba C++ iterátoru.) Takové věci se většinou ve veřejných headerech nechávají jako incomplete type, aby se je nikdo nesnažil nějak „instanciovat“ nebo kopírovat. (Ale to není podstatné.)

    No a když mám přímo pointer na prvek toho seznamu, je implementace insertAfter(SHandle *, SItem) v O(1) triviální.

    Pro jednoduchost (a odstranění zbytečných ifů) je dobré mít v seznamu vždy alespoň jeden prvek, tedy jakousi hlavu, která v případě prázdného seznamu bude ukazovat sama na sebe. Implementaci to výrazně zjednoduší. A co je ještě důležitější — umožní to navíc implementaci insertBefore(SHandle *, SItem) v O(1). Struktura SHandle jednoduše nebude ukazovat přímo na referencovaný prvek seznamu, ale na jeho předchůdce. Implementace insertBefore() i insertAfter() v O(1) je pak snadná.

    Ještě jednou základní pointa:

    • insertAfter(SItem where, SItem newItem) lze u seznamu provést pouze v O(n).
    • insertAfter(SHandle * where, SItem newItem) lze provést v O(1).
    • Pro oba typy insertBefore() platí totéž.
    25.10.2010 13:06 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu

    Zapomněl jsem to explicitně napsat, ale požadované moveAfter(), moveBefore(), moveToBack() či moveToFront() se vyřeší obdobným způsobem. Když potřebuješ znát předchůce, ukazuj prostě pomocí SHandle * na předchůce a ne přímo na referencovaný prvek.

    Saljack avatar 25.10.2010 13:14 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Tohle ale vůbec nic neřeší, protože když budu potřebovat zjistit následníka toho prvku tak jsem opět na lineární složitosti.
    Sex, Drugs & Rock´n Roll.
    Gilhad avatar 25.10.2010 18:23 Gilhad | skóre: 20 | blog: gilhadoviny
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Jak neresi? Mam-li prvek, tak jeho nasledovnik je prvek->next coz je konstantni nactenihodnoty. Nic vic.
    Saljack avatar 25.10.2010 18:31 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Já jsem to špatně asi pochopil. Myslím si, že jsi měl na mysli, že těm funkcím budu dávat toho předchůdce prvku, který budu chtít přesunout (odebrat). Je to tak? V tomhle případě to jde a asi to tak udělám i když se mi to zdá celkem jako blbost.
    Sex, Drugs & Rock´n Roll.
    25.10.2010 14:15 Xerces
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    A co to naprogramovat tak jak potrebujes a tu konstantni casovou slozitost zajistit nejakym wait cyklem. Teda ze by sis urcil nejakou dostatecne velkou casovou konstantu, potom spustil ten tvuj algoritmus a spocital cas behu a po zbytek bys sleepoval :-)
    David Watzke avatar 25.10.2010 17:01 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Konstantní složitost u jednosměrného spojového seznamu
    Stačilo říct: použij the Microsoft way.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.