C++:用于快速搜索的数据结构

C++ : Data structure for fast searching

本文关键字:搜索 数据结构 用于 C++      更新时间:2023-10-16

以下是我的场景:

我必须将扩展 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<set<array<char,3> > > Partition;

使用它背后的原因是 一个大集合会分解成子集 .这些子集的数量是未知的,每次迭代后子集的数量可能会增加,因此我使用向量。然后子集不应该包含任何元素两次,因此我正在使用 set 和数组来保留 3 个字符。

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

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

对我的算法的更多解释:

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

所有这些三元组都是无序地图的键。所有这些三板都对应于这样的某个值

(a,a,a)           value=2
(a,a,b)           value=2
(a,a,c)           value=3
(a,a,d)           value=2
.
.
.
.
.

现在,我运行我的算法,并想知道根据值可以压缩多少:像这样

{(a,a,a) ,(a,a,b)  }          value=2
(a,a,c)                       value=3
{(a,a,d),......}              value=2

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

好吧,你关心3 * 8b所以有24位值。{0, 0, 0}您可以有一个整数0而不是{'a', 'a', 'a'}而不是您可以拥有0x616161,因为'a' == 0x61

所有这些整数都可以存储在 std::map 中,由 3 个符号组成的整数是关键。或者您可以使用数组ValueType arr[256*256*256]。我建议使用数组,但是如果你只有几个值,你可以使用 map。

要从int个字符转换为 3 个字符,您可以使用按位运算<<>>在此处和此处阅读有关它们的信息。但我希望你理解位移位。

为什么不只是一个数组:

int[256*256*256] values;

创建工会:

typedef struct
{
byte b1;
byte b2;
byte b3;
} triplet;
union tIndex
{
triplet trip;
int index;
}

所以如果你想访问项目['a','b','c'],你可以写:

union tIndex;
iIndex.index = 0;  // make sure all bytes are cleared.
tIndex.b1 = 'a';
tIndex.b2 = 'b';
tIndex.b3 = 'c';
values[tIndex.index] = 22;

因此,假设您使用值 -1 或应用程序中无效的其他值初始化数组。然后运行修改某些数组项的计算。

然后,您可以按顺序浏览数组,挑选出具有相同计数的相邻项目,并将它们组合在一起。

很难确定这是否有效,因为我没有很多关于您的应用程序的信息。但是如果你能这样想,它可以为你省去很多操作向量和集合的麻烦。