Я работаю с некоторыми двоичными данными, которые я сохранил в произвольно больших массивах беззнаковых int. Я обнаружил, что у меня есть дублирование данных, и я стараюсь игнорировать дубликаты в краткосрочной перспективе и удалять все ошибки, вызывающие их в долгосрочной перспективе.
Я смотрю на вставку каждого набора данных на карту, прежде чем хранить его, но только если он не был найден на карте. Моя первоначальная мысль состояла в том, чтобы иметь карту строк и использовать memcpy в качестве молотка, чтобы заставить ints в массив символов, а затем скопировать это в строку и сохранить строку. Это не удалось, потому что многие мои данные содержат несколько байтов 0
(aka NULL
) в начале соответствующих данных, поэтому большинство очень реальных данных были выброшены.
Моя следующая попытка планируется std::map<std::vector<unsigned char>,int>
, но я понимаю, что я не знаю, будет ли работать функция вставки карты.
Возможно ли это, даже если это не рекомендуется, или есть лучший способ подойти к этой проблеме?
Изменить
Итак, было отмечено, что я не уточнил, что я делаю, поэтому здесь, надеюсь, лучшее описание.
Я работаю над созданием минимального связующего дерева, учитывая, что у меня есть несколько деревьев, содержащих фактические конечные узлы, с которыми я работаю. Цель состоит в том, чтобы придумать выбор деревьев с наименьшей длиной и охватывает все конечные узлы, где выбранные деревья разделяют друг с другом не более одного node и все связаны. Я основываю свой подход на двоичном дереве решений, но внесение нескольких изменений, надеюсь, позволит увеличить parallelism.
Вместо того, чтобы использовать подход с двоичным деревом, я решил сделать бит-вектор из целых без знака для каждого набора данных, где 1 в битовой позиции указывает на включение соответствующего дерева.
Например, если только дерево 0 было включено в набор данных дерева 5, я бы начал с
00001
Отсюда я могу сгенерировать:
00011
00101
01001
10001
Каждый из них может обрабатываться параллельно, поскольку ни один из них не зависит друг от друга. Я делаю это для всех одиночных деревьев (00010, 00100 и т.д.) И должен, я не нашел времени, чтобы официально доказать это, иметь возможность генерировать все значения в диапазоне (0,2 ^ n) один раз и только один раз.
Я начал замечать, что многие наборы данных занимают гораздо больше времени, чем я думал, что они должны, и позволили отладочному выводу смотреть на все сгенерированные результаты, а быстрый Perl script позже было подтверждено, что я несколько процессов, генерирующих один и тот же результат. С тех пор я пытался решить, откуда дубликаты поступают с очень небольшим успехом, и я надеюсь, что это будет работать достаточно хорошо, чтобы позволить мне проверять результаты, которые генерируются без 3-дневного ожидания вычисления.