我正在尋找一個Perl腳本,它將有效地找到重複模式及其在文件中出現的次數。查找Perl腳本重複模式和文件中出現的次數?
示例文件輸入:
1
2
3
1
2
5
1
2
4
樣本輸出 重複圖案是
1 - 3
2 - 3
1 2 - 3
我正在尋找一個Perl腳本,它將有效地找到重複模式及其在文件中出現的次數。查找Perl腳本重複模式和文件中出現的次數?
示例文件輸入:
1
2
3
1
2
5
1
2
4
樣本輸出 重複圖案是
1 - 3
2 - 3
1 2 - 3
下面是通過使用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
我認爲你必須把限制模式的大小,否則複雜性將成爲一個問題。 鑑於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";
}
你好。請參閱[問]什麼是一個很好的問題。對於初學者來說 - 記住Stack Overflow不是一種編碼服務,它是程序員互相協助解決問題的網站。爲此 - 展示一些嘗試解決它自己是一件好事。 – Sobrique
非常感謝。我曾想出解決這個問題的方法,但其複雜性將呈指數級增長。所以我想知道是否有更好的方法來解決相同的問題:) –
答案 - 可能。但是你的例子仍然不清楚它是如何工作的 - 哪些代碼也是如此,即使它是指數級的。在上面,我不清楚'1-3'是一個重複模式,如果3只發生一次。 – Sobrique