我正在寻找一种有效的算法来从固定字母表上的给定序列中提取给定长度的所有子序列(比如说它的 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]].
提前感谢您的建议。