快速从 vector2 获取一个元素,给定一个来自 vector1 的元素
Quickly get an element from vector2 given an element from vector1
我有两个向量vector<DataPoint> data
和vector<string> labels
其中DataPoint
只是浮点数的向量:typedef vector<float> DataPoint
。每个数据点data[i]
都有其关联的标签labels[i]
。
有没有办法快速获取给定数据点x
标签?像string getLabel(DataPoint x){..}
这样的东西很快。
的data
向量是排序的,你最好能找到data
O(log(n))
DataPoint
索引的复杂度(使用二叉搜索)。否则,这是O(n)
中的线性搜索。
问题的症结在于你有两个包含相关数据的向量,这总是一个管理起来很痛苦的(并且强烈暗示了糟糕的设计)。最好用vector<LabeledDataPoints>
(具有两个成员的结构:DataPoint
和string
)替换两个向量。
一些注意事项:您可以使用 std::sort()
对向量进行排序,并使用 std::binary_search()
搜索预排序向量,std::unordered_map
是 C++11 哈希表,std::map
是二叉树,您可以使用 O(log2N) 查找、插入和擦除进行插入时排序。 谷歌他们中的任何一个文档。
使用您现有的数据结构,如果 dataPoint 是预排序的,那么您就有 O(log2N),其中 N 是 dataPoint.size(),并且假设平均不相等的数据点比较只需要比较第一个或两个浮点数。 未排序,它是 O(N)。
显然,性能问题不是在已知公共索引后查看标签 - 它只是在给定data
向量之外的 dataPoint 对象的情况下找出该索引是什么。
如果排序不可取或 O(log2N) 仍然太慢,则可以考虑将数据点放入带有其标签的哈希表中。
在不太可能的情况下,性能问题只是由于您的数据点定期以相同的前导浮点序列开始,那么(假设没有像从矢量背面到前面比较这样的微不足道的解决方案)您可以创建某种哈希或元素的总和来比较首先,只有在已知相等的情况下才进行逐个浮点比较。
旧答案(它是关于轻松获取值(数据点实例):
为什么不使用地图,使用标签作为键,使用数据点作为值(映射)?通过这种方式,您将拥有关联的数据,并且根据地图类型进行区分,您可以区分复杂性(使用地图,将具有查找复杂度O(logn),而哈希图将具有O(1)预期和O(n)最坏情况)。更好地使用适合您的方法。有关映射及其复杂性的更多信息,请看这里:多集、映射和哈希映射复杂性
更新:
若要获取每个 DataPoint 的标签,一个想法是创建一个单独的类(例如 DataContainer),该类包含 DataPoint 实例的向量作为私有成员,以及一个字符串,其中包含具有适当 setter/getter 的标签。
class DataContainer{
private:
DataPoint mDataPoint;
string mLabel;
public:
DataContainer(DataPoint dataPoint,string label):
mDataPoint(dataPoint), mLabel(label){}
void setDataPoint(DataPoint dataPoint){
mDataPoint = dataPoint;
}
void setLabel(string label){
mLabel = label;
}
DataPoint getDataPoint(){
return mDataPoint;
}
//This getter does the job, with O(1) complexity.
string getLabel(){
return mLabel;
}
}
这样,您可以将 DataContainer 放在您想要的任何结构中(在您想要类似地获取键的情况下,我建议 map:map),在实例化时设置标签并使用具有 O(1) 复杂性的 getter 方法获取它。如您所见,您的问题需要以不同的方式处理,并且有一些方法可以做到这一点。
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素