Wpis z mikrobloga

Tak w ramach samobiczowania porobiłem troche tasków na codility, ale ciekawą rzecz zauważyłem. Większość (w zasadzie, to wszystkie, które znalazem na necie) rozwiazań Dominatora to miliardy pętli, szukanie kandydata na dominatora...

Zapraszam na challenge - napisz kod dominatora bez jawnego używania pętli. Możesz posługiwać się natywnymi funkcjami języka... o ile je ma XDDDDD.

Moje rozwiązanie jest od 30 do 1000% szybsze niż liczone na piechotę w pętlach, a nadal widzę potencjalne optymalizacje. Natywne funkcje PHP są po prostu szybsze niż algorytm, który możecie w php napisać.

https://app.codility.com/demo/results/trainingRYQRCW-SCZ/

#programowanie #php #codility
  • 15
@Krolik: To prawda i właśnie licząc na to, tych funkcji użyłem. PHP ma zaimplementowane hashmapy pod spodem tablic, a jednocześnie posiada bogata bibliotekę funkcji do operowania na nich. To co chciałem przekazać, to to, że pisanie algorytmów dla sportu może się znaczaco różnić od realnych rozwiązań, które mogą wyglądać bardziej zrozumiale. Uważam, że mój kod jest lepszy pod każdym względem od dowolnego innego realizującego to same zadanie. ( ͡° ͜
@Kuzguwu: Wziąłem na tapet dla porówania 2 inne rozwiązania 100/100 w php i wrzuciłem jako test casy do phpunita i po prostu szybciej mi było zamknąć jedno rozwiązanie per test case wraz z benchmarkiem w funkcji niż przenosić do osobnych metod. Także to detal dla mojej wygody.

@Szczepano: O, jak ładnie wygląda nawet :)
Jedynie wydajnościowo słabiej ( ͡° ͜ʖ ͡°)
@Krolik: Tak, zużywa więcej pamięci i co więcej, wydajność będzie spadała (a zużycie pamięci rosło) wraz z ilością unikalnych elementów, bo tworzona jest nowa tablica z countem elementów indeksowana wartościami oryginalnej tablicy. Potem te tablice trzeba przeszukać. Rozwiazania z sortowaniem chyba jednak będą wolniejsze.
@radekr: Z tego co widzę, trzeba 2x iterować nadal, żeby móc sprawdzić, czy element jest dominujący.

Even when the input sequence has no majority, the algorithm will report one of the sequence elements as its result. However, it is possible to perform a second pass over the same input sequence in order to count the number of times the reported element occurs and determine whether it is actually a majority. This
@file_get_contents: Tak, masz rację. Wiadomo, zależy od use case'a, ale generalnie to mała cena za zjechanie z pamięcią o rząd wielkości :) A złożoność obliczeniowa taka sama przy jednej iteracji i przy dwóch, wciąż O(N).
@file_get_contents: Nawet dwukrotne sekwencyjne przejechanie tablicy będzie wielokrotnie szybsze niż budowanie tablicy z częstościami elementów. I tu nie chodzi tylko o samą dodatkową pamięć, tylko również o to, że jak budujesz tablicę z częstościami elementów, to skaczesz po pamięci jak pijany zając. Zresztą i tak potem musisz ją znowu przejrzeć i znaleźć jej max, więc de facto też masz 2 skany.
@Krolik: @Malkof: To zapraszam do spróbowania implementacji (w PHP). Wstawię do benchmarku z randomowymi danymi oraz z presetami, które gwarantują istnienie dominatora. Benchmark na powiedzmy 100-100 000 elementów i milion iteracji. Mam 2 rozwiązania, ale są wyraźnie wolniejsze. Moja zabaweczka nadal prowadzi jeśli chodzi o szybkość, a nie użyłem jawnie żadnej pętli i kod zamknąłem w 10 linijkach.