Home notes to future self Podejścia do rozwiązywania problemów

Podejścia do rozwiązywania problemów

by Tomasz Jarosik

Załóżmy, że mamy problem P, i chcemy znaleźć dla niego rozwiązanie Sp. Kilka przydatnych podejść do tego:

  1. Redukcja -> czy da się zredukować problem do kilku problemów o mniejszym rozmiarze i z ich rozwiązań skonstruować rozwiązanie Sp?
    Podróżowanie: podróż rozkłada się na kupno biletu na samolot, rezerwacji hotelu, rezerwacji transportu, atrakcji itd.
  2. divide-and-conquer -> specjalny przypadek redukcji, gdzie redukujemy problem to mniejszego problemy tego samego typu
    Przykład: mergesort -> gdy mamy do posortowania n liczb. Posortujmy pierwsza połowę i drugą połowę, i całość scalmy w jedno rozwiązanie Sp
  3. zadaj pytanie do “Google” -> które rezultaty zbliżają Cię do znalezienia rozwiązania?
  4. zadaj sobie pytanie, jakie założenia przyjmuję? np. założenie, że kompilator działa poprawnie, zewnętrze biblioteki działają zgodnie z dokumentacją. Założenie, że problem P jest łatwy/trudny.
  5. sprawdź założenia: powtórz tę samą akcję wielokrotnie. Powtórz tę samą akcję kilka razy: robienie tej samej akcji przynosi te same wyniki tylko w idealnym środowisku bez efektów ubocznych. Prawdziwe środowiska często mają “skutki uboczne”
  6. wypisz listę rzeczy, które ewentualnie mogły by pomóc w rozwiązaniu problemu i po sprawdzeniu każdej z nich zapisz jaki osiągnąłeś rezultat lub gdzie powstał inny problem
  7. napisz do osoby, która zna się na danym temacie prosząc o wskazówki
  8. zadaj sobie pytanie: “jak osoba X podeszła by do rozwiązania tego problemu?“, np. jak Elon Musk rozwiązałby ten problem? jak lekarz próbował by go rozwiązać? jak korporacja rozwiązała by ten problem a jak zrobiłby to startup?
  9. Spamiętywanie rozwiązać (memoizacja). Może się okazać, że do rozwiązania problemu P, potrzebujesz rozwiązać wiele takich samych pod-problemów Przykłady: liczby Fibonaciego liczone rekurencją, np. gdy wiele osób zadaje Ci podobne pytania, możesz napisać dokumentację i wysyłać linki
  10. przedstaw problem jako graf -> czy na takim grafie możesz użyć jednego ze znanych algorytmów grafowych?
  11. zapisz jak wyglądałoby idealne rozwiązanie. Najłatwiej to zrobić wyobrażając sobie, że przenosisz się do jakiegoś momentu w przyszłości i w tym momencie w przyszłości rozglądasz się i opisujesz to co widzisz. Wyobrażaj to sobie skupiając się na czynnikach: długości, intensywności, szczegółowości
  12. zrób konkurs na którym wystawisz nagrodę za rozwiązanie problemu. Nagroda powinna zachęcać małe zespoły a zniechęcać korporacje.

Waldemar Jarosik dodaje:
13. Odseparuj problem od zależności (odmiana dzielenia na mniejsze).
14. Oddeleguj komuś innemu
Władek Kwaśnicki dodaje:
15. Naucz się przegrywać – tzn. Nie porzucaj problemu, ale zrób głęboki krok wstecz i pomyśl o zupełnie innym rozwiązaniu / resecie myślowym. Nie bój się też odkładać problem na półkę i wracać do niego raz na jakiś czas.
16. Ufaj swojej intuicji i nie bój się eksperymentować.
17. Bądź najbardziej krytycznym weryfikatorem swoich rozwiązań. Z każdego nieudanego eksperymentu nauczysz się więcej niż przypuszczasz
 
Będę dodawał do tej listy kolejne sposoby, które ułatwiają rozwiązywanie problemów 🙂
 

You may also like

Leave a Comment

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More