![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
久しぶりにプログラミングしたら極端に頭が悪くなっていました。
死にたい。
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【至急!!!】python言語で本を見...
-
python print文のエラー
-
int(input("○○"))の使い方
-
16進の10進変換について
-
シェルスクリプトで、空白(ス...
-
関数「exists」と「defined」の...
-
I2C接続のLCDディスプレイを使う
-
python3について。
-
Pythonでプログラミング プログ...
-
チェックボックスのCGIへの値の...
-
シェルで、ランダム関数を変数...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
文字の横にプルダウンを表示さ...
-
formで特定のinputを送信しない...
-
実行中の変数の中身をイミディ...
-
メモリをアドレスを直接指定し...
-
VBAでPDFのコピーとリネームを...
-
<SELECT>タグの折り返し
-
ドロップダウンリストのselecte...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
pythonで演算子を変数に代入す...
-
【至急!!!】python言語で本を見...
-
pythonの*
-
c言語 16進数の2進数への変換
-
awkの正規表現での最左最短マッ...
-
数値かどうかの判定方法
-
関数「exists」と「defined」の...
-
シェルで、ランダム関数を変数...
-
I2C接続のLCDディスプレイを使う
-
シェルスクリプトで、空白(ス...
-
perでメールが送信出来ない場合...
-
int(input("○○"))の使い方
-
UWSCのSELECT文の記述方法
-
pythonで改行を含めてfindする方法
-
switch文のエラーについて
-
シェルスクリプト+perl
-
qq!!の意味を教えてください。
-
ソケットでのデータ送受信につ...
-
PythonでUTF8の文字列をリスト...
おすすめ情報