0

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

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

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

File3 具有字段位置*starting_marker*结束标记*number_markers* 和其他字段。我需要通过计算开始和结束之间的标记数来更新 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 保持在原始计数顺序中,这让我束手无策。

有人有建议吗?谢谢。

更新(示例文件):

***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_marker_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 之外,我的所有功能都正常运行,因为我不排除那些在 file2 中找不到的标记。

4

1 回答 1

0

我想到了几种方法。

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

当然,如果你有大量的内存,你总是可以把所有的文件 2 放入一个哈希映射中,并以同样的方式使用它。

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

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

于 2014-02-04T09:40:39.603 回答