具有一致索引的快速查找数据结构

时间:2019-02-28 10:50:09

标签: c++ stdvector unordered-map

我的data存储在自定义对象的向量中,在这个特定的软件中,我对interesting的那些对象感兴趣。因此,我有一个std::vector<size_t> interesting;来存储它们的索引,以便在我调用data[ interesting[i] ]时得到第i个有趣的数据对象。

我需要在此处指定interesting是索引的未排序向量,因此,目前没有任何巧妙的技巧可用于对元素进行排序原始data ...

现在进入问题: 这些数据很有趣,因为它们具有属性AB或两者都有,我需要将该属性的值(假设它是简单的double)存储在另一个向量中以便快速检索

我不知道该怎么办!这些属性应使用哪种结构?

data.size() = 100interesting.size() = 90(更大,但更容易处理整数),并且删除“无趣”数据是不可行的,因为它们已被其他部分使用软件。 我特别需要能够进行快速查找,datainteresting的大小都不会随着软件的运行而改变(只有数据值会改变),因此在结构中插入是一次性的代价,刚开始,不会像查找那样影响性能。

我想到了两种解决方案:

  • 我可以为B使用std::unordered_map<size_t,double> A和类似物来存储索引属性对,因此我可以使用A.at(interesting[i])进行搜索以获取属性A的值。第i个有趣的元素。 因为在此阶段不再需要插入,所以我可以安全地假定这是O(1)吗?这将是我的首选方式。

  • 我可以分配一个std::vector<double> A ( data.size() );来存储这些值,然后像对待数据一样调用A[ interesting[i] ]。这样可以确保查找速度很快,但是我会:

    1. 随着data的大小的增加,浪费了大量的内存……实际上,如果我们假设没有重叠,我将浪费data.size()元素的总和。目前AB只是double,但是如果在任何时候我都需要将它们的类型更改为更大的值,那么...我假设使用O(1)查找的稀疏向量不存在,对吧?
    2. 这里没有边界检查,上帝禁止我去搜索A[3],而3并不是一个有趣的索引!我需要插入自己的检查开销,这可能会使查找不再那么快...

简而言之:我对属性AB的数据结构感兴趣,以便我可以访问这些值[仅为interesting数据点定义]和还要知道它们对应哪个data值...

有人可以为这个问题找到一个好的解决方案吗?希望我已经足够清楚了!


评论者要求提供代码示例,由于我没有弄清楚要使用哪种数据结构,所以我没有工作,但是理想情况下我只是想做

std::vector<MyObject> data;
// ...
// get data and do stuff
// ...

std::vector<size_t> interesting;
// ...
// initialise interesting as a vector of indexes that refer to the data
// ...

// Now initialize the A property DS
std::vector<double> A ( data.size() ); // <--- this is what I'm questioning about
// maybe I'm better off with std::unordered_map<size_t,double> A ?

// so that (once initialised) I can quickly do
size_t i = 5;
std::cout << "Data point " << data[ interesting[i] ] << 
    " has a property A's value of " << A[ interesting[i] ] << std::endl;
// for evey i I want

0 个答案:

没有答案