此代码仅使用 A、C、T、G 生成一个随机的 16 个字符的字符串。然后它检查这个序列是否在散列(unordered_map)中,如果没有,则插入它并指向一个虚拟占位符。
在其当前形式中,当“for i 循环”需要 20000 次迭代时,它会挂在 datact=16384 处,尽管 ACTG 有 4^16 个字符串。
但是.. 如果字符串长度更改为 8、9、10、11.. 到 15 或 17、18.. 它正确地迭代到 20000。为什么 unordered_map 拒绝散列新序列,但只有当这些序列是 16长字符?
#include <string>
#include <vector>
#include <unordered_map>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
string funnelstring;
srand ( time(NULL) );
const int buffersize=10000;
int currentsize=buffersize;
int datact=0;
vector <unsigned int> ctarr(buffersize);
vector <char> nuc(4);
nuc[0]='A';
nuc[1]='C';
nuc[2]='T';
nuc[3]='G';
unordered_map <string,unsigned int*> location;
unsigned int sct;
sct=1;
for (int i=0;i<20000; i++)
{
do
{
funnelstring="";
for (int i=0; i<16; i++)
{ // generate random 16 nucleotide sequence
funnelstring+=nuc[(rand() % 4)];
}
} while (location.find(funnelstring) != location.end()); //asks whether this key has been assigned
ctarr[datact]=sct;
location[funnelstring]=&ctarr[datact]; //assign current key to point to data count
datact++;
cout << datact << endl;
if (datact>=currentsize)
{
ctarr.resize(currentsize+buffersize);
currentsize+=buffersize;
}
}
return 0;
}