在下面的代碼中,我有一些字符串(DNA序列) ,我將其存儲在一個向量中。我有一個struct
,read_tag
,我用它來識別每個字符串; read_tag.read_id
是字符串標識符。我將每個字符串取30個字符的子串,並將其用作unordered_multimap
中的一個鍵,其中read_tag
作爲值;目的是對共享30個字符序列的字符串進行分組。當然,相同的字符串會散列到相同的值,並最終在多地圖中的同一個桶中。偏移用於從30個字符標籤的索引零處給出「移位」。通過local_it迭代桶時unordered_multimap中的衝突
但是,當我運行此代碼時,遍歷每個存儲桶;我發現在同一個桶中有多個不同的序列。我認爲衝突在unordered_mutlimap
中解決,因此在一個桶中,它們應該只是一個鍵(字符串)。我明白碰撞可能發生,但我認爲鏈接,探測等在unordered_mutlimap
中實施。 您應該能夠運行並檢查輸出以查看我感到困惑的位置。
我也std::hash
每個關鍵,在一個桶中,我發現「碰撞」中的鍵具有不同的哈希值。
因此,就好像碰撞正在發生,導致差異值。鍵在同一個桶中,但相反,鍵會散列到不同的值。 他們是一種避免這種情況的方法,並根據桶中的鍵區分值? 或者我需要執行此操作嗎?
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <functional>
using namespace std;
int main() {
vector<string> reads;
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
struct read_tag{
unsigned int read_id; // unique string identifier
int offset; // shift of 30 character substring represented by tag
};
unordered_multimap<string, read_tag> mutation_grouper;
for(int read_id=0; read_id < reads.size(); read_id++) {
string read = reads[read_id];
for(int i=0; i < read.size()-30; i++) {
string sub_read = read.substr(i, 30);
read_tag next_tag;
pair<string, read_tag> key_val;
next_tag.read_id = read_id;
next_tag.offset = i;
key_val.first = sub_read;
key_val.second = next_tag;
mutation_grouper.insert(key_val);
}
}
cout << "mutation_grouper buckets" << endl;
std::hash<std::string> hash_er;
for(unsigned int bucket = 0; bucket < mutation_grouper.bucket_count(); bucket++) {
cout << "Bucket: " << bucket << endl;
for(auto local_it = mutation_grouper.begin(bucket);
local_it != mutation_grouper.end(bucket); ++local_it) {
cout << local_it->first << " : " << local_it->second.read_id
<< ", " << local_it->second.offset << ", " << endl;
cout << "hash value: " << local_it->first <<"::: " << hash_er(local_it->first) << endl;
}
cout << endl << endl;
}
}
如果你要求我們嘗試運行它,請確保代碼編譯的代碼。 – user38034
我沒有嗎?哪些錯誤? –
第二個for循環說'read.size()',但是沒有變量'read'(你的意思是'讀取'?)。你也可以在代碼中使用'.orientation'兩次,這是沒有定義的。由於'read.substr(i,30)'這一行,這兩個修復程序仍然會崩潰。 – user38034