Функция режима в Perl - PullRequest
       2

Функция режима в Perl

0 голосов
/ 26 сентября 2019

Мне нужна помощь с созданием функции режима в Perl.Я написал код с помощью справки из разных источников, но каждый раз значение отличается.Режим - максимальная частота вхождения элемента в массив

1002 * Текущий код -
@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];

1 Ответ

1 голос
/ 26 сентября 2019

Очистив отступы и добавив use strict и 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...