2015-10-08 15 views
0

我正在尋找一個Perl腳本,它將有效地找到重複模式及其在文件中出現的次數。查找Perl腳本重複模式和文件中出現的次數?

示例文件輸入:

1 
2 
3 
1 
2 
5 
1 
2 
4 

樣本輸出 重複圖案是

1 - 3 

2 - 3 

1 2 - 3 
+4

你好。請參閱[問]什麼是一個很好的問題。對於初學者來說 - 記住Stack Overflow不是一種編碼服務,它是程序員互相協助解決問題的網站。爲此 - 展示一些嘗試解決它自己是一件好事。 – Sobrique

+0

非常感謝。我曾想出解決這個問題的方法,但其複雜性將呈指數級增長。所以我想知道是否有更好的方法來解決相同的問題:) –

+1

答案 - 可能。但是你的例子仍然不清楚它是如何工作的 - 哪些代碼也是如此,即使它是指數級的。在上面,我不清楚'1-3'是一個重複模式,如果3只發生一次。 – Sobrique

回答

0

下面是通過使用hash的一種方式。下面的代碼會給你重複模式和它們在文件中出現數:

#!/usr/bin/perl 
use warnings; 
use strict; 

my %count; 

open my $fh, "<", "abc.txt" or die $!; 

while(my $line = <$fh>) 
{ 
    chomp $line; 
    $count{$line} += 1; 
} 
close $fh; 

foreach my $pattern (sort keys %count) 
{ 
    next if ($count{$pattern} == 1); 
    print $pattern . " - " . $count{$pattern} . "\n"; 
} 

輸出:

1 - 3 
2 - 3 
+0

我認爲OP還要計算多行(即1 2,2 3,1 2 3,...) – Toto

+0

@託託:可能。但OP沒有被清除。我的代碼基於OP的這一行_repeating模式和它們的出現次數。 – serenesat

+0

當然,它不是很清楚,但他的例子中的第三行列出了'1 2 - 3',我想這就是說第1行和第2行有幾次出現了3次。這就是爲什麼他說複雜性是指數級的。 – Toto

1

我認爲你必須把限制模式的大小,否則複雜性將成爲一個問題。 鑑於P是模式的大小,N文件(目錄)的長度我的解決方案的複雜應是O(N * P)

my $window_size = 5; 
my @input = qw (1 2 3 1 2 5 1 2 4); 


my %result; 
my %windows; 

foreach my $inp (@input) { 
    for my $win_size (1..$window_size){ 
     push @{ $windows{$win_size} } , $inp; 
     shift @{ $windows{$win_size} } if scalar @{ $windows{$win_size} } > $win_size; 
     my $win_string = join(' ', @{ $windows{$win_size} }); 
     $result{$win_string} += 1 if scalar @{ $windows{$win_size} } == $win_size; 
    } 
} 

foreach (sort { length $a <=> length $b } keys %result) { 
    print "$_ \t\t $result{$_}\n"; 
}