Основной вопрос: У меня есть квадрат размера. У меня есть вектор верхних и нижних границ. Каков наиболее эффективный способ перечислить координаты вершин?Каков наиболее эффективный способ перечисления вершин k-мерного гиперкуба в C++?
Предпосылки: Например, у меня есть трехмерная коробка. Самый эффективный алгоритм/код для получения:
vertex[0] = (0, 0, 0) -> (L_0, L_1, L_2)
vertex[1] = (0, 0, 1) -> (L_0, L_1, U_2)
vertex[2] = (0, 1, 0) -> (L_0, U_1, L_2)
vertex[3] = (0, 1, 1) -> (L_0, U_1, U_2)
vertex[4] = (1, 0, 0) -> (U_0, L_1, L_2)
vertex[5] = (1, 0, 1) -> (U_0, L_1, U_2)
vertex[6] = (1, 1, 0) -> (U_0, U_1, L_2)
vertex[7] = (1, 1, 1) -> (U_0, U_1, U_2)
где L_0 соответствует 0'th элемента нижней границы вектора & также U_2 является вторым элементом верхней границы вектора.
Мой код:
const unsigned int nVertices = ((unsigned int)(floor(std::pow(2.0, double(nDimensions)))));
for (unsigned int idx=0; idx < nVertices; ++idx)
{
for (unsigned int k=0; k < nDimensions; ++k)
{
if (0x00000001 & (idx >> k))
{
bound[idx][k] = upperBound[k];
}
else
{
bound[idx][k] = lowerBound[k];
}
}
}
где переменная bound
объявлена как:
std::vector< std::vector<double> > bound(nVertices);
но у меня до размера так, чтобы не тратить время на выделение памяти петли , Мне нужно вызывать описанную выше процедуру около 50 000 000 раз каждый раз, когда я запускаю свой алгоритм, поэтому мне нужно, чтобы это было действительно эффективно.
Возможные подзаголовки: Быстрее ли сдвигается на k вместо того, чтобы всегда переключаться на 1 и сохранять промежуточный результат? (Должен ли я использовать >> = ??)
Как вы могли бы прошу прощения в ассемблере? И еще одна вещь: Профиль, Профиль, Профиль. Примите предложения здесь и проверьте, чтобы узнать, где они находятся, и где они медленны. – 2010-12-07 03:56:31
Насколько велика k? Это исправлено? – 2010-12-07 03:57:29