以下是我的情况:

我必须保留扩展ASCII的所有3个字节组合,如下所示:

{ { (a,a,a),(a,a,b),..........(z,z,z) } }

所有这些组合导致了一大组256 * 256 * 256个值

在我的算法中,碰巧的是,每次迭代后,大集合都会分解成如下形式:
 {(a,a,a), (a,a,b)}
 {(a,a,c)}
.
.
.
.
{(z,z,z)}

我正在使用数组的 vector 来实现这一点。
vector<set<array<char,3> > > Partition;

使用此方法的原因是一个大集合将分解为子集。这些子集的数量未知,并且在每次迭代后,子集的数量可能会增加,因此我正在使用 vector 。然后,子集不应包含任何元素两次,因此我正在使用set和array来保留3个字符。

使用上述数据结构的问题在于,计算结果要花费大量时间。

我需要有关数据结构的建议,这种数据结构在我的情况下可能更有效。

我的算法的更多解释:
{(a,a,a),(a,a,b)........ (z,z,z)}

所有这些三叉戟都是无序 map 的键。所有这些三叉戟都对应这样的某个值
(a,a,a)           value=2
(a,a,b)           value=2
(a,a,c)           value=3
(a,a,d)           value=2
.
.
.
.
.

现在,我运行我的算法,并希望根据值(value)来知道可以压缩多少:
{(a,a,a) ,(a,a,b)  }          value=2
(a,a,c)                       value=3
{(a,a,d),......}              value=2

为什么我必须为value = 2设置一个单独的子集,因为根据我的算法,每当我以前的值与当前值不同时,我都必须创建一个新集合。

最佳答案

好吧,您正在关心3 * 8b,因此有24bit的值。不用{0, 0, 0},您可以使用一个整数0而不是{'a', 'a', 'a'},而可以使用0x616161,因为'a' == 0x61
所有这些int都可以存储在std::map中,其中由3个符号组成的整数是关键。或者,您可以使用数组ValueType arr[256*256*256]。我建议使用数组,但是如果您只有几个值,则可以使用map。

要将int转换为3个字符,可以使用按位操作<<>>读取有关herehere的信息。但我希望您能理解一点点的变化。

关于c++ - C++:用于快速搜索的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21904031/

10-13 07:47