Temat: Codility Helium 2013
Michał P.:
trudność nie leży w języku, bo w każdym się da podobnie zaimplementować, czy będzie dynamicznie typowany jak python czy statycznie jak c, tylko w algorytmie. to jaki kto wybrał język nie ma znaczenia.
No niezupełnie. Codility może wywalić błąd przy testowaniu wartości ekstremalnych np. przy sumowaniu elementów z tablic, ponieważ akurat przez małe niedopatrzenie lub niewiedzę zmienna suma została zadeklarowana np. jako longint a funkcja sumuje elementy z tablicy longintów. Wtedy jest jasne że suma musi być long long, co nie jest żadnym problemem w pythonie.
może faktycznie codility by nie chciało, żeby rozwiązanie wyciekło, niemniej jednak ciekawi mnie jak można dojść przy czymś takim do liniowej złożoności.
Zastosowanie pętli w pętli zamiast tylko jednej powoduje wzrost złożoności obliczeniowej czyli nie jest O(n) ale O(n*2). Całość sprowadza się do zastosowania jednej pętli, bez innych pętli lub funkcji wykorzystujących pętle w niej samej.
Weźmy taki mały przykład (JAVA):
public int[] solution(int[] A)
{
long sum = 0;
int[] B = new int[A.length];
int len = A.length;
//sumowanie elementów tablicy
for (int i = 0; i < len; i++)
{
sum += A[i];
}
//przypisanie różnicy sumy i kolejnego elementu z tablicy
for (int j = 0; j < len; j++)
{
B[j] = sum - A[j];
}
return B;
}
Nieco oderwany od rzeczywistości przykład (a może i nie), funkcji która zwraca tablicę jakichś tam wartości ale proszę zauważyć, że użyłem dwóch pętli, pierwsza sumuje wszystkie elementy z tablicy intów (tablica A), zakładam jednak że ilość elementów jest ograniczona np. do 1000, druga przypisuje do tablicy B różnicę sumy i elementu w każdym indeksie. I teraz jaka będzie złożoność obliczeniowa w przypadku:
1. użycia pierwszej pętelki sumującej w drugiej pętli przypisującej wartości do tablicy B
2. użycia wcześniej już zdefiniowanej fukcji sumującej elementy z tablicy w pętli
Nonsens. W obu przypadkach każdorazowe sumowanie elementów z tablicy w pętli jest bezsensowne, kiedy to można zrobić tylko raz. Powyższy przykład miał na celu zobrazowanie problemu związanego z tym że na złożoności obliczeniowej można się wyłożyć w przypadku pominięcia albo nie zauważenia pętli w pętlach, zresztą niektórzy nawet na blogach "chwalili" się tym że na początku nie wyszło, czego ja bym nie robił, rozumiem że ma to pokazać jakie to Codility jest świetne (i w sumie się zgadzam). Problem jest taki, że zawsze można postawić zdolniejszemu koledzę flaszkę wódki w zamian za rozwiązanie zadanka albo ściągnąć to ze Stack Overflow, kiedy to zadanie rozwiązuje się zdalnie, wtedy to wiarygodność całego badania szlak trafia.
Nie chcę się tu bawić w rozwiązywanie tej funkcji przedstawionej z Codility w ramach certyfikacji i przedstawiania tego publicznie żeby nie mieć zarzutów działania na szkodę (no chyba że Codility wyraziłoby na to zgodę).
Ten post został edytowany przez Autora dnia 21.07.13 o godzinie 07:35