以下是我的情况:
我必须保留扩展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个字符,可以使用按位操作<<
和>>
读取有关here和here的信息。但我希望您能理解一点点的变化。
关于c++ - C++:用于快速搜索的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21904031/