Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
na požádání od pizet jsem svůj dotaz zobecnil
O( (aN-a1)/2-(a2-a1)+(aN-a2)/2-(a3-a2)...(aN-a(N-2))/2-(a(N-1)-a(N-2))
takovouto mám časovou složitost, ale nevím jak ji mám zapsat jako O( něco ) nevím co mám napsat místo toho něco:(
důvod k editaci:
špatně uzarvorkované indexy u a nebylo z toho poznat co to vlastně je)
Offline
↑ pizet: a ano řeším poprvé
tak já nevím, já se o řešení neradím to jsem tam dal já akorát nevím jak zjistit přesně jaká je časová složitost protože alespoň flr mého je to celkem těžké... a myslel jsem si že to nevadí když se o tomto s někým poradím... navíc to není ani proti pravidlům tohoto fóra, protože nechci poradit s úkolem a to není proti pravidlům KSP protože tam se o tom že se s něčím někdo nemůže radit nepíše.... a o body mi ani tak moc nejde, akorát jsme stále ještě nepochopil časovou složitost...tak se snad o ní poradit mohu
pokud ne tak bych poprosil nějaký orgy aŤ toté téma smažou
Offline
↑ VojtechSejkora: Stačí sa len trochu pošťúrať... http://ksp.mff.cuni.cz/zaciname/faq.html
Tak sa prečo neopýtaš na to čomu nerozumieš vo všeobecnosti a potom sa to nepokúsiš aplikovať sám na svoj problém?
Offline
↑ pizet:
ten odkaz jsme si už přečítal....a ještě něco dalšího od medvěda, ale stejně jsem to ještě nepochopil... no a neptám se obecně, protože nevím jak to mám obecně napsat... já si myslím že ta časová složitost je O(N+M), ale nevím jestli to tak je...ů protože se dá říci že ten zbytek jsou konstanty, ale ok zkusím to tedy zobecnit
Offline
↑ VojtechSejkora:
Vůbec jsem nepochopil zadání...
Máš zadanou nějakou časovou složitost a co s ní máš dělat?
Offline
↑ xxsawer:
mám zadanou úlohu, tu jsem nějak řešil a složitost je taková jakou jsem napsal, a já potřebuji ji převést na nějaké násobky N nebo tak něco.... třeba jestli je to N^2 nebo N log N nebo N nebo log N a nebo něco úplně jiného
díky... pokud toto nepomůže tak mohu poslat ještě program, který dle toho pracuje a nebo slovně ten algoritmus jak funguje, ale doufám že už je storumitelné co jsme myslel
Offline
↑ VojtechSejkora:
Aha, tak zadání už chápu, ale ta tvoje časová složitost je nějaká divoká :)
Dej sem tu funkci a stručnej popis jak funguje a co to dělá...
Offline
↑ xxsawer:
napíšu ti sem cyklus v javě nějak to neumím popsat
for(i=0;i<jednotlivePrvky.length-2/*3.prvek tam ještě má být*/;i++){ int a=jednotlivePrvky[i]; minK=jednotlivePrvky[i+1]-a; maxK=(maxHodnota-a)/2; for(int k=minK;k<=maxK;k++) if(polePrvku[a+k-minHodnota]==1 && polePrvku[a+2*k-minHodnota]==1){ // zde to něco provede } }
jednotlivePrvky jsou veké N a zbytek je snad dosti výstižny ještě že maxHodnota je rovna nevyššímu prvku v pole jednotlivePrvky
Offline
↑ VojtechSejkora:
Složitost není zrovna moje silná stránka, ale snad to co napíšu nebude mimo :)
Máš tam jeden vnější for cyklus, kterej jede přes všechny prvky pole -1. Uvnitř se něco dělá a pak tam je další for cyklus. To by svádělo napsat, že to bude kvadratická složitost, ale to podle mě není. Cílem není zjistit kolikrát přesně ten kterej cyklus pojede, ale jde o to zjistit jakej bude nejhorší případ.
Ten vnitřní for cyklus tě podle mě v tomhle případě vůbec nezajímá protože ten není závislej na počtu prvků na vstupu. Takže budu předpokládat, že pojede přes celej rozsah integeru. Tím pádem celej ten vnitřek má konstantní časovou složitost k. Výsledná složitost by pak byla (N-1)*k, takže celkově to je lineární složitost.
Offline
↑ xxsawer:
ups... jaksi nevím co mám dosadit za to k jeslti nějakou konstantu nebo co?
jinak pro nejhorší(asi protože tam není žádné urychlení) pro 4 prvky je O=2 pro 9 je rovno 16ti a pro 15 rovno 49... takže mi to moc lineární nepříjde...ale ani kvadratická to taky není... pro 1000 prvků by to bylo 249500
takže jaká je složitost? lineární určitě ne
takže to vypadá že je to nějaká kvadratická... nebo ne?
Offline
↑ VojtechSejkora:
Jak sem dopsal ten minulej příspěvek tak sem ještě psal pár takových teoretických poznámek...
Nejdřív sem to chtěl smazat, ale teď to sem dám:
Jinak ještě bych k tomuhle chtěl napsat jednu věc.
K čemu je tohle všechno dobrý a co ti to řiká o tom algoritmu?
Obecně jde prostě o to aby algoritmus spadnul do co nejnižší třídy časový složitosti. Ideálně do konstantní, když to neklapne tak do lineární, nebo do logaritmický atd atd. Čím nižší třída časové složitosti, tím menší bude mít vliv zvyšující se počet na celkovou dobu běhu programu. Takže obecně kvadratická složitost je horší než logaritmická atd. Na první pohled jasná věc. Když se ale vrátím k tomu tvýmu algoritmu a to k bude počet sekund za který se zpracuje ta jedna iterace toho vnějšího for cyklu, tak klidně řeknu, že to bude třeba 1000s - což je dost dlouho. Teď když někdo napíše jinej algoritmus, který bude mít třeba kvadratickou složitost a ten vnitřek se bude zpracovávat jenom 1s, tak z hlediska časový složitosti bude tenhle algoritmus horší.
Řekněme, že třeba pro 10 prvků bude ten tvůj algoritmus počítat 10*1000s a ten druhý 10^2*1s. Jak ale poroste počet prvků, doba běhu toho druhýho algoritmu bude narůstat daleko víc než u toho prvního...
Když si třeba nakreslíš do jednoho grafu, grafy funkcí 100000*N a 0,001*N^2, tak uvidíš, že pro dostatečně velké N bude mít ten druhý vyšší funkční hodnoty.
Co sem tím vším chtěl říct?
1) To že máš svůj algoritmus ve "správný" časový složitosti neříká nic o tom, jestli je optimální
2) Různě když třeba koukneš po netu, tak se dočteš, že tenhle algoritmus má kvadratickou složitost (n^2), jinej má složitost n*log (n) atd atd. To ale neznamená, že se nějaká iterace provede přesně n^2 -krát!!! To pouze znamená, že ta kvadratická složitost je jakoby dominující. Ve skutečnosti se nějakej ten cyklus může provést třeba n^2 + 24n - (3n+k) + atd atd
K tomu tvýmu poslednímu příspěvku...
Nevím jestli to úplně chápeš. Co myslíš, tím, že se pro 4 prvky O=2? Dvě čeho??? Ten tvůj algoritmus bude trvat dvě vteřiny nebo se tam něco provede dvakrát?
Jinak tím k myslím samozřejmě konstantu. V nejhorším případě bude provedení toho vnitřku toho vnějšího for cyklu trvat k vteřin.
Offline
↑ xxsawer:
tím jsme myslel že se to provede 2krát ten vnitřní cyklus... a tento rozdíl vím a vím že se nižší zanedbávají, ale já ani neviděl ten převládající tak jsme si udělal program, který mi spočítal pro dost čísel kolikrát že se to provede a vyšla mi kvadratická.... takže asi tak... a pokud vím tak logaritmická složitost je nejlepší ne? tedy samozřejmě po konstantní, ale tu dosáhneme jen pokud něco počítáme a nic nehledáme:)
ale díky za trpělivost...
jo a jak jsi to myslel s tou 1čkou? že když jsem ve správné složitosti tak stejně nemusí být můj algoritmus optimální?
a udávají se jen ty nejvyšší a nebo mám uvést i nejnižší? což tedy nevím jakou.... na KSP foru mi řekli ať to nějak omezím, ale já vůbec nevěděl jak:(
Offline
↑ VojtechSejkora:
Podle mě ti utíká několik zásadních věcí...
1) Ten graf nahoře, to je co? Nemáš tam popsaný osy, to je to nejdůležitější co tam musí být. Bez toho je to úplně bezcenný... Hádám, že na ose X máš počet prvků a na ose Y počet iterací, ale iterací čeho??? Počet iterací vnitřního for cyklu?
2) Z toho co píšeš v poslednim postu mám pocit, že se snažíš počítat kolik iterací bude mít ten vnitřní for cyklus v každé té iteraci toho vnějšího for cyklu... Proč??? Je ten vnitřní for cyklus závislej na počtu prvků na vstupu? Podle toho algoritmu co si uved, není. Ten vnitřní for cyklus je závislej na nějakých hodnotách minK a maxK, což rozhodně není počet prvků na vstupu, ale jsou to čísla, který si nějak vypočítal z hodnot prvků toho hlavního pole. Ty čísla jsou typu integer - tedy 32b. Já teda předpokládám, že v nejhorším případě pojede ten vnitřní for cyklus vždycky 2^32 krát. Ten vnitřní for cyklus bude tedy trvat v nejhorším případě vždycky konstantní čas.
Jinak řečeno, ten vnitřní for cyklus se nikdy neprovede víckrát než 2^32 krát. Tedy doba provádění toho vnitřního for cyklu nikdy nepřekročí nějaký konstantní čas. To, že postupně narůstá počet iterací vůbec nic neznamená protože ten nárůst se časem zastaví. Tohle je klíčový si uvědomit protože bez toho se nehneš dál.
Přijde mi, že sis udělal graf jak ti postupně narůstá počet iterací toho vnitřního for cyklu. Teď citace z toho tvýho posledního postu:
...který mi spočítal pro dost čísel kolikrát že se to provede a vyšla mi kvadratická
Co to je pro dost čísel??? Podle toho grafu je u tebe "dost" něco kolem 30000. Tímhle způsobem to ale nemůžeš dělat. Dost může být v některých případech třeba miliarda nebo sto miliard atd atd. "Dost" se případ od případu liší... Kdybys pokračoval v navyšování počtu prvků tak bys viděl, že se ten graf nezvedá už kvadraticky, ale lineárně.
Aby bylo jasný jak to myslim tak tady ještě obrázek
Doporučuju si udělat ještě jinej graf...
Vem si nějakej počet prvků a pak pro každý i (což je iterační proměnná toho vnějšího for cyklu) si zjisti kolikrát se proved ten vnitřní for cyklus. Na osu x si dej i a na osu y si dej kolikrát se proved ten vnitřní for cyklus. Zjistíš, že od určitýho okamžiku (ať bude i velký jakkoli) se ti už nebude zvyšovat hodnota na ose y. Rozhodně nikdy nepřeleze hodnotu 2^32.
Offline
↑ xxsawer:
aha takto je to... no ono se mi začalo zdát když už jsem šel od těch 30000 po tisících až do milionu že je to celkem lineární, ale začátek mě zmátl...
tak to díky moc...to jsem spokojený že to je lineární....jinak douřování mi nabýdnul Lukáš Lánský....tak věřím že mi to odkáže vysvětlit...
a ten graf si ještě udělám... ale pokud jsem tě správně pochopil, tak bude občas konstantní mezi 2mi hodnotami a celkově bude nerostoucí....
ale díky za pomoc
Offline