-5
我從事DNA K-mers計數工作,並準備使用完美散列表來計算這個公式:link。 我用RCPP API(C++)的代碼集成到R:k-mer使用完美散列法計入R
#include <Rcpp.h>
using namespace Rcpp;
/*
this code can be used with c++ by replacing IntegerVector by std::vector<int>
*/
//************************************************
inline const short int V (const char x){
switch(x){
case 'A':case 'a':
return 0;
break;
case 'C':case 'c':
return 1;
break;
case 'G':case 'g':
return 2;
break;
default:
return 3;
break;
}
}
inline unsigned int X0(const std::string A,const int k ,const int n){
unsigned int result=0;
int j=k;
for(int i=n-1;i>n-k-1;i--) {
result+= pow(4,k-j)*V(A[i]);
j--;
}
return result;
}
// [[Rcpp::export]]
inline IntegerVector kmer4(const std::string A,const int n,const int k)
{
IntegerVector P(pow(4,k));
int x=X0(A,k,n);
P[x]++;
const int N=pow(4,k-1);
for(int i=n-k-1;i>-1;i--){
x=N*V(A[i])+x/4-x%4/4;
P[x]++;
}
return P;
}
有兩個問題:
假設k聚體的索引x,x的稱讚然後(4^K)-x-1。我們可以使用像上述公式那樣的數字操作來獲得反向嗎?
運行時間有兩個問題:對字符串和矢量創建進行迭代,其中k超過8。 有沒有想法來解決這些問題?
首先,我使用的內置代碼因爲k聚體計算始終是一個先前操作到其他功能的其他任務 –
與問題** X **是找到使用x.The反向k鏈節索引反向恭維是這樣的,簡單地計算 –
@MACHERKIME,所以你對第2點的意思是:字符串是否應該已經轉換成整數/雙精度向量。把它寫成一個內聯計算在我看來是浪費的。 **對於第1點:**從散列回到標準的轉換我認爲現在我有時間坐下來查看最初鏈接的文檔有點問題。在這種情況下,您創建的散列是完全的,而不是一個將一個基因表達式唯一映射到基數的雙射函數。 – coatless