Algorytm – dziki zwierz w ryzach

Algorytm porównywany jest do przepisu kulinarnego. Biorąc pod uwagę, że w USA można algorytmy patentować, co chętnie robią wielkie firmy IT, możemy śmiało mówić, że walczą one z sobą na grubość książki kulinarnej. Ale czy ktoś czyta książki kulinarne tak, by znać je na pamięć?

Algorytm

Algorytm to określony zestaw czynności, ściśle sprecyzowany, który trzeba wykonać żeby coś konkretnego osiągnąć. Mówią: żeby przenieść system z jednego stanu do drugiego. W praktyce chodzi o to, że jak mamy zbiór liczb, to stosujemy algorytm sortowania, żeby je uporządkwować, więc na początku mamy w systemie liczby nieposortowane, a potem posortowane. Algorytmów sortowania jest kilka różnych wymyślonych – jedne są szybsze, inne wolniejsze, wszystkie dają na końcu posortowaną tablicę.

Nie możemy powiedzieć, że przepis kulinarny jest algorytmem, bo nie mamy ściśle zdefiniowanego języka przepisów kilinarnych. Nikt np. nie wie ile waży szczypta bądź jak długo trzeba chłodzić potrawę, gdy przepis mówi: „odstawić do jutra do lodówki”. Zdecydowanie trafniej byłoby powiedzieć, że algorytmem jest sposób rozwiązywania jakiegoś określonego problemu matematycznego, jakiego nauczyliśmy się w szkołach, np. sposób rozwiązywania równań, albo dodawania ułamków zwykłych:

  1. znaleść najmniejszy wspólny mianownik,
  2. dodać do siebie liczniki ułamków
  3. przepisać mianowniki

Warto zauważyć, że szukanie najmniejszego wspólnego mianownika też jest algorytmem 😉

Prawo własności intelektualnej

Z algorytmami wiąże się historia patentów i własności intelektualnej. W USA istnieje możliwosć patentowania algorytmów, co chętnie czynią wielkie koncerny. Problem polega na tym, że sposób, w jaki patentujemy jest nieodpowiedni do specyfiki branży tworzenia oprogramowania. Programista, który zajmuje się pisaniem aplikacji, nie czyta nigdy listy patentów z kilku zwględów. Po pierwsze dlatego, że opisane są językiem prawniczym, więc mało czytelnym na programisty. Po drugie, i chyba przede wszystkim dlatego, po to, żeby przeczytane rozwiązanie nie zostało w głowie, bo wtedy człowiek może nieświadomie użyć go, gdy szuka rozwiązania swojego problemu, programując. Dość dodać, że w 2012 roku Microsoft posiadał zarejestrowanych ok. 10 tys. patentów. Oznacza to, że praktycznie może pozwać każdego, kogo tylko chce, bo przecież nie sposób uniknąć podobnych rozwiązań do tych, które są opatentowane, a procesy są żmudne i kosztowne.

Wielcy i silni, stosują między sobą patenty obronne, udostępniają sobie wzajemnie swoje patenty, podpisują porozumienia o wzajemnych wykorzystaniu swoich rozwiązań itd. W ciekawy sposób wyjaśniono w eseju: Patenty na oprogramowanie, dlaczego sposób patentowania algorytmów nie chroni własności intelektualnej tak, jak powinien, a jedynie napędza machinę wzajemnych pozwów i tworzy taki dodatkowy, sądowy biznes, na boku pracy developerskiej. A może zupełnie nie na boku? Autor eseju pisze o tym, że czym innym jest opatentowanie własności intelektualnej do powieści, a czym innym do stosowania w niej określonych kontrukcji. Nie można zabronić autorowi pisać o bohaterze, który przechodzi przemianę w więzieniu, nie można kazać mu płacić właścicielowi patentu na taką konstrukcję, gdy próbuje wydać swoją powieść. A w programowaniu jakoś można.

Złożoność obliczeniowa

Wracając do samych algorytmów, warto było by powiedzieć, czym jest złożoność obliczeniowa – jeden z głównych wyznaczników jakości algorytmu. Polega ona na obliczeniu ile kroków musi wykonać maszyna (komputer), żeby przejść przez cały algorytm. Ponieważ stosujemy w nim wiele warunków: jeżeli to, to jeszcze raz, jeżeli nie, to zapisz wynik i przejdź do następnego kroku, nie wiemy nigdy dokładnie i ściśle ile czynności trzeba będzie wykonać, żeby skończyć pracę algorytmu – zależy to od tego, jakie dane wejściowe będziemy mieć. Jeśli tablica liczb do posortowania będzie mniejsza, posortujemy ją szybciej. Jeżeli tablica liczb do posortowania będzie już wstępnie posortowana, to też jest szansa, że posortujemy ją szybciej. W zależności od zastosowanego algorytmu, oczywiście, bo są takie, które zawsze zabierają tyle samo czasu, cokolwiek by nie dostały na wstępie.

Obliczanie złożoności obliczeniowej to osobny i długi temat. Nam wystarczy powiedzieć, że możliwe są trzy różne złożoności: pesymistyczna, optymistyczna i oczekiwania (in. średnia). Pesymistyczna to złożoność przy najgorszym możliwym zestawie danych, optymistyczna to przy najlepszym możliwie zestawie danych (ten najlepszy nie zawsze znaczy to samo – nie dla każdego algorytmu), złożoność oczekiwana to taka, która zwykle wychodzi, gdy nasze dane nie są ani szczególnie dobre, ani szczególnie złośliwe.

Czasem, jak wiesza Ci się komputer, może okazać się, że jakiś algorytm dostał właśnie najgorszy możliwy zestaw danych dla siebie i zamiast oczekiwanej złożoności obliczeniowej, uzyskał złożoność pesymistyczną, obciążając procesor tak bardzo, że ten aż nie wydolił.

To the end

Możnaby tę gawędę zamienić w bardziej ścisłe i techniczne wywody, ale od ścisłości i techniki jest Wikipedia. Matka tylko snuje opowieści do porannej kawy, ciesząc się piąteczkiem. Dobrego dnia!

PS. I najważniejsze – algorytmy robią za nas żmudną, powtarzalną i upierdliwą robotę obliczeniową. I dlatego właśnie jest kochamy 😀 Są sercem programowania. Sercem, nerkami i czym tylko!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *