Поиск:

Ответ в темуСоздание новой темы Создание опроса
> какому из прямоугольников принадлежит точка, 2D 
V
    Опции темы
Earnest
Дата 8.7.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Цитата(volatile @  6.7.2011,  14:33 Найти цитируемый пост)
Пока склоняюсь в вашей мудрой (без кавычек) мысли. Пожалуй брошу все, и оставлю как есть, то есть простой линейный перебор.

Это ведь правда мудрая мысль. Наверняка у тебя есть чем заняться, кроме ускорения поиска прямоугольников. Сначала убедись, что ускорять надо, а уже потом трать на это время. Всего-то нужно инкапсулировать функцию запроса, чтобы потом ее можно было легко переписать не тревожа остальной код - если будут тормоза. И вообще, как сказал кто-то из гуру, "самый надежный код - тот, которого нет".

Но, на всякий случай, на будущее:
Цитата(volatile @  6.7.2011,  14:33 Найти цитируемый пост)
У каждого прямоугольника две стороны, по какой сортировать?

Сортировать только по минимуму. Либо по максимуму. Разницы особой нет, зависит от  вида запросов. 
А размер (длину-ширину) учитывать уже при запросе, это ведь просто.

Добавлено через 8 минут и 48 секунд
Цитата(volatile @  6.7.2011,  14:33 Найти цитируемый пост)
Получается надо пробегать все прямоугольники в 1 индексе левее найденного

Вовсе не все, а только до того прямоугольника, координата которого >= точки запроса (это если отсортировано по минимумам). И оставлять для дальнейшей проверки только те прямоугольники, у которых мин+длина <= точки запроса. То же самое по другой координате. Полученные списки пересечь.
Можно вообще оставить только один индекс, а попадание по другой координате проверять явно (для каждого прямоугольника из найденной последовательности). Число проверяемых прямоугольников существенно уменьшается.


--------------------
...
PM   Вверх
volatile
Дата 9.7.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(Earnest @  8.7.2011,  14:48 Найти цитируемый пост)
Вовсе не все, а только до того прямоугольника, координата которого >= точки запроса (это если отсортировано по минимумам). 

Хорошо, давайте разберемся с этим.
user posted image
Вот простейший случай 9 одинаковых кубиков. Кубики отсортированы по левому краю, порядковые номера в индексе показаны.
Допустим точка попала в центр. По индексу она попала между 6 и 7.
Итак с 7 по 9 мы точно отбрасываем. Необходимый кубик где-то ниже или равен 6. (т.е. в диапазоне 1...6)
Начинаем с 6 и вниз. До какого пробегать?

т.е меня интересует что поставить вместо END

for (int i= 6; i>END; --i)
   if (совпали?)
      break;
PM MAIL   Вверх
_Y_
Дата 9.7.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(volatile @ 6.7.2011,  13:33)
Цитата(_Y_ @  5.7.2011,  06:52 Найти цитируемый пост)
Рассортировать прямоугольники по вертикали и по горизонтали.
Бинарным делением отбросить прямоугольники, лежащие ниже и всыше точки.

Так. стоп.
У каждого прямоугольника две стороны, по какой сортировать?
Нельзя же отсортировать сразу по двум. значит 2 индекса.
По вертикали и по горизонтали. Опять два индекса, один по вертикали, другой по горизонтали?
Итого 2 направления X 2 стороны = 4 индекса получается.  Дальше,
Допустим 4-мя бинарными поисками мы таки нашли в 4 индексах границы. Что дальше?
Как отбросить неподходящие? мозги не работают. Индексы разные ведь.
Получается надо пробегать все прямоугольники в 1 индексе левее найденного
во 2 правее найденного, в 3 выше найденного, в 4 ниже найденного.
Получается мы пробежали по всему массиву 2 раза, и это не считая 4 бинарных поисков.
Имхо, быстрее простой перебор.

ИМХО простой перебор вседа самый долгий. Ну, если, конечно, у Вас не пара-тройка прямоугольников. Но я не утверждаю, что мое предложение самое быстрое.

Я поленился расписывать совсоем уж детально. Поэтому Вы и поняли это как многократные пробежки. Попробую уточнить.
  • Отсортировать действительно надо 4 раза. Отдельно по кажой границе прямоугольников. Но Вы пишете, что время сотрировки значения не имеет - так что хоть 400 раз, но заранее - до поступления запроса на поиск точки (как я понял).
  • Отбрасывать прямоугольники лежащие выше точки надо используя сортировку по нижней границе, ниже - по верхней и т.д. Отбрасывать надо из всего набора, естественно.
  • Поиск в сортированном массиве надо проводить никак не пробежкой, а бинарным делением, например. Если на память ограничений нет, можно заранее построить бинарные деревья - быстрее будет.
  • Закономерный вопрос - как отбрасывать, чтобы было быстро. Не размеры же массива каждый раз переустанавливать. На этот вопрос я не отвечу - все зависит от возможностей конкретного языка програмирования: какие в нем имеются структуры данных и сколь они быстры.
Еще раз - на звание разработчика самых быстрых алгоритмов я не претендую smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Earnest
Дата 9.7.2011, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Цитата(volatile @  9.7.2011,  01:58 Найти цитируемый пост)
Вот простейший случай 9 одинаковых кубиков. Кубики отсортированы по левому краю, порядковые номера в индексе показаны.
Допустим точка попала в центр. По индексу она попала между 6 и 7.

Да, ты прав, я спутала с одномерными интервалами. Ранее вроде предполагалось, что прямоугольники не пересекаются. Но проекции их запросто могут.
И доп. индексы тоже особо не спасают, т.к. скорее все запутывают. Можно, конечно, делать как предлагает Y: "отбрасывать" - фактически, вычислять пересечение  множеств - 2 или 4 (если по всем сторонам индексировать), но как-то это чересчур. 
Лучше уж кластеры.
ЗЫ
Есть еще способ отобразить плоскость в линию с помощью фракталов. В этом случае точки плоскости упорядочиваются в соответствии со своим порядком на фрактальной линии. Но это как-то слишком кучеряво для данной задачи.



--------------------
...
PM   Вверх
volatile
Дата 9.7.2011, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(Earnest @  9.7.2011,  14:21 Найти цитируемый пост)
Есть еще способ отобразить плоскость в линию с помощью фракталов

В принципе к-д дерево, что предложил baldina и приводит к-мерное пространство к одномерной системе. 
(Это я своими словами.  smile , но помоему не далеко от сути ?)
Трудность только построить эффективное дерево автоматически...
PM MAIL   Вверх
Earnest
Дата 10.7.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Не, это как раз не очень трудно... похоже на деревья решений. Смысл в том, что каждый раз нужно выбрать "наиболее разделяющее" значение.
Просто страшно поначалу, потому что слова все такие умные. Это я свои впечатления излагаю, как раз недавно с Decision Tree разбиралась. Оказалось, если не сильно умничать со всякими там улучшениями, ничего страшного. Главное, действительно быстро (и строит и классифицирует).
Но это, конечно, не сведение к одномерной системе, а линейный классификатор. Но не в терминах суть.
Если у тебя есть время \ возможность \ желание заморачиваться, попробуй. Решение в самом деле красивое. 


--------------------
...
PM   Вверх
_Y_
Дата 10.7.2011, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Earnest @  10.7.2011,  08:37 Найти цитируемый пост)
... как раз недавно с Decision Tree разбиралась ... Решение в самом деле красивое.
 Подскажи, пожалуйста, где описано хорошо, коротко и, желательно, почти без примеров. Мне тоже интересно.
 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Earnest
Дата 10.7.2011, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



В Вики, конечно. Читать английский вариант. Потом идешь по ссылке на алгоритм ID3. Там где-то рядом есть и код, но не читабелен, имхо. Проще разобраться и написать самому. Без примеров вряд ли что-то найдешь; причем почему-то примеры всегда на редкость дебильные; при этом все про дискретный случай и про булевские функции (да\нет). Но для небулевских (несколько классов) строится точно так же (все эти энтропии и прочая хрень). Про действительные переменные тоже можно что-то найти, но в основном додумывается, после погружения в тему. Я весь поиск начинала с Вики, оттуда по ссылкам и т.д. По старой привычке храню не ссылки, а скачиваю документы, поэтому ссылками не поделюсь. Но найти не проблема.


--------------------
...
PM   Вверх
I_Am_Rock
Дата 11.7.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15



Цитата(_Y_ @  5.7.2011,  06:52 Найти цитируемый пост)
afiskon, на твоей картинке стороны всех прямоугольников параллельны. В условии же этого нет. Но принцип, наверное, не измениться.

У прямоугольников всегда все стороны параллельны

Это сообщение отредактировал(а) I_Am_Rock - 11.7.2011, 14:36
PM MAIL WWW   Вверх
_Y_
Дата 11.7.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(I_Am_Rock @  11.7.2011,  14:35 Найти цитируемый пост)
У прямоугольников всегда все стороны параллельны

Если про эту задачу, то, когда я писал, параллельность задана не была.
Если вообще - то это, звиняюсь, как?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
mrgloom
Дата 13.12.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



вроде как по вашему адресу
http://en.wikipedia.org/wiki/R-tree
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.