【发布时间】:2011-10-21 15:47:06
【问题描述】:
我正在编写一个严重依赖于 (1) 访问单个位和 (2) 2 个位集 A 和 B 之间的汉明距离计算(即 A 和 B 之间不同的位数)的软件。这些位集非常大,介于 10K 和 1M 位之间,我有一堆。由于在编译时不可能知道 bitset 的大小,我使用的是 vector < bool >,但我计划很快迁移到 boost::dynamic_bitset。
以下是我的问题:
(1) 关于哪些实现具有最快的单位访问时间的任何想法?
(2) 要计算汉明距离,最简单的方法是循环单个位并计算 2 个位集之间的差异。但是,我的感觉是,循环遍历字节而不是位,执行 R = byteA XOR byteB,并在包含 255 个条目的表中查看与 R 关联的“本地”距离可能要快得多。另一种解决方案是存储255 x 255 矩阵,无需操作即可直接访问 byteA 和 byteB 之间的距离。所以我的问题是:知道如何从std::vector < bool > 或 boost::dynamic_bitset 实现它吗?换句话说,你知道是否有办法访问字节数组或者我必须从头开始重新编码所有内容?
【问题讨论】:
-
您是否尝试过使用 dynamic_bitset 的
operator^和count()方法,并对其进行分析以查看性能是否足够?这可能是实现对您来说已经足够好了。 -
鉴于各种答案,我刚刚使用 boost::dynamic_bitset & vector 和优化标志 -O2 进行了一些基本测试。两种实现之间的访问时间大致相同(差异的 3%)。更重要的是,如果您使用 operator^ 和 count() 来计算汉明距离,与幼稚的方法相比,您将运行时间除以 10!!!!哇哦,非常感谢!
-
@koskos 请发布基准测试代码。
标签: c++