Быстрый поиск локальных min и max в 3d массиве
От: Михаил Лёсин Россия  
Дата: 23.06.10 10:35
Оценка:
Задачка такая:
На входе имеем достаточно большой 3хмерный массив флоатов (допустим 600x600x600), после его получения необходимо иметь возможность максимально быстро отвечать на внешние запросы, в качестве параметров которых приходят срезы в этом массиве, и надо возвращать минимум и максимум в заданном срезе.
Если каждый раз перебирать все элементы массива в заданном срезе, получается больно уж медленно.
Пока все что приходит в голову это сделать некую пирамиду из подмассивов с предварительно вычисленными значениями (для всех кубов 2х2х2, 4x4x4, 8x8x8 итд), по аналогии с префильтерингом изображений, но может быть есть какие-то более умные решения этой задачи?
WBW, Mike.
Re: Быстрый поиск локальных min и max в 3d массиве
От: _DAle_ Беларусь  
Дата: 23.06.10 10:51
Оценка:
Здравствуйте, Михаил Лёсин, Вы писали:

МЛ>Задачка такая:

МЛ>На входе имеем достаточно большой 3хмерный массив флоатов (допустим 600x600x600), после его получения необходимо иметь возможность максимально быстро отвечать на внешние запросы, в качестве параметров которых приходят срезы в этом массиве, и надо возвращать минимум и максимум в заданном срезе.
МЛ>Если каждый раз перебирать все элементы массива в заданном срезе, получается больно уж медленно.
МЛ>Пока все что приходит в голову это сделать некую пирамиду из подмассивов с предварительно вычисленными значениями (для всех кубов 2х2х2, 4x4x4, 8x8x8 итд), по аналогии с префильтерингом изображений, но может быть есть какие-то более умные решения этой задачи?

Может ли изменяться этот массив между запросами?
Что представляет собой срез?
Re: Быстрый поиск локальных min и max в 3d массиве
От: Кодт Россия  
Дата: 23.06.10 11:15
Оценка:
Здравствуйте, Михаил Лёсин, Вы писали:

МЛ>На входе имеем достаточно большой 3хмерный массив флоатов (допустим 600x600x600), после его получения необходимо иметь возможность максимально быстро отвечать на внешние запросы, в качестве параметров которых приходят срезы в этом массиве, и надо возвращать минимум и максимум в заданном срезе.


Самый быстрый отклик — это если заранее найти минимумы и максимумы для всех возможных срезов. То есть, 6 массивов по 600*600 и 6 массивов по 600.
Массивы заполняются за один проход по кубу.

А вот если массив меняется, то это будет дорогое удовольствие — поддерживать таблицу в соответствии.
Тут, пожалуй, какие-то деревянные структуры пригодятся.
Перекуём баги на фичи!
Re[2]: Быстрый поиск локальных min и max в 3d массиве
От: Михаил Лёсин Россия  
Дата: 23.06.10 11:28
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Может ли изменяться этот массив между запросами?

_DA>Что представляет собой срез?

Нет, массив не меняется
Срез это некий куб, заданный минимумальными и максимальными значениями по каждой из координат, например для массива 600x600x600 одним из срезов может быть значения от x=200 y=200 z=200 до x=300 y=250 z=400
WBW, Mike.
Re[2]: Быстрый поиск локальных min и max в 3d массиве
От: Михаил Лёсин Россия  
Дата: 23.06.10 11:33
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Самый быстрый отклик — это если заранее найти минимумы и максимумы для всех возможных срезов. То есть, 6 массивов по 600*600 и 6 массивов по 600.

К>Массивы заполняются за один проход по кубу.
Боюсь количество всевозможных срезов выйдет за все разумные границы при таком массиве, это далеко не 6*600*600 и 6*600

К>А вот если массив меняется, то это будет дорогое удовольствие — поддерживать таблицу в соответствии.

К>Тут, пожалуй, какие-то деревянные структуры пригодятся.
Массив не меняется
WBW, Mike.
Re: Быстрый поиск локальных min и max в 3d массиве
От: unreg_flex  
Дата: 23.06.10 12:06
Оценка:
Здравствуйте, Михаил Лёсин, Вы писали:

Могу предложить относительно простой способ ускорения:
Если объем среза не велик то поиск минимума и максимума и так достаточно быстр (например для срезов со сторонами не более 2 нада перебрать не более 8 элементов)
Будем оптимизить для случая более больших срезов.
Разобьем наш массив на срезы фиксированного размера (допустим примерно по KхKхK элементов) и вычислим в каждом из них минимум и максимум, делается это за линейное количество операций (1 проход), памяти потребуется (600/K)x(600/K)x(600/K) элементов.
Теперь все просто, при поступлении запроса нужно перебирать не все элементы среза, а элементы нашего массива, используя свойства min{A}=min{min{P},min{Q}}, где P U Q = A. И придется перебрать примерно в K^3 меньше элементов. Отдельно нужно только обработать случай попадания края среза на ячейки нашего нового массива.
Выбор К осуществляется в зависимости от статистики запросов.
Re[3]: Быстрый поиск локальных min и max в 3d массиве
От: _DAle_ Беларусь  
Дата: 23.06.10 12:46
Оценка: 24 (2) +1
Здравствуйте, Михаил Лёсин, Вы писали:

МЛ>Здравствуйте, _DAle_, Вы писали:


_DA>>Может ли изменяться этот массив между запросами?

_DA>>Что представляет собой срез?

МЛ>Нет, массив не меняется

МЛ>Срез это некий куб, заданный минимумальными и максимальными значениями по каждой из координат, например для массива 600x600x600 одним из срезов может быть значения от x=200 y=200 z=200 до x=300 y=250 z=400

Я бы построил дерево, хранящее минимумы для подкубов, можно Octree, а можно обычное бинарное дерево, просто на первом уровне делим пополам куб по x, на втором получившиеся параллелепипеды по y, на третьем по z, на четвертом опять по x и т.д. Дерево строим до каких-то разумных пределов в зависимости от объема доступной памяти. Можно построить полностью, а можно, например, до кубов вроде 8*8*8, в них придется уже искать минимум перебором попадающих в нашу область ячеек. Само дерево я бы строил в обычном массиве. Если бинарное, то переходя к i*2+1 и i*2+2 ячейкам, если octree, то соответственно, i*8+1, ..., i*8+7.
Re[3]: Быстрый поиск локальных min и max в 3d массиве
От: Тролль зеленый и толстый  
Дата: 23.06.10 22:39
Оценка: +1 :)
МЛ>Срез это некий куб

Интересное у вас понятие о срезах.
Re: Быстрый поиск локальных min и max в 3d массиве
От: Хвост  
Дата: 25.06.10 18:46
Оценка:
Здравствуйте, Михаил Лёсин, Вы писали:
судя по описанию задачи вам нужно kd-tree, в частности min/max kd-tree
People write code, programming languages don't.
Re[4]: Быстрый поиск локальных min и max в 3d массиве
От: lost_guadelenn  
Дата: 29.06.10 10:40
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

МЛ>>Срез это некий куб

ТЗИ>Интересное у вас понятие о срезах.
Может это срез в 4-х мерном (или более) пространстве
Re: Быстрый поиск локальных min и max в 3d массиве
От: McSeem2 США http://www.antigrain.com
Дата: 29.06.10 22:58
Оценка: -1 :))
Здравствуйте, Михаил Лёсин, Вы писали:

МЛ>На входе имеем достаточно большой 3хмерный массив флоатов (допустим 600x600x600), после его получения необходимо иметь возможность максимально быстро отвечать на внешние запросы, в качестве параметров которых приходят срезы в этом массиве, и надо возвращать минимум и максимум в заданном срезе.

МЛ>Если каждый раз перебирать все элементы массива в заданном срезе, получается больно уж медленно.

Можно попробовать старый древний симплекс-метод. Ключевые слова — опримизация симплекс-методом. Не знаю, насколько поможет.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.