Sto cercando di cercare serie di numeri all'interno di un array di numeri interi. Ad esempio, se la matrice è costituito dai numeri 1,2,3,10,12,14
, si potrebbe riassumere perPerl: estrai serie di numeri con offset dall'array
1 a 3 con compensazione 1,
10 a 14 con correzione 2
Questi mio codice, dove un ciclo su la matrice dal secondo elemento, tiene lo sfasamento tra elementi dell'array consecutivi e creare un nuovo 'serie' se i cambiamenti di offset:
use strict;
use warnings;
my @numbers = (1,2,3,10,12,14); #array to extract series from
my $last_diff;
my $start = $numbers[0];
my $end;
my @all_series; #array will hold all information on series
for my $i (1..($#numbers+1)){
my $diff;
if ($i <($#numbers+1)){
$diff = $numbers[$i] - $numbers[$i-1];
}
if (!$diff || ($last_diff && ($last_diff != $diff))) {
$end = $numbers[$i-1];
my $series = { 'start'=> $start,
'end' => $end,
'offset'=> $start == $end ? 1 : $last_diff,
};
push @all_series, $series;
$start = $numbers[$i];
}
$last_diff = $diff;
}
use Data::Dumper;
print Dumper(@all_series);
uscita appare come segue:
Questo non è il risultato desiderato, poiché le ultime due serie potrebbero essere riassunte in una (da 10 a 14, offset 2 invece di due serie).
Il difetto nell'algoritmo è indipendente da perl, tuttavia, forse qualcuno potrebbe darmi un suggerimento su come avvicinarsi al meglio, forse esistono alcuni trucchi specifici perl per questo.
Nella mia applicazione, tutti gli interi dell'array sono in ordine crescente e non esistono numeri duplicati.
EDIT Se singoli numeri verificano che non può essere assignet un grave, che dovrebbe essere una serie di lunghezza.
i numeri più può essere sintetizzato come serie, il migliore (voglio minimizzare il numero di serie!)
tua specifica è ancora vaga. Prendi '1 2 3 5 7': dove dovrebbero andare 3? Inoltre, per '1 2 3 10 12 20 21 22', vuoi una serie' 10 12', o renderli 2 serie singleton? – choroba
Non ci avevo pensato. Per il primo caso: nella mia applicazione non importa se i tre sono parte se la prima o la seconda sequenza. Per quest'ultimo caso: '10 12' dovrebbe essere una serie. – user1981275