C++:用于快速搜索的数据结构
C++ : Data structure for fast searching
以下是我的场景:
我必须将扩展 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 或应用程序中无效的其他值初始化数组。然后运行修改某些数组项的计算。
然后,您可以按顺序浏览数组,挑选出具有相同计数的相邻项目,并将它们组合在一起。
很难确定这是否有效,因为我没有很多关于您的应用程序的信息。但是如果你能这样想,它可以为你省去很多操作向量和集合的麻烦。
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 在树结构中搜索数据
- 用于高效搜索的数据结构
- 多种搜索组合的数据结构设计
- 哪种数据结构是在一个向量中搜索和计数对象对的最佳数据结构
- 获取成功的二进制搜索树C 数据结构
- C++:用于快速搜索的数据结构
- 仅使用点云作为查询点的D维k近邻搜索的C++数据结构
- 如何为搜索应用程序找到正确的数据结构
- 可以处理随机访问和键搜索的数据结构是什么?
- 在C++中搜索合适的数据结构以推入向量
- 二叉搜索树问题和数据结构问题
- 范围搜索的数据结构(重新访问)
- 读取大部分数据结构以压缩和搜索源代码
- 用于插入数据而非搜索的最快数据结构
- 我怎么知道一个数据结构按值搜索的平均复杂度
- 在c++中使用深度优先搜索查找图数据结构中所有可能的路径
- 在C++中存储和搜索短语的最佳数据结构
- 正确的数据结构,实现快速插入和快速搜索
- 搜索和更新整数值列表最快的数据结构是什么?