与Rcpp的数字匹配

时间:2016-02-12 06:03:54

标签: c++ r vector rcpp

我正在尝试基于具有均匀分布的数值向量的匹配来执行方法。这些向量表示大整数,stoked(cpp11中可能的整数64)因此为double和0和power(5,20)之间的每个x值。 匹配函数将向量A确定向量A的元素xi的第一个位置。 根据两个不同的概念,我使用两种方法:

首先,已经实现的匹配方法基于对字符串向量非常有效的哈希表。 我将匹配函数与以下代码一起使用,因为模板描述了Rcppsugar

// [[Rcpp::export]]
IntegerVector Match(NumericVector A, NumericVector B) {  
    sugar::IndexHash<14> tab = wrap(A); 
    return tab.fill().lookup(B);
}

感谢fastmatch包,我使用了fmatch函数来提供最佳性能。

否则,我想到了二进制搜索过程,但这种方法需要排序巫婆是一个大问题。以下代码显示了所使用方法的原型。

// [[Rcpp::export]]
NumericVector sort_stl(NumericVector A) { 
    NumericVector tmp = clone(A);
    std::sort(tmp.begin(), tmp.end());
    return tmp;
}

// [[Rcpp::export]]
NumericVector BINmatch(NumericVector A, NumericVector B) {// A and B previously sorted 
    const int a = A.size(); const int b = B.size();
    int j = 0; int i = 0;
    NumericVector res(a,-1.0);// empty values are coding with -1;
    for (i = i; i < a; i++) {
        for (j = j; (j < b) & (B[j] <= A[i]); j++) {
            if (B[j] == A[i]) {
                res[i] = j;
                break;
            }
        }
    }
    return res;
}
  1. 如何针对这种情况执行哈希方法?
  2. 如何在排序前插入键值以恢复原始矢量中的位置xi
  3. 如何提高方法BINmatch的排序速度?

0 个答案:

没有答案