首页 > 解决方案 > Perl 中的模式函数

问题描述

我需要在 Perl 中创建模式函数的帮助。我使用来自不同来源的帮助编写了一个代码,但每次值都不同。模式 - 数组中元素出现的最大频率

当前代码 -

@array = <STDIN>;
@sorted = sort { $a <=> $b } @array ;
for $i(@sorted)
{
    $cnt =0;
    for $j(@sorted)
    {
        if($i eq $j)
        {
            $cnt = $cnt + 1;
            $data{$i}= $cnt;
        }
    }
}
@modes = sort { $data{$a} <=> $data{$b} } keys %data;
$mode = $modes[-1];

标签: perl

解决方案


清理了缩进并添加了use strictand use warnings,我得到了以下代码。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my @array = <STDIN>;
my @sorted = sort { $a <=> $b } @array ;

my %data;

for my $i (@sorted) {
  my $cnt = 0;
  for my $j (@sorted) {
    if ($i eq $j) {
      $cnt = $cnt + 1;
      $data{$i}= $cnt;
    }
  }
}

my @modes = sort { $data{$a} <=> $data{$b} } keys %data;

say "The mode is: $modes[-1]";

这似乎工作正常。所以,也许,你需要更详细地解释这个问题。

更新:好的,所以我想我现在明白了你的问题——即使你真的没有说得很清楚。

如果该模式有两个潜在值(即出现相同次数的两个数字),那么您需要最小的一个。您当前的解决方案会随机选择其中一个潜在值。

问题是这一行:

@modes = sort { $data{$a} <=> $data{$b} } keys %data;

这会按值出现的次数对哈希进行排序。但是,如果多个值出现相同的次数,它们可以以任何顺序出现 - 所以你会得到一个看似随机的数字。

解决方案是为排序添加更多智能,以便在出现平局的情况下,较小的键排序最后。看起来像这样:

my @modes = sort {
              $data{$a} <=> $data{$b}
              or
              $b        <=> $a
            } keys %data;

推荐阅读