矢量<列表>解决这个问题的正确<marker>方法吗?
is vector < list <marker> > the right way to approach this?
我正在努力解决工作中的一个问题,并且是一名新手程序员。我有三个文件,都用制表符分隔。
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只用于活动的标记。再次使用此位图排除那些要忽略的标记。
基本上,只要你能对包含/排除测试进行持续的时间检查,你就会笑。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中