我试图解决工作问题并且是新手程序员。我有三个文件,两个都是制表符分隔的。
File1有两个字段:* Marker_id *& 位置,此文件按位置(0-26)排序,然后Marker_id的顺序是另一个应用程序的结果,但不是按字母顺序排列.Marker_id的顺序很重要,因为我的目标是程序是找到一个起始Marker_id并计算它与结束标记之间的标记数。该文件包含近2,500,000个条目。
File2有一个字段* Marker_id *这与File1中使用的Marker_id相同,但此文件仅包含大约2,200,000个条目。此文件是"活动"的列表我的程序应该计算的标记或标记。
File3具有字段 position * starting_marker * 结束标记 * number_markers *和其他字段。我需要通过计算开始和结束之间的标记数来基本更新number_markers字段。
我已经有将file1读入
的代码vector< list<marker> >;
其中marker是结构:
struct MARKER{
string snp_id;
bool included;
MARKER(string temp_id) : snp_id(temp_id), included(false) { }
};
文件1中的位置(0-26)指定向量中用于存储标记的索引。我还成功更新了file3中的计数,其中包含start和stop之间的标记数。
但是,我无法实现将列表修剪为仅有&#34;活动标记的功能。&#34;我打算简单地做MARKER.included(true);对于file2中的条目,直到我意识到file2不包含位置,因此,我必须在每个向量索引处搜索每个列表。这是可能的,我只是觉得这么多条目会非常慢。
我试图想出替代方案,例如将密钥存储在Marker_id的地图中,但需要将Marker_id按原始顺序保留以进行计数,这让我感到非常震惊。
有没有人有任何建议?感谢。
更新(示例文件):
***File1***
Marker_id position
test_marker_1 1
test_marker_2 1
test_marker_3 1
test_marker_4 1
test_marker_5 1
test_marker_6 1
test_marker_7 1
test_marker_8 1
test_marker_9 1
***File2***
Marker_id C20020.Log R Ratio C20020.B Allele Freq
test_marker_1 0.0180 0.0010
test_marker_3 -0.0340 0.5000
test_marker_4 0.0500 0.0700
test_marker_5 0.0500 0.0700
test_marker_6 0.0500 0.0700
test_marker_7 0.0500 0.0700
test_marker_9 0.0500 0.0700
注意:test_marker_2和test_marker_8在文件2中被省略,因此不包括在计数中。
***File3***
position copy_num sampleID startMarker endMarker conf num_Markers
1 4 C20020 test_marker_1 test_marker_3 1774.967 0
1 3 C20020 test_marker_3 test_marker_5 17.967 0
1 0 C20020 test_marker_7 test_marker_9 107.967 0
***My desired output***
position copy_num sampleID startMarker endMarker conf num_Markers
1 4 C20020 test_marker_1 test_marker_3 1774.967 2
1 3 C20020 test_marker_3 test_marker_5 17.967 3
1 0 C20020 test_marker_7 test_marker_9 107.967 2
现在看来,除了我的计数在所有三个例子中都是3之外,我的一切都在运作,因为我不排除在file2中找不到的那些标记。
答案 0 :(得分:0)
我想到了几种方法。
您可以按标记ID(当然是临时副本)对文件1和2进行排序,然后可以轻松确定单个过程中文件1中但不在文件2中的标记。然后,您可以使用此“排除列表”来确定要在算法的其他部分中忽略的标记。根据你的数字,这将是~300,000个项目,可以插入哈希映射中以便快速查找。
当然,如果你有大量内存,你可以随时将文件2的全部放入哈希映射中,并以相同的方式使用它。
如果内存是一个真正的问题,但标记值是这样的,它们定义了一个完整的空间(例如数字1到1千万,或其他),标记可以映射到偏移,那么你可以创建一个位图整个空间,仅1表示活动的标记。同样,使用此位图排除那些要忽略的标记。
基本上,只要你可以对包含/排除测试进行定时检查,你就会笑。