Jest to rodzaj pytania do edycji i jest bardzo łatwe. Jestem po prostu dość martwy w tym temacie i jak dotąd nie mogę tego rozgryźć.
Biorąc pod uwagę szereg liczb, np
[3, 1, 1, 1]
Jak najskuteczniej przekształcić wszystkie liczby w tę samą liczbę przy minimalnej liczbie „ruchów”? Przez „przeniesienie” rozumie się dodanie lub usunięcie jednego z numeru.
W powyższym przykładzie najbardziej wydajnymi ruchami byłyby:
[1, 1, 1, 1]
Wymagałoby to 2 ruchów, dwukrotnie zmniejszając pierwszą liczbę.
Nie mogę znaleźć najlepszego sposobu, aby się tego dowiedzieć, biorąc pod uwagę znacznie większe tablice setek liczb.
Początkowo próbowałem obliczyć zaokrągloną średnią liczbę (sumę wszystkich podzieloną przez długość), a następnie zredukować ją do obliczonej średniej, ale powyższy przykład złamał to, wymagając 4 ruchów zamiast 2.
Myślę, że mógłbym wymyślić:
- Średnia,
- Tryb,
- Mediana
i uzyskaj odległość edycji każdego z nich, wybierając minimalną odległość. Nie jestem jednak pewien, czy byłoby to poprawne w każdym przypadku. Skąd mam wiedzieć?
źródło
Odpowiedzi:
Odpowiedź brzmi: wziąć medianę. Jedną z właściwości mediany jest to, że minimalizuje odległość L1 do każdego elementu. (Aby zrozumieć sens artykułu z Wikipedii, weź rozkład prawdopodobieństwa za równomierny rozkład w stosunku do oryginalnej serii liczb).
To jest algorytm, który rozwiązuje problem (pierwotnie napisany przez dc2 ):
źródło
Jak wspomina TCSGrad, biorąc pod uwagę listę liczb całkowitych , szukasz liczby całkowitej m minimalizującej δ ( m ) = n ∑ i = 1 | m - x i | . Pouczające jest obliczenie δ ( m + 1 ) - δ ( m ) : δ ( m + 1 ) - δ ( m ) =x1, … , Xn m
źródło
Problem można sformułować jako problem LP:
EDYCJA : Jak wskazano w komentarzach, funkcją celu powinna być suma nad różnicami bezwzględnymi. Aby przekształcić go z powrotem w standardowy LP, możemy przepisać LP jako:
z zastrzeżeniem:
źródło