[過去ログ] Perlについての質問箱 64箱目 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
838: 2020/12/09(水)10:27 ID:LWKBPFtb(3/7) AAS
>>836>>837
それだと、要素の比較のたびに、値の変換処理が行われる。
比較は何度も行われるため、変換処理が軽くない場合、ソート全体としてかなり重くなりうる。
すくなくとも「スマート」とは言えない。

そこで、変換結果をキャッシュするような形になるのがシュワルツ変換。

知らんならググれ。
839: 2020/12/09(水)10:46 ID:zREBomTd(1) AAS
sort { s1($a) <=> s1($b) } keys %x;

sub s1 {
shift =~ /(¥d+)-(¥d+)/ && 100*$1+$2
}
sortならこんなかんじ
840: 2020/12/09(水)10:47 ID:UMU4oc+t(2/7) AAS
順番が変わるだけで処理量は変わらんでしょう
どっちにしろ重い

次にソートする時はソート対象が変わっているんだから、キャッシュできない

有効な局面もあるんだろうけど、今回に関してはトリッキーなだけでメリットがない
841
(1): 2020/12/09(水)10:51 ID:UMU4oc+t(3/7) AAS
次のソートじゃなくて、1回のソート内部の複数の比較に対してか
あー、確かに速くなりそうな気がする
処理系が気を利かせて変わらない気もする
842: 2020/12/09(水)11:29 ID:LWKBPFtb(4/7) AAS
>>841
ソートの内部処理が想像できんのか?
もとの並び方にはよるが、ふつうは大きく異なる。
「処理系」とやらが気を利かせられる範疇ではない。

比較処理にsayでもいれて試してみろっつーんだよ。
843
(1): 2020/12/09(水)12:58 ID:UMU4oc+t(4/7) AAS
内部の話だからsayでは判らんだろ

関数で評価しないといけないと判っていて、動的に処理する必要も無いんだから、
評価済みのテーブルを内部に持たせようというのは自然な発想
844: 2020/12/09(水)13:12 ID:/81rDyGm(1) AAS
>>843
試してから言え。
きっと、想像以上の出力が出てきて驚くから。
845
(2): 2020/12/09(水)13:44 ID:UMU4oc+t(5/7) AAS
判ってないのかな

処理速度に配慮した処理系があっても不思議ではないという話
手元で試して遅かったとしても、全ての処理系に対する証明にはならない
846: 2020/12/09(水)14:16 ID:AA5LXV3h(1) AAS
>>845
痛々しいからもうやめとけ
847: 2020/12/09(水)14:32 ID:LWKBPFtb(5/7) AAS
>>845
Perlの「全ての処理系」て。w
848
(1): 2020/12/09(水)15:17 ID:UMU4oc+t(6/7) AAS
そもそも重いかどうかが疑問で、どっちでやっても一瞬で終わるのが普通
それなら読みやすい方が優れている
重くて困ってから対策を考えればいい
849
(5): 2020/12/09(水)16:44 ID:qaSCdqDS(1) AAS
map {
$_->[0];
} sort {
$a->[1] <=> $b->[1] || $a->[2] <=> $b->[2];
} map {
[$_, /(\d+)/g ];
}

読みにくい…かなあ?
850
(1): 2020/12/09(水)17:06 ID:8NKLSi5o(1) AAS
>>849
他の言語の人が見たら発狂しそう
851
(2): 2020/12/09(水)18:15 ID:UMU4oc+t(7/7) AAS
別に短く書かなくていいんだよ

@r = sort s2 @a;

sub s1 {
  my $str = shift;
  $str =~ /(\d+)\-(\d+)/;
  return $1 * 100 + $2;
}

sub s2 {
  return s1($a) <=> s1($b);
}
852: 2020/12/09(水)18:16 ID:xAMitlRd(1) AAS
発狂しない人が使えば良いよ
853: 2020/12/09(水)19:43 ID:LWKBPFtb(6/7) AAS
>>848
おまえ、ハードな処理を実装したことがないやろ?w

慣れたPerl使いはわざわざ>>851みたいなコードは書かない。
遅いし、くどくて逆に読みにくいからな。
854: 2020/12/09(水)19:45 ID:LWKBPFtb(7/7) AAS
>>850
C#でも、タプルが使えるようになったので、似たようなコードは書く。
LINQなぶんだけPerlより読みやすいけど。
855: 2020/12/09(水)22:17 ID:rsuX7ND7(1) AAS
ハッシュテーブルにs1($val)の戻り値を保存して、そのハッシュテーブルを使って比較関数を呼び出すとかするのが普通でしょ。
856
(1): 849 2020/12/10(木)06:03 ID:+FxPMgzN(1) AAS
読みやすい優れたコードが >>851 か。
自分のコードを出してくれた点は評価するが
$1 * 100 + $2
って何?
857
(1): 2020/12/10(木)16:08 ID:smJEm1Fb(1) AAS
2桁前提なんだろうな
858: 2020/12/10(木)19:59 ID:g17Qy/zb(1) AAS
>>857
>>834なら4桁までイケる。w
859: 2020/12/11(金)03:24 ID:lklp228q(1) AAS
考え方は同じだけど最初からソート用の値をデータに持たせてみる。
my %x = (
'3-1' => ['e', 301],
'1-2' => ['b', 102],
.... ,
);

sort { $x{$a}[1] <=> $x{$b}[1] } keys %x;
860
(1): 2020/12/11(金)03:42 ID:Hz2bdcAQ(1/6) AAS
複数キーでのソートに帰着させるべきなんだろうな
1-1-1 も許容する、とかになった瞬間に破綻する
861: 2020/12/11(金)04:01 ID:Hz2bdcAQ(2/6) AAS
sub s1 {
my @a = split /\-/, $a;
my @b = split /\-/, $b;
my $dim = @a > @b ? @a : @b;
for my $i (0 .. $dim) {
my $cmp = $a[$i] <=> $b[$i];
return $cmp if $cmp;
}
return 0;
}
862
(2): 856 2020/12/11(金)06:10 ID:LwDR4/oY(1) AAS
>> 833 には数値の値域については何も書かれてないんだから
勝手に想定しない方がいいと想うよ。
どうしても比較を簡略化したいなら pack 関数で数値を全部
ビッグエンディアンで並べればいいんじゃないかな。
863: 2020/12/11(金)10:41 ID:vQm1aiEb(1/4) AAS
>>860
最初から想定されてるのでなければ、ひどい仕様変更なんだから、実装変更もやむなしやろ。
数字じゃなくてアルファベットにします、と言われただけでパーやし。w
864
(1): 2020/12/11(金)10:50 ID:vQm1aiEb(2/4) AAS
>>862
勝手に想定するのもあたりまえ。
じゃないと、なんにも例示できなくなるで?

値域がどうこうなんか、自分でなんとでもすればいいだけ。
本題のソートには関係ない。
865: 2020/12/11(金)11:20 ID:Hz2bdcAQ(3/6) AAS
1-1があるなら1-1-1もあると予測するのは自然な拡張
1-1-1-... に無限に対応できるように作っておいて、
その特殊ケースとして要件を満たす、で十分

アルファベットにも対応するのは次元が違う
866
(1): 2020/12/11(金)19:40 ID:V1LdBVWq(1) AAS
>>864
こういうひとがコーディングすると
バッブァオーバーランとか起こしてセキュリティに穴を開けるんだな
867
(1): 2020/12/11(金)20:46 ID:vQm1aiEb(3/4) AAS
>>866
アホなの?
他人のコードのバッファオーバーランなんか知らんわ。
自分で責任を持て。
1-
あと 135 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.016s