如何到达内部向量可能具有不同长度的向量向量的第 N 个元素?
Posted
技术标签:
【中文标题】如何到达内部向量可能具有不同长度的向量向量的第 N 个元素?【英文标题】:How to get to the Nth element of a vector of vectors where inner vectors might have different lengths? 【发布时间】:2015-08-25 14:32:17 【问题描述】:假设我们有一张桌子:
std::vector< std::vector<int> > table(3, std::vector<int>)
看起来像这样:
11 21 31 41 45 51 61
71 81 91 10 19 29
39 49 59 69 79 89 99 109
我们得到了一个介于 1 和 N 之间的 int nThPos
数字,即 table
中的元素总数(此处为 21)。
在表格中查找与元素#nThPos
或其坐标 ([row][col]) 对应的元素的最有效方法是什么?
对于这种特殊情况,表格展平的方向无关紧要:如果nThPos == 8
,结果可能是 71(即 [1][0])或 91(即 [1][2] )。
请注意:我的问题与this one 非常相似。但我的情况是内部向量有不同的长度。
【问题讨论】:
如果表是常量,那么您可以将表存储为vector如果您不选择维护一些辅助数据(或选择完全不同的基本表示),那么没有比显而易见的方法更有效的方法(迭代外部向量,累积内部向量的总大小,直到达到右内向量)。
如果效率很重要,请以不同的方式存储您的数据。
【讨论】:
我的问题是,大多数时候,我将使用表格来选择给定行中的元素,而不是整个表格中的任何元素。我想不出一种更有效的方式来存储我的数据以供两者使用。 当你写“side data”时,你到底是什么意思?将内部向量的长度存储在另一个向量中? 如果效率对不太常见的情况无关紧要,那就做显而易见的事情。如果效率对所有情况都很重要,那么有更复杂的方法来存储数据,这些方法在“整体”查找中获得主要效率,而在其他查找中损失很少。如果尺寸变化很少,那么其他表示对于任何查找都具有很高的效率,当尺寸变化时会丢失大量时间。您需要将效率视为所有可能操作的折衷方案。 @Prolix “散列”到正确的向量更快。该哈希表可以是另一个包含每个向量的起始偏移量的向量。 最明显(不一定是最好的)“辅助数据”将是所有早期内部向量的大小的总和,因此您可以二进制搜索而不是线性搜索。对于更便宜的查找来说,这对于大小更改来说是昂贵的。【参考方案2】:这是一个简单的实现,似乎只是完成工作:
std::array<size_t,2> give_coord(size_t idx, const std::vector<std::vector<int>>& v)
std::vector<size_t> sizes(v.size());
size_t n0;
std::generate(sizes.begin(),sizes.end(),[v,&n] return v[n++].size(); ); // store the different dimensions
size_t sumsizes[0], i1, ridx;
while(idx >= sum)
r -= sizes[i-1];
sum += sizes[i++];
return std::array<size_t,2>i-1,r;
Live On Coliru
请注意,我认为索引从0
开始,因此7
代表关于OP 问题的nThPos = 8
。
如果您需要其他答案和 cmets 中所说的性能,我不会推荐它。
【讨论】:
以上是关于如何到达内部向量可能具有不同长度的向量向量的第 N 个元素?的主要内容,如果未能解决你的问题,请参考以下文章