我的data
存储在自定义对象的向量中,在这个特定的软件中,我对interesting
的那些对象感兴趣。因此,我有一个std::vector<size_t> interesting;
来存储它们的索引,以便在我调用data[ interesting[i] ]
时得到第i个有趣的数据对象。
我需要在此处指定interesting
是索引的未排序向量,因此,目前没有任何巧妙的技巧可用于对元素进行排序原始data
...
现在进入问题:
这些数据很有趣,因为它们具有属性A
,B
或两者都有,我需要将该属性的值(假设它是简单的double
)存储在另一个向量中以便快速检索
我不知道该怎么办!这些属性应使用哪种结构?
说data.size() = 100
和interesting.size() = 90
(更大,但更容易处理整数),并且删除“无趣”数据是不可行的,因为它们已被其他部分使用软件。
我特别需要能够进行快速查找,data
和interesting
的大小都不会随着软件的运行而改变(只有数据值会改变),因此在结构中插入是一次性的代价,刚开始,不会像查找那样影响性能。
我想到了两种解决方案:
我可以为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] ]
。这样可以确保查找速度很快,但是我会:
data
的大小的增加,浪费了大量的内存……实际上,如果我们假设没有重叠,我将浪费data.size()
元素的总和。目前A
和B
只是double
,但是如果在任何时候我都需要将它们的类型更改为更大的值,那么...我假设使用O(1)查找的稀疏向量不存在,对吧?A[3]
,而3
并不是一个有趣的索引!我需要插入自己的检查开销,这可能会使查找不再那么快... 简而言之:我对属性A
和B
的数据结构感兴趣,以便我可以访问这些值[仅为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