Załóżmy, że mamy problem P, i chcemy znaleźć dla niego rozwiązanie Sp. Kilka przydatnych podejść do tego:
- 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. - 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 - zadaj pytanie do “Google” -> które rezultaty zbliżają Cię do znalezienia rozwiązania?
- 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.
- 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”
- 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
- napisz do osoby, która zna się na danym temacie prosząc o wskazówki
- 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?
- 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
- przedstaw problem jako graf -> czy na takim grafie możesz użyć jednego ze znanych algorytmów grafowych?
- 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
- 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 🙂