tl; dr Jak można skutecznie wdrożyć coś takiego jak Mathematica?Struktura danych dla efektywnego pobierania najbliższego elementu z zestawu
Mathematica posiada funkcję o nazwie Nearest
który odbędzie listę „rzeczy” (mogą być liczbami, koordynuje w n
-wymiarowej przestrzeni, sznurki, etc.), a zwróci NearestFunction
obiekt. Ten obiekt jest funkcją, która po zastosowaniu do x
zwróci element listy, który jest najbliższy x
według niektórych metry odległości. Metryka odległości może być przekazana jako parametr do Nearest
: domyślnie używa odległości euklidesowej dla danych liczbowych i pewnego rodzaju odległości edycyjnej dla łańcuchów.
Przykład (to mamy nadzieję, aby kwestia bardziej jasne)
nf = Nearest[{92, 64, 26, 89, 39, 19, 66, 58, 65, 39}];
nf[50]
powróci 58
, element najbliżej 50
. nf[50, 2]
zwróci {58, 39}
, dwa najbliższe elementy.
Pytanie: Co jest skutecznym sposobem realizacji tej funkcji? Jaki rodzaj struktury danych może być używany wewnętrznie? Jaka jest najlepsza z możliwych złożoność obliczania najbliższego elementu dla różnych typów danych?
Dla zwykłej listy numerów sortowanie ich i wykonywanie wyszukiwania binarnego będzie działało, ale Nearest
działa z wielowymiarowymi danymi, jak również z dowolną funkcją odległości, więc przypuszczam, że używa czegoś bardziej ogólnego. Ale nie byłbym zaskoczony, gdyby okazało się, że specjalizuje się w niektórych rodzajach funkcji danych/odległości.
Czy widziałeś: http://www.google.co.uk/search?q=adjacency+data+struktura – Marcin
@Marcin Nie znałem tego terminu. – Szabolcs