2015-08-05 5 views
1

У меня проблема с ближайшим соседом в двумерной задаче, и я узнал, что kd-деревья - лучшее решение. Я не мог найти готовой реализации для структуры, с которой я работаю, поэтому решил создать свой собственный.Найти медиану координат для построения дерева kd (2D) - C++

Структура Я работаю с это:

struct Point{ 
    int id; 
    double x; 
    double y; 
}; 

У меня есть около 100000 точек, на мой вопрос: Как поступить, чтобы найти к срединной точке каждый раз, когда я хочу разделить мои очки, и как определить левой и правой частей в одно и то же время?

Другой вопрос: был ли более эффективный способ продолжения? (Меньшее время может потребоваться).

+0

Вам нужна медианная точка, как в точке, которая ближе всего к среднему? Потому что в 2D-системе средняя точка координат х и у отличается. –

+0

Я имел в виду точку, которая разделяет всю мою точку на два разных раздела, с равными точками (более или менее). Да, это зависит каждый раз, если мы используем x или y. –

ответ

0

Как вычислить медианную? Есть ли более эффективный способ?

дам один ответ на оба вопроса: Вы можете использовать std::nth_element, например:

std::vector<float> v;         // data vector (global) 
bool myfunction (int i,int j) { return (v[i]<v[j]); } 

int find_median(std::vector<int> &v_i) 
{ 
    size_t n = v_i.size()/2; 
    nth_element(v_i.begin(), v_i.begin()+n, v_i.end(), myfunction); 
    return v_i[n]; 
} 

Вы также можете проверить мой question больше.


как определить левые и правые разделы в то же время?

Каждое значение, меньшее от медианы, будет принадлежать левому разделу, а каждое значение, большее, чем медианное, будет принадлежать правому разделу.

Это зависит от вас, чтобы решить, где будет равное значение медианной. Просто выберите слева или справа и запомните свое решение.

+0

Дело в том, что я не вижу хороших способов использования nth_element с координатами. –

+0

Это зависит от вашей реализации. Вы спросили, к какому пути идти, путь «nth_element». Надеюсь, это поможет и хорошая кодировка! :) @TahaBenabdallah – gsamaras

+0

Спасибо, я постараюсь выяснить это :) –