Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];

Вниз

Нужна струкнура данных,   Найти похожие ветки 

 
Ev_grenus   (2002-01-15 17:05) [0]

с подощью которой можно решить такую задачу.
На плоскости координатими заданы точки (много >100000). На каждом шаге точки перемещаются по заданому (для каждой отдельно) вектору (либо стоят на месте). Требуеться быстро определить для заданой точки:
а) ближайшую
б) точки которые находятся на расстоянии, которое меньше заданого R.

ЗЫ: Если каждый раз считать расстояния (n*n операций) то уже на 20000 начинает тормозить.


 
Digitman   (2002-01-15 18:20) [1]

Думается, оптимизация формата структуры здесь не поможет. А поможет, imho, немедленная сортировка массива структур всякий раз, когда новый элемент-структура в него добавляется. Т.е., очередная точка сразу встанет "на место" при ее добавлении, и не будет необходимости "шарить" по всему массиву при решении прямой задачи


 
Иван Шихалев   (2002-01-15 19:03) [2]

Кое-что можно сказать и по структуре:

пусть

type
TPoint = record
Y :integer; // или что там еще
end;
TLine = record
X :integer;
Ys : array of TPoint
end;
TArray = array of TLine;

Ну и, само собой, добавлять только в нужное место, а проверять методом вилки. Так будет все-таки оптимальней, чем просто отсортированный массив (по обеим координатам логарифмическое время).



 
Фе   (2002-01-15 20:01) [3]

Можно предложить и связанные списки.
По крайней мере обеспечим высокую скорость переорганизации.
Хотя можем проиграть на скорости доступа, но для данного случая - это второй малости величина.


 
Ev_genus   (2002-01-18 17:34) [4]

Говорите по конкретнее. Пока я остановился на такой модели.
Сортируем по Y и устанавливаем закладки (делим плоскость на полосы). Ищем нужные точки в соотведствующих полосах. Но Меня и это не устраивает. Надо что бы быстро и надёжно (и памяти по меньше гребло).
Заранее спасибо.

PS Надо что бы быстро и надёжно (и памяти по меньше гребло). А так иногда бывает.


 
Romkin   (2002-01-21 11:50) [5]

Т.Кормен, Ч.Лейзерсон, Р.Ривест. Алгоритмы: построение и анализ.
Как раз там описан метод для поиска наименьшего расстояния между точками, кол-во действий O(n*Log2(n)).
Алгоритм, правда, рекурсивный, так что насчет памяти - как запрограммируешь, но все равно прилично.
Идея такая:
Исходные данные: два массива X & Y, содержащие координаты (x,y)(записи типа TRecord вполне). Массивы упорядочены по возрастанию координат, соотв. x & y.
1. Делим множество точек пополам вертикальной линией (находим медиану массива X) на два L & R. Точки на линии - как хочешь респределяем по половинам. Получаем соотв Xr, Yr & Xl & Yl, также упорядоченные
2. Находим минимальные расстояния между точками половин (рекурсивно, те тоже дробя их пополам и тд), Dr & Dl соотв.
Находим минимальное расстояние из этих двух: D.
3. На основе Y создаем массив Yd, содержащий точки, расстояние по х которых от линии не более D (упорядоченный по y). Проходя по этому массиву снизу вверх, вычисляем для каждой точки расстояние до 7 следующих (обоснование семи - в книге).
Соответственно, минимальное из этих расстояний - минимальное для двух половин. Если гарантируется, что точки не совпадают, имхо, можно ограничится 5 точками.
Все делается рекурсивно, первоначально массивы удобно упорядочить QuickSort (demos\threads). Потом надо делить так, чтобы постоянно получались уже упорядоченные. Впрочем, поскольку по условию задачи входной массив почти упорядочен, QuickSort подходит плохо, упорядочивать лучше другими алгоритмами.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
6-8970
Oplg
2001-11-12 18:57
2002.02.04
Вопрос


3-8771
Reals
2002-01-05 19:37
2002.02.04
Как правильно сделать проверку в таблице...


3-8789
Akimpinpavel
2002-01-08 12:22
2002.02.04
Как связать Delphi с базой данныx Access


1-8836
MARcoDEN
2002-01-12 12:42
2002.02.04
Запущена ли программа?


7-9014
perov
2001-10-24 16:18
2002.02.04
Убить процесс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский