Perl 算法的迭代
我编写了一个程序,从一个2列文件中加载数据,进行算法计算,然后在文件中写入具有此系数的元素对,并将它们放入一个名为Perl 算法的迭代,perl,iteration,Perl,Iteration,我编写了一个程序,从一个2列文件中加载数据,进行算法计算,然后在文件中写入具有此系数的元素对,并将它们放入一个名为@blackPair的数组中。我想对算法进行N次迭代,从文件中获取数据,而不是@blackPair数组中的数据 我想到了这样的事情: #!/usr/bin/perl use strict; use warnings; use feature 'say'; my $iter; my $startNode; my $endNode; my %k; my %end; my %node;
@blackPair
的数组中。我想对算法进行N次迭代,从文件中获取数据,而不是@blackPair
数组中的数据
我想到了这样的事情:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my $iter;
my $startNode;
my $endNode;
my %k;
my %end;
my %node;
my %edge;
my @blackPair=();
my $counts=0;
my $inputfile = "file3";
################# DATA ABSORTION
open(DAT,$inputfile) || die("Could not open file!");
while(<DAT>)
{
my ($entry) = $_;
chomp($entry);
my ($startNode, $endNode) = split(/ /,$entry);
$k{$endNode}++;
$k{$startNode}++;
$edge{$startNode}{$endNode}=1;
$edge{$endNode}{$startNode}=1;
}
################# ALGORITHM
my $minCentrality=2;
foreach my $i (keys %edge) {
foreach my $j (keys %{$edge{$i}}){
my @couple =($j,$i);
if($i<$j){
if (($k{$i}-1) !=0 && ($k{$j}-1) !=0){
my $triangleCount=0;
@couple=($i,$j) if ($k{$i}<$k{$j});
foreach (keys %{$edge{$couple[0]}}){
$triangleCount++ if exists $edge{$couple[1]}{$_};
}
my $centrality=($triangleCount+1)/($k{$couple[0]}-1);
if ($centrality<$minCentrality){
$minCentrality=$centrality;
@blackPair=@couple;
}
}
}
}
}
foreach (@blackPair){
say;
}
Close(DAT);
出现在@blackPair
中的第一对是6和1。找到它们后,我希望程序重新启动搜索,但避免将1对和6对充入阵列。这样做,第二对将是6和16。我想重复这个过程N次(例如N=4)。我想在“数据吸收”中的while()
前面放一个while(counts!=@blackPair
绝对不是你想要的
!=
用于数字比较。您可以进行字符串比较(使用ne
运算符),也可以使用智能匹配运算符检查列表成员身份(~~\@blackPair
)
- 但是使用正确的运算符并不能真正帮助您,因为
@blackPair
已经损坏了输入数据(@blackPair
可能包含元素(6,1)
,对应于原始输入行“16\n”
)
相反,在每次迭代中更新图形如何
for my $count (1..4) {
my $minCentrality = 2;
...
say join " ", @blackPair;
# now update the graph
delete $edge{$blackPair[0]}{$blackPair[1]};
delete $edge{$blackPair[1]}{$blackPair[0]};
$k{$blackPair[0]}--;
$k{$blackPair[1]}--;
} # next iteration
我应该把say join”“@blackPair;
代码行放在我的代码中的什么地方呢?我想用它来代替你说的foreach(@blackPair){say}
while(counts <= 4) {
while(<DAT>)
{
if(<DAT> != @blackPair){
my ($entry) = $_;
chomp($entry);
.....
}
#### ALGORITHM
counts++;
}
6 1
16 6
9 1
9 5
for my $count (1..4) {
my $minCentrality = 2;
...
say join " ", @blackPair;
# now update the graph
delete $edge{$blackPair[0]}{$blackPair[1]};
delete $edge{$blackPair[1]}{$blackPair[0]};
$k{$blackPair[0]}--;
$k{$blackPair[1]}--;
} # next iteration