搜索多个向量

时间:2013-09-06 23:15:16

标签: c++

我有4个载体,现在各有约45,000条记录。寻找一种有效的方法来运行这4个向量并输出它与用户输入匹配的次数。数据需要匹配每个向量的相同索引。

多个for循环?矢量找?

谢谢!

4 个答案:

答案 0 :(得分:1)

如果元素需要在同一位置匹配,那么std::find()std::find_if()与位置上其他向量的检查相结合似乎是一种合理的方法:

std::vector<A> a(...);
std::vector<B> b(...);
std::vector<C> c(...);
std::vector<D> d(...);

std::size_t match(0);
for (auto it = a.begin(), end = a.end(); it != end; ) {
    it = std::find_if(it, end, conditionA));
    if (it != end) {
        if (conditionB[it - a.begin()]
         && conditionC[it - a.begin()]
         && conditionD[it - a.begin()]) {
            ++match;
        }
        ++it;
    }
}

答案 1 :(得分:1)

我从描述中得到的是,你有4个向量和大量的用户数据,你需要找出它与同一索引的向量匹配的次数 所以这里是代码(我正在编写c ++ 4.3.2代码)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    vector<typeT>a;  
    vector<typeT>b;
    vector<typeT>c;
    vector<typeT>d;
    vector<typeT>matched;
    /*i am assuming you have initialized a,b,c and d;
    now we are going to do pre-calculation for matching user data and store
    that in vector matched */
    int minsize=min(a.size(),b.size(),c.size(),d.size());
    for(int i=0;i<minsize;i++)
    {
        if(a[i]==b[i]&&b[i]==c[i]&&c[i]==d[i])matched.push_back(a[i]);
    }
    return 0;
}
这是预先计算的部分。现在接下来依赖于您正在使用的数据类型,使用二进制搜索进行一点点额外计数或使用更好的数据结构存储一对(值,重复)然后应用二进制搜索。 时间复杂度为O(n + n * log(n)+ m * log(n))其中n是代码中的minsize,m是用户输入的数量

答案 2 :(得分:0)

老实说,我会有几种方法来维护你的数据库(向量)。

基本上,做一个QuickSort开始。

然后经常一直运行insertion sort(对部分排序的列表更快,然后是QuickSort)

然后在这些向量上运行binary search


编辑:

我认为更好的方法是存储它,而不是每个条目使用多个向量。有一个存储所有值的类向量。 (您当前的向量)

class entry { 

public: 
      variable data1;
      variable data2;
      variable data3;
      variable data4;
}

将其制作成单个载体。然后使用我上面描述的方法对这些向量进行排序。

您必须先按照哪种类型的数据进行排序。然后在对该数据进行二进制搜索之后。

答案 3 :(得分:0)

您可以在std::unordered_multimap中为O(n)的向量创建一个查找表。然后,您可以使用unordered_multimap::count()获取项目在向量中显示的次数,并使用unordered_multimap::equal_range()获取向量中项目的索引。

std::vector<std::string> a = {"ab", "ba", "ca", "ab", "bc", "ba"};
std::vector<std::string> b = {"fg", "fg", "ba", "eg", "gf", "ge"};
std::vector<std::string> c = {"pq", "qa", "ba", "fg", "de", "gf"};

std::unordered_multimap<std::string,int> lookup_table;

for (int i = 0; i < a.size(); i++) {
    lookup_table.insert(std::make_pair(a[i], i));
    lookup_table.insert(std::make_pair(b[i], i));
    lookup_table.insert(std::make_pair(c[i], i));
}

// count
std::string userinput;
std::cin >> userinput;
int count = lookup_table.count(userinput);
std::cout << userinput << " shows up " << count << " times" << std::endl;

// print all the places where the key shows up
auto range = lookup_table.equal_range(userinput);
for (auto it = range.first; it != range.second; it++) {
    int ind = it->second;
    std::cout << " " << it->second << " " 
        << a[ind] << " " 
        << b[ind] << " " 
        << c[ind] << std::endl;
}

如果您要在查找表中搜索许多项目,这将是最有效的。如果您只需要搜索一次,那么DietmarKühl的方法将是最有效的。