特定のシーケンスから特定の長さのすべてのサブシーケンスを固定アルファベット (0、1、2、3 としましょう) で抽出し、どのサブシーケンスが読み取られ、どのサブシーケンスが読み取られないかを抽出する効率的なアルゴリズムを探しています。
したがって、シーケンスの場合
[0,1,3,2,4,3,1]
取得したいサブシーケンスの長さ 2
[[0,1],[1,3],[3,2],[2,4],[4,3],[3,1],
およびブール配列
00 01 02 03 10 11 12 13 20 21 22 23 30 31 32 33
[ 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0].
私の現在のアプローチは次のようなものです:
size_t alphSize = 4;
size_t subSeqLength = 2;
std::deque<size_t> currSub;
std::vector<bool> subSeqRead ( pow( alphSize , subSeqLength ) );
for (size_t i = 0; i < seqLength - subSeqLength + 1; ++i)
{
for (size_t j = 0; j < subSeqLength; ++j)
{
currSub.pop_front();
currSub.push_back(sequence[i+j]);
}
if (currSub.size() == subSeqLength)
{
subSeqRead[ arrayPos(currSub) ] = true;
}
}
どこ
arrayPos(currSub)
ヒープ ツリー構造で動作し、乗算なしでブール配列内のサブシーケンスの位置を計算します。
ただし、これはどこかに近い
O( seqLength * subSeqLength )
誰かが何かをより速く知っていますか?
私のシナリオでは、アルファベットのサイズは実際には 4 で、サブシーケンスの長さは >=6 で、シーケンスの長さは 10^4 から 10^6 です。そして、それらのシーケンスの多くを処理する必要があります。
そこから、入力シーケンスにワイルドカードの数字が含まれている可能性があります (「w」としましょう)。
[1,w,2]
私はこれを読んだかのように扱わなければならない
[[1,0],[1,1],[1,2],[1,3],[2,0],[2,1],[2,2],[2,3]].
提案をよろしくお願いします。