【问题标题】:C++ : Data structure for fast searchingC++:快速搜索的数据结构
【发布时间】:2014-02-20 09:50:04
【问题描述】:

以下是我的场景:

我必须保留扩展 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;

使用这个的原因是一个大集合会分成子集。这些子集的数量是未知的,每次迭代后子集的数量可能会增加,因此我使用向量。那么子集不应该包含任何元素两次,因此我使用集合和数组来保留 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 创建一个单独的子集,因为根据我的算法,只要我之前的值与当前值不同,我就必须创建一个新的集合。

【问题讨论】:

  • 希望是256*256*256的一套。
  • 您找到问题的答案了吗?

标签: c++ data-structures


【解决方案1】:

嗯,你很关心3 * 8b,所以有 24 位值。除了{0, 0, 0},你可以使用一个整数0,而不是{'a', 'a', 'a'},你可以使用0x616161,因为'a' == 0x61

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

要将int 转换为3 个字符,您可以使用按位运算&lt;&lt;&gt;&gt; 阅读有关它们的信息herehere。但我希望你能理解位移。

【讨论】:

  • 好吧,我对位移不太了解,我需要检查一下。
  • 移位允许从整数中获取任何一位或多位,因此您始终需要取最后 8 位来表示您的字母,但在取最后一位之前,您需要将数字移动 8 或 16 个位置。但你应该阅读它,它有时真的很有用。
  • 听起来像是你想用union 做的事情。这样,您可以将其作为单个数字或单个字节来寻址。
  • 如果有 4 个而不是 3 个值并且这 3 个字符不需要传输到其他机器,那么 union 将是最好的解决方案,因为使用 union 的整数索引值取决于字节序,可能取决于编译器。
【解决方案2】:

为什么不只是一个数组:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 2015-11-10
    • 2015-10-24
    • 1970-01-01
    • 2014-03-09
    • 2011-07-14
    • 2011-10-27
    • 2014-01-16
    相关资源
    最近更新 更多