我的数据集包含数千个值,如下所示:
1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6
数据的属性:
1)从1开始,这些值是连续的整数。
2)每个值的数量并不总是相同。
目标:
查找向量中每个值的最小和最大索引。预期结果应为:
minimum index: [0, 3,5,9,14,16]
maximum index: [2, 4,8,13,15,20]
有人可以给我一个简单的解决方案吗? 感谢
答案 0 :(得分:0)
以下是您的问题的伪代码:
1.创建map<int,pair<int,int>
的地图。键是来自向量的值,键的对应值是起始索引和结束索引。
2.对于向量中的每个键,检查对的第一个值是否存在。
IF yes:
then update the second value with current index.
else
update the first value with current index.
3.最后遍历所有键值对。
现在,您可以直接访问任何密钥的开头和结尾。
答案 1 :(得分:0)
@cauchy:对的地图会比它需要的更慢,更复杂。将结果转储到stdout实际上需要比简单解决方案更多的行:
// assuming compiler doesn't support initialization lists for std::vector:
int ai[] = { 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7 };
std::vector<int> values(ai, ai+(sizeof(ai)/sizeof(ai[0])));
std::vector<int> boundaries;
int prevValue = values[0] - 1;
for (size_t i = 0; i < values.size(); i++){
if (prevValue != values[i]){
boundaries.push_back(i);
prevValue = values[i];
}
}
// show lower boundaries
std::cout << "[" ;
for (size_t i = 0; i < boundaries.size(); i++){
std::cout << " " << boundaries[i];
}
std::cout << "]" << std::endl;
// show upper boundaries
std::cout << "[" ;
for (size_t i = 1; i < boundaries.size(); i++){
std::cout << " " << boundaries[i] - 1;
}
std::cout << " " << values.size() - 1;
std::cout << " ]" << std::endl;
注意,我们只需要每个值数组元素 VA [n] 的下边界索引 LB [i] ,因为上边界 UB [i] VA [n] 将始终为 LB [i + 1] - 1 ,但 UB [last] 除外根据定义, VA 的最大有效索引。