亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 10165 | 回復(fù): 13
打印 上一主題 下一主題

perl遞歸問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-05-13 21:28 |只看該作者 |倒序?yàn)g覽
本帖最后由 riverlee2008 于 2010-05-13 21:29 編輯

有個(gè)文件,兩列,第一列是子節(jié)點(diǎn),第二列表示父親幾點(diǎn),程序出來就是一個(gè)樹(有向無環(huán)圖,如下圖), 想做的事情是給定一個(gè)節(jié)點(diǎn),想找出它的所有子孫節(jié)點(diǎn), 程序已經(jīng)實(shí)現(xiàn),通過遞歸,對(duì)于樹中較底層的結(jié)點(diǎn),獲取子孫節(jié)點(diǎn)沒有問題, 但對(duì)于樹中較上層的節(jié)點(diǎn),遞歸出現(xiàn) Deep recursion on subroutine "main::findnodes",內(nèi)存飆到48G以上(本機(jī)內(nèi)存大小48G), 且遞歸次數(shù)超過140000000次多.

現(xiàn)將程序和數(shù)據(jù)文件附上,忘論壇內(nèi)高手指點(diǎn)指點(diǎn),或者給個(gè)別的思路(詳細(xì)程序數(shù)據(jù)見附件).

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. ###############################
  5. #usage
  6. #test1:  perl findoffspring.pl do_ontology_926.txt DOID:3211
  7. #test2:  perl findoffspring.pl do_ontology_926.txt DOID:4
  8. #test1 work fine, but test2 didnot work fine, where DOID:4 is the top node in the tree
  9. my($child2parentfile,$searchnode) = @ARGV;


  10. #child id 2 parent id
  11. #"do_id","parent_do_id"
  12. my %parent2child;
  13. my %doids;
  14. open(IN,$child2parentfile) or die $!;
  15. <IN>;#skip the header
  16. while(<IN>){
  17.         s/[\r\n"]//g;
  18.         my($c,$p) = split "\t";
  19.         $parent2child{$p}->{$c}=1;
  20.         $doids{$c}=1;
  21.         $doids{$p}=1;
  22. }       

  23. print "DO num:",scalar keys %doids,"\n";


  24. #######################################
  25. #構(gòu)建一個(gè)變量用來記錄其所有的offspring
  26. my $rr={};
  27. findnodes("DOID:4",\%parent2child,$rr);

  28. print join "\n",(keys %{$rr});

  29. #use recursion to find the offspring nodes
  30. #here  defined the variable to see how many time we call the findnodes
  31. my $count=0;
  32. sub findnodes{
  33.         my($search,$ref,$resultref)=@_;
  34.         $count++;
  35.         if($count % 20000 ==0){
  36.                 print "recursion:",$count,"\n";
  37.         }
  38.         if(exists($ref->{$search})){
  39.                 foreach my $node(keys %{$ref->{$search}}){
  40.                         $resultref->{$node}=1;
  41.                         findnodes($node,$ref,$resultref);
  42.                 }
  43.         }else{
  44.                 return $resultref;
  45.         }
  46. }

復(fù)制代碼

ask_help_CU.tar.bz2 (55.38 KB, 下載次數(shù): 75)


論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-05-13 21:41 |只看該作者
路過要回帖的啊~~

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-05-13 23:47 |只看該作者
我想樓主的程序本身應(yīng)該沒問題,而是因?yàn)閿?shù)據(jù)的問題,造成死循環(huán),大量消耗內(nèi)存,最終死機(jī)。

寫了段代碼,查出有重復(fù)數(shù)據(jù):DOID:833,DOID:833,duplicated
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my %p2c;
  5. my $child2parentfile = "do_ontology_926.txt";
  6. open(IN,$child2parentfile) or die $!;
  7. <IN>;#skip the header
  8. my @lines = <IN>;
  9. close IN;
  10. foreach(@lines){
  11.         s/[\r\n"]//g;
  12.         my($c,$p) = split "\t";
  13.         $p2c{$p}{$c}++;
  14. }

  15. foreach(@lines){
  16.         s/[\r\n"]//g;
  17.         my($c,$p) = split "\t";
  18.         if ($p2c{$p}{$c} > 1) { print "$c,$p,$p2c{$p}{$c}\n"; }
  19.         if ($p2c{$p}{$c} && $p2c{$c}{$p}) { print "$c,$p,duplicated\n"; }
  20. }

  21. <STDIN>;
復(fù)制代碼
刪除重復(fù)的錯(cuò)誤數(shù)據(jù),程序運(yùn)行正常!

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2010-05-14 00:01 |只看該作者
回復(fù) 3# iamlimeng

    多謝指出問題,我看看去,繼續(xù)關(guān)注~

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2010-05-14 00:29 |只看該作者
回復(fù) 3# iamlimeng


    驗(yàn)證完畢,多謝3樓道兄弟~

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2010-05-14 08:48 |只看該作者
能給出原文件的例子嗎?我也練習(xí)練習(xí)

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2010-05-14 09:08 |只看該作者
附件的 原文件下載后不對(duì)啦。請(qǐng)LZ傳一個(gè)原文件。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2010-05-14 09:14 |只看該作者
ok,好了,下載后改了后綴,哈哈

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2010-05-14 10:05 |只看該作者
路過 學(xué)習(xí)中。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2010-05-14 10:30 |只看該作者
<IN>;#skip the header??
作用:skip the header?

還有 lz 能否講講 sub findnodes 實(shí)現(xiàn)的說明,小弟不勝感激!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP