Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Февраль 18, 2013, 10:16



Название: Поиск группы
Отправлено: Igors от Февраль 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 поисков, но это как-то "недостойно программиста"  :)  А как по-умному?

Спасибо


Название: Re: Поиск группы
Отправлено: Bepec от Февраль 18, 2013, 10:30
Присоединяюсь к вопросу. Проблема чуть проще, но такого же типа.


Название: Re: Поиск группы
Отправлено: Igors от Февраль 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 новых ключа из искомого диапазона и крутим рекурс


Название: Re: Поиск группы
Отправлено: Old от Февраль 19, 2013, 18:02
А результат работы этой функции где смотреть?
Я так понял, что ключи в контейнере отсортированы?


Название: Re: Поиск группы
Отправлено: Igors от Февраль 19, 2013, 18:11
А результат работы этой функции где смотреть?
Результат (найденные элементы) записывается там где "..."  :)
Я так понял, что ключи в контейнере отсортированы?
Да


Название: Re: Поиск группы
Отправлено: Old от Февраль 19, 2013, 18:53
Да
Я беру коллекцию из элементов Cube и куда ее тут? Как ее сортируем?



Название: Re: Поиск группы
Отправлено: Igors от Февраль 20, 2013, 10:25
Я беру коллекцию из элементов Cube и куда ее тут? Как ее сортируем?
Наверное Вы говорите о наборе ключей для которых надо найти элементы в (большом) контейнере data. У меня такого нет - просто 1 ключ и разница +/- 1. Ну как бы набор искомых задан аналитически. Поэтому "куда" решается по задаче. В любом случае по искомому ключу необходимо находить следующий и предыдущий искомый - в том же порядке сортировки что и для data.