Я запускаю алгоритм на C ++, основанный на вычислении двоичного дерева с итерацией и индукцией.
Для этой цели я вложил карту, как это
typedef map<double, bool> b1d;
typedef map<double, b1d> mb2d;
typedef vector<mb2d> vb3d;
typedef map<double, double> m1d;
typedef map<double, m1d> m2d;
typedef vector<m2d> v3d;
m2d ZY;
v3d * V = new v3d (n+1, m2d(ZY));
mb2d ZYb;
vb3d * Vb = new vb3d (n+1, mb2d(ZYb));
, и я изменяю значения следующим образомчто
(*J_tab)[K+1.0][Z+y][W - 1.0/sqrt((double) n)] = V_tmp;
(*J_bool)[K+1.0][Z+y][W - 1.0/sqrt((double) n)] = true;
Проблема в Я получаю много дубликатов, и это странно для std :: map , как вы можете видеть на этой картинке, которую я получил с помощью моего отладчика На этой картинке вы можете видеть во второй степени множество повторений, например, 0,6 или 0,7, а в третьей степени - в 0,3.
Единственный способ избавиться от найденного мной дублирования - этоЗамените double на строку, т.е.
typedef map<string, bool> b1d;
typedef map<string, b1d> mb2d;
typedef vector<mb2d> vb3d;
и выполняйте эти операции
std::string strZy, strWm, strWp;
std::ostringstream strsZy, strsWm, strsWp;
int precision = 5;
strsZy << fixed << setprecision(precision) << Z+y;
strsWp << fixed << setprecision(precision) << W + 1.0/sqrt((double) n);
strsWm << fixed << setprecision(precision) << W - 1.0/sqrt((double) n);
strZy = strsZy.str();
strWm = strsWm.str();strWp = strsWp.str();
Однако я думаю, что это занимает больше памяти, чем удвоение и больше времени, поэтому это не самое эффективное решение.
Кто-то знает, как это исправить?или другой элегантный способ сделать это?