是向量&lt; list <marker>&gt;正确的方法吗?</marker>

时间:2013-02-20 15:18:12

标签: c++ c++11

我试图解决工作问题并且是新手程序员。我有三个文件,两个都是制表符分隔的。

File1有两个字段:* Marker_id *&amp; 位置,此文件按位置(0-26)排序,然后Marker_id的顺序是另一个应用程序的结果,但不是按字母顺序排列.Marker_id的顺序很重要,因为我的目标是程序是找到一个起始Marker_id并计算它与结束标记之间的标记数。该文件包含近2,500,000个条目。

File2有一个字段* Marker_id *这与File1中使用的Marker_id相同,但此文件仅包含大约2,200,000个条目。此文件是&#34;活动&#34;的列表我的程序应该计算的标记或标记。

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中找不到的那些标记。

1 个答案:

答案 0 :(得分:0)

我想到了几种方法。

您可以按标记ID(当然是临时副本)对文件1和2进行排序,然后可以轻松确定单个过程中文件1中但不在文件2中的标记。然后,您可以使用此“排除列表”来确定要在算法的其他部分中忽略的标记。根据你的数字,这将是~300,000个项目,可以插入哈希映射中以便快速查找。

当然,如果你有大量内存,你可以随时将文件2的全部放入哈希映射中,并以相同的方式使用它。

如果内存是一个真正的问题,但标记值是这样的,它们定义了一个完整的空间(例如数字1到1千万,或其他),标记可以映射到偏移,那么你可以创建一个位图整个空间,仅1表示活动的标记。同样,使用此位图排除那些要忽略的标记。

基本上,只要你可以对包含/排除测试进行定时检查,你就会笑。