【发布时间】:2010-07-23 20:41:17
【问题描述】:
我有一个包含大约 130,000 个元素的散列,我正在尝试检查该散列中的所有组合(130,000 x 130,000 个组合)。我的代码如下所示:
foreach $key1 (keys %CNV)
{
foreach $key2 (keys %CNV)
{
if (blablabla){do something that doesn't take as long}
}
}
如您所料,这需要很长时间才能运行。有谁知道更快的方法来做到这一点?非常感谢提前!
-阿卜杜勒
编辑:blablabla 的更新。
大家好,感谢所有反馈!真的很感激。我将 foreach 语句更改为:
for ($j=1;$j<=24;++$j)
{
foreach $key1 (keys %{$CNV{$j}})
{
foreach $key2 (keys %{$CNV{$j}})
{
if (blablabla){do something}
}
}
}
哈希现在是多维的:
$CNV{chromosome}{$start,$end}
我会根据要求详细说明我到底想要做什么。
blablabla 如下:
if ( (($CNVstart{$j}{$key1} >= $CNVstart{$j}{$key2}) && ($CNVstart{$j}{$key1} <= $CNVend{$j}{$key2})) ||
(($CNVend{$j}{$key1} >= $CNVstart{$j}{$key2}) && ($CNVend{$j}{$key1} <= $CNVend{$j}{$key2})) ||
(($CNVstart{$j}{$key2} >= $CNVstart{$j}{$key1}) && ($CNVstart{$j}{$key2} <= $CNVend{$j}{$key1})) ||
(($CNVend{$j}{$key2} >= $CNVstart{$j}{$key1}) && ($CNVend{$j}{$key2} <= $CNVend{$j}{$key1}))
)
简而言之:散列元素代表 DNA 的特定部分(所谓的“CNV”,现在将其视为基因),具有开始和结束(它们是表示它们在特定位置的整数)染色体,存储在具有相同键的哈希中:%CNVstart & %CNVend)。我正在尝试检查 CNV 的每个组合是否重叠。如果一个家庭中有两个重叠的元素(我的意思是一个我拥有并读入其 DNA 的人的家庭;在 foreach 语句中还有一个 for 语句,让程序为每个家庭检查这个,这使得它持续更长时间),我检查它们是否也具有相同的“副本号”(存储在具有相同键的另一个哈希中)并打印出结果。
感谢大家的宝贵时间!
【问题讨论】:
-
您将不得不告诉我们您实际想要完成的任务,而不是您当前尝试完成的方式。您目前所问的内容等同于“我怎样才能更快地进行 16,900,000,000 次计算?”
-
只要您不提供更多细节,我们只能推荐一般的加速技术。我想到的一些:a)从 perl 切换到 Java、C++、Assembler b)并行化任务 c)升级你的硬件
-
@Abdel,这很重要。正如彼得所说,要么告诉我们你在做什么,要么我们无能为力。
-
您问错了问题:如何更快地检查 N*N 组合?您应该问的问题——以及一位测试员的评论隐含地提出——是是否有可能避免进行所有这些检查。我的第一个猜测是您的较大算法、数据结构或两者都有缺陷。我们需要更多信息来帮助解决这个问题。
-
-1 拒绝帮助那些试图为你寻找答案的人。可能可以避免这 16,900,000,000 次查找中的一些(或实际上大部分),但您并不清楚是否确实如此,或者您是否只是询问是否有更快的方法来索引散列。可能可以反转你的循环,或者添加一些短路,但你对那些试图找出答案的人来说是咄咄逼人的。