Niech więc dla bardzo krótkiej próbki, takiej jak , można ją obliczyć od znalezienia statycznego tego rzędu różnicy par: { 1 , 3 , 6 , 2 , 7 , 5 } k
7 6 5 3 2 1
1 6 5 4 2 1
2 5 4 3 1
3 4 3 2
5 2 1
6 1
7
h = [n / 2] + 1 = 4
k = h (h-1) / 2 = 8
Zatem
Oczywiście w przypadku dużych próbek, które mówią, że zawierają 80 000 rekordów, potrzebujemy bardzo dużej pamięci.
Czy w ogóle można obliczyć w przestrzeni 1D zamiast 2D?
Link do odpowiedzi ftp://ftp.win.ua.ac.be/pub/preprints/92/Timeff92.pdf, chociaż nie rozumiem tego w pełni.
Odpowiedzi:
Aktualizacja: sedno problemu polega na tym, że aby osiągnąć złożoność czasowąO ( n log( n ) ) , potrzeba kolejności przechowywania O ( n ) .
Nie,O ( n log( n ) ) jest dolną teoretyczną granicą złożoności czasowej (patrz (1)) wyboru elementu kt godz spośród wszystkich n ( n - 1 )2) możliwe| xja- xjot| :1≤i<j≤n .
Można dostaćO ( 1 ) miejsca, ale tylko przez naiwnie sprawdzając wszystkie kombinacje xja- xjot w czasie O ( n2)) .
Dobrą wiadomością jest to, że można użyć estymatora skaliτ (patrz (2) i (3) dla ulepszonej wersji i niektórych porównań czasowych), zaimplementowanego w funkcji
τ jest dwuetapowym (tj. Ponownie ważonym) estymatorem skali. Ma 95 procent wydajności Gaussa, 50 procent punktu przebicia oraz złożoność czasu O ( n ) i przestrzeni O ( 1 ) (a ponadto można go łatwo ustawić w trybie online, zmniejszając o połowę koszty obliczeniowe przy wielokrotnym użyciu - chociaż ty będzie musiał zagłębić się w
scaleTau2()
wR
pakiecierobustbase
. Jednoznaczny estymatorR
kod, aby wdrożyć tę opcję, jest to raczej proste do zrobienia).Edytuj Aby użyć tego
R
(jest bezpłatny i można go pobrać tutaj )źródło
(Bardzo krótka odpowiedź) Tekst do komentowania mówi
EDYTOWAĆ
źródło
to moja implementacja Qn ...
Programowałem to w C, a wynik jest następujący:
źródło