从vector1给出一个元素,快速从vector2中获取一个元素

时间:2013-10-28 11:39:47

标签: c++ vector

我有两个向量vector<DataPoint> datavector<string> labels,其中DataPoint只是float的向量:typedef vector<float> DataPoint。每个数据点data[i]都有其关联的标签labels[i]

有没有办法快速获取给定数据点x的标签?像string getLabel(DataPoint x){..}这样的东西很快。

3 个答案:

答案 0 :(得分:2)

如果您的DataPoint向量是data,那么您希望在O(log(n))中找到data索引的最佳O(n)复杂度(使用二进制搜索)排序。否则,这是vector<LabeledDataPoints>中的线性搜索。

问题的关键在于你有两个包含相关数据的向量,这总是很难管理(以及强烈的糟糕设计暗示)。最好使用DataPoint替换两个向量(具有两个成员的结构:string和{{1}})。

答案 1 :(得分:0)

一些注意事项:您可以使用std::sort()对矢量进行排序,并使用std::binary_search()搜索预先排序的矢量,std::unordered_map是C ++ 11哈希表,{{1是一个二叉树,您可以使用O(log2N)查找,插入和擦除进行插入时排序。谷歌中的任何一个用于文档。

使用现有的数据结构,如果dataPoint是预先排序的,那么你有O(log2N),其中N是dataPoint.size(),并假设平均不等dataPoints比较只需比较第一个浮点数或2 。未分类,是O(N)。

显然,在知道公共索引之后,性能问题不必查看标签 - 它只是找出该索引是什么,给定std::map向量之外的dataPoint对象。

如果不希望排序或O(log2N)仍然太慢,您可以考虑将dataPoints放入带有标签的哈希表中。

在不太可能的情况下,性能问题只是由于你的dataPoints经常以相同的浮点数序列开始,那么(假设没有像从向量的背面到前面的比较那样的简单解决方案)你可以创建一些首先进行比较的哈希或元素之和,只有在已经知道相等的情况下才进行浮点浮动比较。

答案 2 :(得分:0)

旧答案(它是关于轻松获取值(DataPoint实例)):


为什么不使用地图,使用标签作为键,使用DataPoint作为值(地图)?通过这种方式,您将关联数据,并且根据地图类型,您可以对复杂性进行区分(使用地图,将具有查找复杂度O(logn),而散列图将具有预期的O(1)和O(n)最坏的情况)。使用对您有用的东西。 有关地图及其复杂性的更多信息,请查看此处:multiset, map and hash map complexity


更新:

要获取每个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),在实例化时设置标签并使用带有O的getter方法获取它( 1)复杂性。 正如您所看到的,您的问题需要采用不同的方式,并且有一些方法可以实现。

相关问题