矢量<列表>解决这个问题的正确<marker>方法吗?

is vector < list <marker> > the right way to approach this?

本文关键字:gt lt marker 方法 解决 列表 矢量 问题      更新时间:2023-10-16

我正在努力解决工作中的一个问题,并且是一名新手程序员。我有三个文件,都用制表符分隔。

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

File2有一个字段*Marker_id*这与File1中使用的Marker_id相同,但该文件仅包含约220000个条目。这个文件是一个"活动"标记或标记的列表,应该由我的程序计数。

File3具有字段位置*starting_marker*结束标记*数字标记*和其他字段。我基本上需要通过计算开始和结束之间的标记数量来更新number_markers字段。

我已经有了将file1读取到中的代码

vector< list<marker> >;

其中标记是一个结构:

struct MARKER{
 string snp_id;
 bool included;
 MARKER(string temp_id) : snp_id(temp_id), included(false) { }
};

文件一中的位置(0-26)指定了在矢量中存储标记的索引。我还成功地用开始和停止之间的标记数更新了file3中的计数。

然而,我在实现一个将列表修剪为仅"活动标记"的函数时遇到了问题。我本来打算简单地执行MARKER.included(true);对于file2中的条目,直到我意识到file2不包含位置,否则,我必须在每个向量索引处搜索每个列表。这是可能的,我只是觉得有这么多条目会非常慢。

我正在考虑其他选择,比如将file1存储在一个密钥为Marker_id的映射中,但需要将Marker_id按原始顺序进行计数,这让我很头疼。

有人有什么建议吗?谢谢

UPDATE(示例文件):

***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

注意:文件2中省略了test_marker_2和test_marke_8,因此不会包含在计数中。

***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之外,因为我不排除文件2中没有的标记。

脑海中浮现出几种方法。

您可以按标记id(当然是临时副本)对文件1和2进行排序,然后可以轻松地确定文件1中但不在文件2中的标记。然后,您可以使用此"排除列表"来确定在算法的其他部分中要忽略的标记。根据你的数字,这将是大约300000个项目,可以插入哈希图中进行快速查找。

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

如果内存是一个真正的问题,但标记值定义了一个完整的空间(例如数字1到1000万,或者其他什么),标记可以映射到偏移,那么你可以创建整个空间的位图,其中1只用于活动的标记。再次使用此位图排除那些要忽略的标记。

基本上,只要你能对包含/排除测试进行持续的时间检查,你就会笑。