» »

Reševanje programskih algoritmov. Kakšen pristop?

Reševanje programskih algoritmov. Kakšen pristop?

TomažHrast ::

Lep aprilski pozdrav,

Sem eden izmed mnogih programerjev samoukov in imam problem katerega upam da mi boste (vsaj delno) pomagali rešiti. Ker sem to pot začel popolnoma iz "nule" mogoče nisem bil deležen nekakšnih "posebnih" taktik pri učenju programiranja. Če realno pogledam na moje znanje in bi pisal nekakšen test, bi ga mogoče rešil za solidno 2. (od 5), kar je po mojih standardih veliko premalo. Probleme mi namreč dela reševanje algoritmov in se zelo bojim da tega sam ne bom uspel osvojiti. Rad bi namreč postal samostojen in neodvisen od Googla oz. drugih ljudi. Zato me zanima kakšen pristop imate vi do tega? Ali so recimo na računalniških faksih učili kako se pristopa k temu? Sicer nekaj sem že bral po internetu in ljudje pravijo da si je treba vzet svinčnik in prazen papir in gor napisati ideje in postopek kako bi to rešil, ampak kako naprej če se ti sploh ne sanja kje začeti?

Na primer, trenutno delam na preprosti igri napisani v javi. Vsebovala bo glavni lik, ki bo skakal na platforme proti oblakom (navzgor). Zataknilo se mi je pri generiranju platform, ki niso v vidnem polju (viewport). V mislih imam to da bi jih z vsakim "frame-om" naključno zgeneriralo ko bi se glavni lik pomikal po platformah navzgor. Sem pa ubistvu že uspešno zgeneriral x število platform na vidnem polju. Ta problem se mi zdi kompleksen (čeprav vem da ni) in ne vem kako se zadeve lotiti in najbrž mi do povprečnega programerja manjka ravno to (in seveda VELIKO vaje).

Ne me razumet narobe. Nočem odkrivati tople vode. Vem da se takih algoritmov dobi na internetu res en kup in bi lahko zadevo rešil v 3minutah ampak jaz hočem samostojno pristopiti k problemu, ker se zna zgoditi za vnaprej da določenega algoritma na internetu ne bo mogoče najti - takrat bom ostal brez idej kako naprej. Tudi zgornji problem ni mišljen kot samo en problem ki ga ne razumem, ampak kot primer kako rešiti nekaj kar nisi še nikoli rešil.

Torej, kaj mi manjka da bom čisto sam začel lahko samostojno in uspešno programersko pot? Ali je bolje da vržem puško v koruzo in grem pometat ceste in se odpovem stvari ki me zelo veseli?

Najlepša hvala vsem.

Utk ::

Verjetno te bo treba razočarat. Magičnega pravila za vse probleme enostavno ni.
Ali pogooglaš kako so drugi rešili podoben problem in to sam sprogramiraš ali pa narediš sam kakor veš in znaš od začetka. Ponavadi se pa naredi nekaj navmes.
Neodvisen od googla ni pametno bit. Za vsako novo stvar se verjetno tudi sam spomneš kakšno rešitev, skoraj sigurno pa ne optimalne. Vsaj malo prebrat si kako so naredili drugi sigurno ni neumno in ne pomeni, da nimaš pojma.

Rias Gremory ::

Ali je bolje da vržem puško v koruzo in grem pometat ceste in se odpovem stvari ki me zelo veseli?

Nikakor.

Vem da se takih algoritmov dobi na internetu res en kup in bi lahko zadevo rešil v 3minutah ampak jaz hočem samostojno pristopiti k problemu

Jaz se točno tak kot ti, bi raje še enkrat izumil kolo kot, da bi pogledal kako so se drugi lotili problema in ga rešili.
Lahko probaš tako kot si omenil (z listom papirja), da vidiš do kam prideš in potem vprašaš za nasvet tam kjer se ti zatakne. Lahko tudi pogooglaš kako se drugi lotijo programskih problemov. Vglavnem trial& error.
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

TomažHrast ::

Hvala obema za odgovor.

Verjetno te bo treba razočarat. Magičnega pravila za vse probleme enostavno ni.


Hehe, ja v to sem popolnoma prepričan. Ampak še vedno mogoče obstaja kakšen pristop, kakšno "posebno" razmišljanje, kaj je treba pazit in kako veš da razmišjaš v napačni smeri (oz. pravi) pri reševanju določenega algoritma...

Velikokrat se mi je že zgodilo da sam problema enostavno nisem znal rešiti. Dejansko so bile moje misli zaprte v en labirint iz katerega ni bilo izhoda. Moti me to ker imam mogoče napačen pristop razmišljanja. Mogoče vztrajam pri eni rešitvi preveč časa (čeprav se zdi povsem logična - lahko se na koncu izkaže da ni).


Zame programer ni pravi programer če programskih problemov (vsaj povprečno težkih) ne zna rešiti samostojno. Moj zgornji problem se pa po mojem mnenju uvršča med kategorijo "lahkih oz podpovprečno težkih" problemov.

Rias Gremory je izjavil:

Ali je bolje da vržem puško v koruzo in grem pometat ceste in se odpovem stvari ki me zelo veseli?

Nikakor.


Hvala za spodbudo :)

Utk ::

No, in kje je tam problem? Vsakič ko možicelj skoči na drugo platformo okoli njega dodaš še dodatne platforme do neke razdalje. Viewport je pomemben samo toliko da veš kako daleč jih moraš postavit, da ni videt, da se sproti postavljajo. Sej si to že naredu, v viewportu ali izven ni sploh pomembno.

Ne razmišljaj v kodi, razmišljaj kaj bi naredu, če bi imel to na mizi, na papirju ali kjerkoli. Kaj če se bi tvoja igrica igrala na papirju, in bi premikal možiclja gor, kdaj pa kako bi narisal nove platforme, koliko naokoli, itd. Verjetno ne v vsakem frejmu.

Mavrik ::

TomažHrast je izjavil:

Lep aprilski pozdrav,

Sem eden izmed mnogih programerjev samoukov in imam problem katerega upam da mi boste (vsaj delno) pomagali rešiti. Ker sem to pot začel popolnoma iz "nule" mogoče nisem bil deležen nekakšnih "posebnih" taktik pri učenju programiranja. Če realno pogledam na moje znanje in bi pisal nekakšen test, bi ga mogoče rešil za solidno 2. (od 5), kar je po mojih standardih veliko premalo. Probleme mi namreč dela reševanje algoritmov in se zelo bojim da tega sam ne bom uspel osvojiti. Rad bi namreč postal samostojen in neodvisen od Googla oz. drugih ljudi. Zato me zanima kakšen pristop imate vi do tega? Ali so recimo na računalniških faksih učili kako se pristopa k temu? Sicer nekaj sem že bral po internetu in ljudje pravijo da si je treba vzet svinčnik in prazen papir in gor napisati ideje in postopek kako bi to rešil, ampak kako naprej če se ti sploh ne sanja kje začeti?


Okej, dajmo se takole zmeniti: NIHČE normalen ne pričakuje od nobenega programerja (niti Carmacka ;) ), da bo znal brez uporabe dokumentacije, interneta in brainstorminga drugih vse narediti. V realnem svetu nihče ne programira tako kot na izpitih na pamet in brez knjig :)

Je pa fora v tem, da se izkušnje za delo s takimi stvari nabirajo tako, da BEREŠ veliko kode, in gledaš kako so drugi pristopali k problemom. Z dovolj vaje potem začneš sam delati svoje rešitve, ko rešitve drugih več ne ustrezajo tvojemu use-casu. To je bistvu tisto kar te naučijo na računalniškem faksu: kup primerov algoritmov in načinov (ter ozadja) kako rešuješ probleme. Izkaže se da je par pristopov zelo uporabnih za veliko primerov.

Tako da ja, definitivno vzameš svičnik in papir pa probaš zrisati sam. Še boljše, vzameš svičnik in papir, odpreš na GitHubu podobno aplikacijo (v tvojem primeru platformer) in NA PAPIR napišeš flow, oz. način kako TISTA igra prisopa k problemu.

TomažHrast je izjavil:


Ne me razumet narobe. Nočem odkrivati tople vode. Vem da se takih algoritmov dobi na internetu res en kup in bi lahko zadevo rešil v 3minutah ampak jaz hočem samostojno pristopiti k problemu, ker se zna zgoditi za vnaprej da določenega algoritma na internetu ne bo mogoče najti - takrat bom ostal brez idej kako naprej. Tudi zgornji problem ni mišljen kot samo en problem ki ga ne razumem, ampak kot primer kako rešiti nekaj kar nisi še nikoli rešil.


Če ne boš že od prej poznal algoritmov in načinov pristopanja k reševanju problemov boš bistveno težje sam prihajal do rešitev. S tem, da poiščeš standardizirane algoritme ni nič narobe. NAROBE pa je to, da ko jih najdeš, jih samo copy-pastaš, namesto da bi jih prebral in RAZUMEL zakaj delujejo in KAKO delujejo. Ta del je tisti, ki te pripravi za pisanje svojih.
The truth is rarely pure and never simple.

Zgodovina sprememb…

  • spremenil: Mavrik ()

mn ::

Pa še nekaj. Vedno poskušaj najprej problem razbiti na čim manjše smiselne celote in rešuj vsako posebej. Na ta način postanejo problemi veliko bolj obvladljivi. Ni nujno, da boš na ta način prišel do najboljše rešitve, ampak še vedno lahko popraviš kasneje če je potreba.

Recimo v tvojem primeru je en problem generiranje pozicij platform ne glede na to ali so v vidnem polju ali ne, drug problem je pa potem katere izrisati tretji pa kako izrisati.

In pa poznavanje že narejenih algoritmov za pogoste probleme je NUJNO!

WarpedGone ::

Hmnja, problem OP je že zelo "sestavljen" problem kjer recepta kako stvar speljat ni oz. so le "primeri izvedbe".
"Pravilno" je vse kar na koncu dela vsaj približno tako kot si si zamislil. Optimalna reč je pa tista, ki je ne boš nikoli zgruntal .)

Glede samega začetka in potrebnega znanja pri programiranju... obstaja nabor "klasičnih poglavij" ki so korak naprej od osnovnih "programerskih izrekov" (prirejanje, zankanje, pogoj, ...) in sicer:
- "klasične" podatkovne strukture: eno/več dimenzionalna tabela, sklad, seznam, dvosmerni seznam, drevo (binarno, kopica, RB, B, ...)
- kazalci :)
- iterativno in rekurzivno izvajanje procedur
- 'časovna' in 'prostorska' kompleksnost ter sposobnost ocenjevanja kompleksnosti
- jadajada okol objektov, dedovanja, abstraktnih metod/funkcij/procedur, ...
- ..

Še bol "napredna stopnja" so pa potem "strategije preiskovanja", kamor bi dal razne načine urejanja podatkov, pricnipe umetne inteligence, genetske algoritme itd. I.e. advanced stuff ki je razen sortiranja uporaben manjšem deležu programja.

Te zadeve ti faks porine po grlu navzdol, terjajo nekaj švica ampak ko daš to čez dobiš mal občutka za stanje stvari. Posledično so te reči pri samoukih "tipično" šibkeje poznane. So izjeme seveda ampak povprečje poznavanja je nižje od "uradno izbraženih".
Zbogom in hvala za vse ribe

driver_x ::

Pri programiranju je zelo dobrodošlo poznavanje nekih osnovnih postopkov, metod in matematičnih pojmov (npr. končni avtomati, gramatike, boolova algebra, grafi, ...). Te lahko precej dobro uporabiš za reševanje problemov, niso pa nujno potrebne, saj se lahko znajdeš tudi po svoje.
Druga stvar pa je poznavanje programskega jezika in ogrodja, v katerem delaš. To dvoje osvojiš deloma preko literature in deloma z izkušnjami.
Ko pa pristopiš k reševanju konkretnega problema se pa soočiš z jezikom problema in jezikom rešitve, ki ju moraš čim bolj pribljižati.

alexa-lol ::

Mavrik je izjavil:

TomažHrast je izjavil:

Lep aprilski pozdrav,

Sem eden izmed mnogih programerjev samoukov in imam problem katerega upam da mi boste (vsaj delno) pomagali rešiti. Ker sem to pot začel popolnoma iz "nule" mogoče nisem bil deležen nekakšnih "posebnih" taktik pri učenju programiranja. Če realno pogledam na moje znanje in bi pisal nekakšen test, bi ga mogoče rešil za solidno 2. (od 5), kar je po mojih standardih veliko premalo. Probleme mi namreč dela reševanje algoritmov in se zelo bojim da tega sam ne bom uspel osvojiti. Rad bi namreč postal samostojen in neodvisen od Googla oz. drugih ljudi. Zato me zanima kakšen pristop imate vi do tega? Ali so recimo na računalniških faksih učili kako se pristopa k temu? Sicer nekaj sem že bral po internetu in ljudje pravijo da si je treba vzet svinčnik in prazen papir in gor napisati ideje in postopek kako bi to rešil, ampak kako naprej če se ti sploh ne sanja kje začeti?


Okej, dajmo se takole zmeniti: NIHČE normalen ne pričakuje od nobenega programerja (niti Carmacka ;) ), da bo znal brez uporabe dokumentacije, interneta in brainstorminga drugih vse narediti. V realnem svetu nihče ne programira tako kot na izpitih na pamet in brez knjig :)

Je pa fora v tem, da se izkušnje za delo s takimi stvari nabirajo tako, da BEREŠ veliko kode, in gledaš kako so drugi pristopali k problemom. Z dovolj vaje potem začneš sam delati svoje rešitve, ko rešitve drugih več ne ustrezajo tvojemu use-casu. To je bistvu tisto kar te naučijo na računalniškem faksu: kup primerov algoritmov in načinov (ter ozadja) kako rešuješ probleme. Izkaže se da je par pristopov zelo uporabnih za veliko primerov.

Tako da ja, definitivno vzameš svičnik in papir pa probaš zrisati sam. Še boljše, vzameš svičnik in papir, odpreš na GitHubu podobno aplikacijo (v tvojem primeru platformer) in NA PAPIR napišeš flow, oz. način kako TISTA igra prisopa k problemu.

TomažHrast je izjavil:


Ne me razumet narobe. Nočem odkrivati tople vode. Vem da se takih algoritmov dobi na internetu res en kup in bi lahko zadevo rešil v 3minutah ampak jaz hočem samostojno pristopiti k problemu, ker se zna zgoditi za vnaprej da določenega algoritma na internetu ne bo mogoče najti - takrat bom ostal brez idej kako naprej. Tudi zgornji problem ni mišljen kot samo en problem ki ga ne razumem, ampak kot primer kako rešiti nekaj kar nisi še nikoli rešil.


Če ne boš že od prej poznal algoritmov in načinov pristopanja k reševanju problemov boš bistveno težje sam prihajal do rešitev. S tem, da poiščeš standardizirane algoritme ni nič narobe. NAROBE pa je to, da ko jih najdeš, jih samo copy-pastaš, namesto da bi jih prebral in RAZUMEL zakaj delujejo in KAKO delujejo. Ta del je tisti, ki te pripravi za pisanje svojih.


A lahko poveš malo več o tem kateri pristopi se tebi zdijo najbolj uporabni.

hvala lp

Yacked2 ::

Rešuj naloge iz tekmovanj: http://rtk.ijs.si/ ter nato poglej kako so rešiti v rešitvah.
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Kaj je to programerska logika? (strani: 1 2 )

Oddelek: Programiranje
529465 (6470) windigo
»

Problem P = NP ostaja nerešen (strani: 1 2 )

Oddelek: Novice / Znanost in tehnologija
6516938 (12446) reeves
»

Tekmovanje iz programiranja

Oddelek: Šola
284660 (3902) Yacked2
»

Kaj sploh je programiranje? (strani: 1 2 )

Oddelek: Programiranje
5410358 (8359) imagodei
»

A se je možno samostojno naučit programiranja? (strani: 1 2 3 )

Oddelek: Programiranje
14933391 (29485) darkkk

Več podobnih tem