久しぶりにプログラミングしたら極端に頭が悪くなっていました。
死にたい。
my @a = qw(a b c d);
@aには何個の値が入っているか分かりません。
これを全組み合わせが欲しいのですが、どのようにするのが良いでしょうか。
abcd
abdc
acbd
acdb
adbc
adcb
bacd
…以下略
できれば、見るからに分かりやすい記述と
速い記述の2種類書いて頂けると幸いです。
ちなみに頑張ってたら作りたいのと全然違う物ができますた。ウエーン
my @a = qw(a b c d e f);
my %h = map{ $_, $a[$_] } 0..$#a; #感覚的によく分からないので数字のハッシュにする。
foreach my $n (0..((@a ** @a) - 1)){
my @p = ();
unshift @p,($n % @a);
while($n = int($n / @a)){
unshift @p, ($n % @a);
};
foreach my $k (@p){
print $h{$k};
}
print "\n";
}
しかも@aが増えると爆発的に遅いです。(当たり前か)
No.2ベストアンサー
- 回答日時:
分かりやすいかどうかは個人の好みがあるので、なんとも言えません。
最初のプログラムは、簡単な再帰呼び出しを利用したものです。なお、画面出力すると、それだけで時間がかかりますので数えるだけにしています。画面に出力するには、コメントを外してください。use strict;
use warnings;
my (@a, @work, $count) = 'a' .. 'd';
search(@a);
sub search {
foreach my $c (@_) {
push @work, $c;
if (@work == @a) {
# print join('', @work), "\n";
++$count;
} else {
search(grep { $c ne $_ } @_);
}
pop @work;
}
}
print "$count\n";
2番目のプログラムでは、(0,1,...,$#a-1,$#a) から ($#a,$#a-1,...,1,0) までを生成しています。私のパソコンで 10 文字 (a〜j) で実行してみると、最初のプログラムが 11 秒、2番目が 8 秒です。11 文字 (a〜k) では、111 秒と 93 秒です。
use strict;
use warnings;
my @a = 'a' .. 'd';
my @idx = 0 .. $#a;
my $count = 1; # print join('', @a[@idx]), "\n";
for (my $i = $#idx; $i > 0; $i--) {
next if $idx[$i-1] > $idx[$i];
if ($i == $#idx) {
@idx[$i-1,$i] = @idx[$i,$i-1];
} else {
foreach my $j (reverse $i .. $#idx) {
if ($idx[$i-1] < $idx[$j]) {
@idx[$i-1,$j] = @idx[$j,$i-1];
@idx[$i .. $#idx] = @idx[reverse($i .. $#idx)];
last;
}
}
}
++$count;
# print join('', @a[@idx]), "\n";
$i = $#idx; redo;
}
print "$count\n";
No.1
- 回答日時:
> 全組み合わせが欲しい
数学用語ですと、「組合せ(Combination)」は順番不問ものものですから、これは「順列(Permutation)」ですね。
順列も組合せもよく使われるものですから、検索すればいろんなアルゴリズムが見つかります。
「自作」が目的でないなら、CPANで順列組合せ用のモジュールをインストールするのも手です。
http://search.cpan.org/search?query=permute&mode …
> @aが増えると爆発的に遅いです。(当たり前か)
n個からn個並べる全順列は n! 個ありますから、どんな工夫しても爆発的に遅くなります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 a lot of my homeworkはありか? 5 2022/10/13 16:50
- PHP PHP ページング データベース 1 2022/06/16 10:30
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- Perl perlについての質問 2 2022/10/17 15:25
- 英語 「名詞 of 名詞」において、どちらも同一人物が主体となったり所有する名詞の適切な各限定詞について 2 2022/08/18 11:32
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- 英語 語の並び方を教えてください。 3 2022/04/17 22:58
- 英語 "beside"と比較級の共起の可否について 5 2022/11/15 09:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進の10進変換について
-
数値英単語変換
-
【至急!!!】python言語で本を見...
-
awkの正規表現での最左最短マッ...
-
文字のカラーとフォントの指定...
-
Pythonでコンソールをクリアす...
-
Pythonでターミナルに文字を出...
-
パイソンのクラスについて
-
awk の int()に関数について
-
C言語
-
シェルスクリプトで、空白(ス...
-
PerlCGIでクエリの検索結果が途...
-
プログラミングについて 文字列...
-
画面上再読み込みをさせたいの...
-
I2C接続のLCDディスプレイを使う
-
Perl 条件一致なし 合計値 0表示
-
pythonを使ったプログラミング...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
Pythonでターミナルに文字を出...
-
シェルスクリプトで、空白(ス...
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
c言語 16進数の2進数への変換
-
パイソンのクラスについて
-
I2C接続のLCDディスプレイを使う
-
関数「exists」と「defined」の...
-
pythonの*
-
変数の中は文字列か数値か調べ...
-
数値かどうかの判定方法
-
python print文のエラー
-
int(input("○○"))の使い方
-
Perlの例文でif($a==1&&$b==5&&...
-
awkの正規表現での最左最短マッ...
-
Use of uninitialized value ---
-
CGIでimgタグでalignを使うとエ...
-
swift 文字コードから文字に変...
-
javaのパッケージ構成で各パッ...
おすすめ情報