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

C++:快速搜索的数据结构,c++,data-structures,C++,Data Structures,以下是我的设想: 我必须保持扩展ASCII的所有3字节组合如下: { { (a,a,a),(a,a,b),..........(z,z,z) } } {(a,a,a), (a,a,b)} {(a,a,c)} . . . . {(z,z,z)} 所有这些组合都会产生一组大的256*256*256值 在我的算法中,每次迭代后,大集合都会分解为如下内容: { { (a,a,a),(a,a,b),..........(z,z,z) } } {(a,a,a), (a,a,b)} {(a,a,

以下是我的设想:

我必须保持扩展ASCII的所有3字节组合如下:

{ { (a,a,a),(a,a,b),..........(z,z,z) } }
 {(a,a,a), (a,a,b)}
 {(a,a,c)}
.
.
.
.
{(z,z,z)}
所有这些组合都会产生一组大的256*256*256值

在我的算法中,每次迭代后,大集合都会分解为如下内容:

{ { (a,a,a),(a,a,b),..........(z,z,z) } }
 {(a,a,a), (a,a,b)}
 {(a,a,c)}
.
.
.
.
{(z,z,z)}
我使用数组集合的向量来实现它

vector<set<array<char,3> > > Partition;
所有这些三元组都是无序地图的关键。所有这些三元组都对应于这样一个特定的值

(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代替{'a','a','a},你可以用0x6161,因为'a'==0x61

所有这些整数都可以存储在由3个符号组成的整数是键的地方。也可以使用数组ValueType arr[256*256*256]。我建议使用数组,但是如果只有几个值,可以使用map

要将int转换为3个字符,可以使用逐位操作,并阅读有关它们的信息。但我希望你们理解位移位。

你们关心的是3*8b,所以有24位的值。你可以用一个整数0代替{'a','a','a},你可以用0x6161,因为'a'==0x61

所有这些整数都可以存储在由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初始化数组,或者使用在应用程序中无效的其他值初始化数组。然后运行修改某些数组项的计算

然后,您可以按顺序遍历数组,挑出具有相同计数的相邻项,并将它们组合起来


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

为什么不仅仅是一个数组:

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初始化数组,或者使用在应用程序中无效的其他值初始化数组。然后运行修改某些数组项的计算

然后,您可以按顺序遍历数组,挑出具有相同计数的相邻项,并将它们组合起来


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

我对位移位没有太多的概念,我需要检查它。位移位允许从整数中取任意位,所以你总是需要取最后8位来表示你的字母,但在使用最后一位之前,您需要将数字移动8或16个位置。但你应该读一读,它有时真的很有用。听起来像是你想和工会一起做的事情。通过这种方式,你可以将其作为单个数字或单个字节进行寻址。如果有4个而不是3个值,并且这3个字符不需要传输到其他机器,那么union将是最好的解决方案,因为使用union的整数索引值取决于endian,也可能取决于编译器。我对位移位不太了解,我需要检查它。位移位允许从整数中取任意位,所以您总是需要取最后8位来表示字母,但在使用最后一位之前,您需要将数字移动8或16个位置。但你应该读一读,它有时真的很有用。听起来像是你想和工会一起做的事情。通过这种方式,你可以将其作为单个数字或单个字节进行寻址。如果有4个而不是3个值,并且这3个字符不需要传输到其他机器,那么union将是最好的解决方案,因为使用union的整型索引值取决于endian,也可能取决于编译器。我希望它是一个256*256*256的集合。您找到问题的答案了吗?我希望它是一个256*256*256的集合。您找到问题的答案了吗?