Нужен совет по алгоритму

0

У меня есть код, где я использую две разные функции для 2D и 3D. В цикле for по списку координат я бы хотел вызвать функции соответственно, проверив dimensions. Тем не менее, проверка размера с if для каждой координаты очень неэффективна, так как проверка размера требуется только один раз (в начале кода).

Для вашей информации функции 2D/3D functions находятся в отдельном файле, а затем список координат находится в отдельном файле.

Может ли кто-нибудь предложить эффективный способ вызова соответствующей функции, используя только одну проверку в начале кода для dimensions?

Псевдокод: file1.cpp

readcoordinates();  //store the coordinates info;
for(number of coordinates)
   checkfunction(coordinates[i]); //function in file2.cpp

file2.cpp

checkfunction(coordinates[i]){
   //requires dimension info here for complicated checking,
   // which cannot be explained here.
   // Since entire list of coordinates is same dimension, multiple if checks can be avoided here

}
  • 4
    Мы вряд ли сможем вам помочь, не увидев больше контекста. Не могли бы вы опубликовать свой фактический код здесь? Спасибо!
  • 0
    Делают ли две функции одно и то же, но с разной размерностью? Если это так, то, вероятно, можно обобщить функцию для приема n-мерных координат. Если вы отправите код, мы можем помочь с этим или лучше ответить на ваш вопрос.
Показать ещё 3 комментария
Теги:
algorithm
if-statement

3 ответа

3
Лучший ответ

Сделайте число измерений параметром шаблона. Это позволяет избежать дублирования кода, но компилятор избавится от ВСЕХ проверок размеров, создав версию кода для 2-D и отдельную для 3-D, оба получаются полностью оптимизированными.

Вы не можете предоставить параметры шаблона во время выполнения, поэтому вам нужна функция отправки, которая динамически проверяет измерение, один раз и вызывает либо экземпляр шаблона 2-D, либо 3-D.

Альтернативой if else или switch функции отправки является использование виртуальной диспетчеризации (каждая виртуальная реализация затем вызывает правильное создание шаблона для выполнения фактической работы).

1

В большинстве ситуаций, подобных этому, ключ состоит в том, чтобы прекратить доступ к вашим элементам через список всех элементов. Списки не поддерживают порядок, и это ограничивает вас большим количеством проверок, чтобы узнать, нуждается ли элемент в обработке.

Например, вы можете использовать дерево элементов, а затем ноль в первом элементе в нужном диапазоне по оси X и последний элемент в пределах требуемого диапазона по этой оси X и обрабатывать все элементы "между ними". При таком решении вы могли бы поддерживать два упорядоченных дерева, для оси X и одну для оси Y.

Или вы можете построить структуру данных на основе методов Geo-Hashing.

В любом случае вы можете быстро отфильтровать элементы по координатам, а затем передать их другим подпрограммам, которые не выполняют какую-либо фильтрацию на основе координат (полагая, что фильтрация извне правильная).

0

В дополнение к другим предложениям (и предполагая, что вы используете их для какой-либо 2D-3D-математики), вы также можете просто рассматривать все как 3D-вектор (2D-векторы будут иметь только 0 для Z-координаты). Затем вы выполняете только одну функцию, независимо от того, сколько координат у вас есть в вашей структуре.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню