このコードは、A、C、T、Gのみを使用してランダムな16文字の文字列を生成します。次に、このシーケンスがハッシュ(unordered_map)にあるかどうかを確認し、含まれていない場合は、それを挿入してダミーのプレースホルダーを指します。
現在の形式では、ACTGに4 ^ 16の文字列があるにもかかわらず、「foriループ」が20000回の反復を必要とする場合、datact=16384でハングします。
しかし..文字列の長さが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;
}