Russian Qt Forum
Ноябрь 16, 2024, 13:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск группы  (Прочитано 3128 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Февраль 18, 2013, 10:16 »

Добрый день

Есть исходный контейнер таких структур
Код
C++ (Qt)
struct Cube {
int x, y, z;  // уникальный ключ(и)
...
};
 
Нужно для заданного ключа (x0, y0, z0) найти все элементы c разницей по x, y, z не более чем +1 и не менее -1. Не гарантируется что  элемент с ключом (x0, y0, z0) есть. Можно создавать любые доп контейнеры и структуры (1 или более). Конечно можно использовать напр std::set и выполнить 27 поисков, но это как-то "недостойно программиста"  Улыбающийся  А как по-умному?

Спасибо
Записан
Bepec
Гость
« Ответ #1 : Февраль 18, 2013, 10:30 »

Присоединяюсь к вопросу. Проблема чуть проще, но такого же типа.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 19, 2013, 17:35 »

Получилось, но "в общем виде" не дотянулся. Псевдокод
Код
C++ (Qt)
template <class Key, class Container>
void FindMultiRecursive(
const Container & data, // data container
const Key & loKey, // min key to search
const Key & hiKey, // max key to search
SInt32 beg, SInt32 end ) // search range indices
{
while (end - beg > 1) {
SInt32 mid = (beg + end) / 2;
const Key & midKey = data[mid];
if (midKey < loKey)
beg = mid;
else
if (midKey > hiKey)
end = mid;
else {
// here is most interesting
// ...
//
FindMultiRecursive(data, loKey, midLoKey, beg, mid);
FindMultiRecursive(data, midHiKey, hiKey, mid, end);
return;
}
}
}
 
Смысл в том что искомый диапазон лежит внутри индексов поиска, схема

Key[beg]------------- loKey --------- hiKey ----------Key[end]

Когда поиск попадает между 2 искомыми ключами, выбираются 2 новых ключа из искомого диапазона и крутим рекурс
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Февраль 19, 2013, 18:02 »

А результат работы этой функции где смотреть?
Я так понял, что ключи в контейнере отсортированы?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 19, 2013, 18:11 »

А результат работы этой функции где смотреть?
Результат (найденные элементы) записывается там где "..."  Улыбающийся
Я так понял, что ключи в контейнере отсортированы?
Да
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Февраль 19, 2013, 18:53 »

Да
Я беру коллекцию из элементов Cube и куда ее тут? Как ее сортируем?

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 20, 2013, 10:25 »

Я беру коллекцию из элементов Cube и куда ее тут? Как ее сортируем?
Наверное Вы говорите о наборе ключей для которых надо найти элементы в (большом) контейнере data. У меня такого нет - просто 1 ключ и разница +/- 1. Ну как бы набор искомых задан аналитически. Поэтому "куда" решается по задаче. В любом случае по искомому ключу необходимо находить следующий и предыдущий искомый - в том же порядке сортировки что и для data.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.34 секунд. Запросов: 22.