なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net (914レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
341: デフォルトの名無しさん [sage] 2015/12/27(日)00:54 ID:Y7IK7QLW(1/16)
>>325
bashを使うのであれば
if [ $i -ge $j ]; then
の代わりに
if (( $i < $j )); then と書ける。
また(( )) の中で単体の変数は$を省略できる
if (( i < j )); then
一行で書くこともできる。
(( i >= $ )) && break
342: デフォルトの名無しさん [sage] 2015/12/27(日)01:09 ID:Y7IK7QLW(2/16)
stack=("${stack[@]:0:((${#stack[@]}-2))}")
これは、こう書ける。
stack=("${stack[@]::${#stack[@]}-2}")
ついでに、""をつける方が正しいのではあるが、
値にスペースが無ければ、"" は省略可能。
343: デフォルトの名無しさん [sage] 2015/12/27(日)01:15 ID:Y7IK7QLW(3/16)
p=$(( $((${array2[$i]}+${array2[$j]}))/2 ))
$((・・・)) の中では普通に () が使用可能
p=$(( (${array2[$i]} + ${array2[$j]}) / 2 ))
344: デフォルトの名無しさん [sage] 2015/12/27(日)01:21 ID:Y7IK7QLW(4/16)
for i in `seq 1 1 1000`; do
`` は基本的に $() と同等。新しい$()の使用が推奨されている。
for i in $(seq 1 1 1000); do
また、これは以下のように書ける
for i in {1..1000}; do
345: デフォルトの名無しさん [sage] 2015/12/27(日)01:32 ID:Y7IK7QLW(5/16)
lintツールとして、shellcheckコマンドがある。
qsort_rec $left $((i-1))
^-- SC2086: Double quote to prevent globbing and word splitting.
qsort_rec $((j+1)) $right
^-- SC2086: Double quote to prevent globbing and word splitting.
$leftと$rightにスペースが入ってる場合に問題になるから""をつけろと警告される。
これは冒頭で
left=$(($1))
right=$(($2))
のようにして数値であると保証してあげれば消える。
変数 pair が未使用
その他の警告は、上の指摘を修正すれば消えるはず
346: デフォルトの名無しさん [sage] 2015/12/27(日)01:46 ID:Y7IK7QLW(6/16)
ループ版で時間がかかってるのはこの部分な気がするな。
配列をコピーしているわけだし。
stack=(${stack[@]::${#stack[@]}-2})
http://www.drk7.jp/MT/archives/000995.html
さて、ここの非再帰版を見ると、どうも配列のコピーはしてないようだ。
ループ版は高速化の余地がありそうだ。
やってみるかね? うまく実装できるかな?
348: デフォルトの名無しさん [sage] 2015/12/27(日)02:20 ID:Y7IK7QLW(7/16)
さーて、コードをほとんど読まずに、Perl版をそのまま置き換えてみたが
きちんと動かんぞとw 面倒くさいな。
速度的には再帰版より速くなりそうな感じはしてるが、処理間違ってるからなw
349: デフォルトの名無しさん [sage] 2015/12/27(日)02:32 ID:Y7IK7QLW(8/16)
あ、できたっぽい? 参考にしたコードに二箇所バグが有るようだな。
> &qsort_array($array2,0,$size);
> $right_stack[0] = $right;
$sizeが$rightに入るが、正しくは$size-1
> if ($i - $left < $right - i) {
↓
> if ( ($i - $left) < ($right - i) ) {
Perlの優先順位は、下のように解釈されるんだっけ?
そんなの変えないよな。
今コードを見直してる。
350: デフォルトの名無しさん [sage] 2015/12/27(日)02:34 ID:Y7IK7QLW(9/16)
ごめん嘘だったw 。あれぇ〜?
351: デフォルトの名無しさん [sage] 2015/12/27(日)02:58 ID:Y7IK7QLW(10/16)
Perl版実行してみたがもともとのコードからして動いてないw
352(1): デフォルトの名無しさん [sage] 2015/12/27(日)03:31 ID:Y7IK7QLW(11/16)
マジめんどくさかったわw 参考にしたコードが悪すぎた。
他のコードと比べてよくわからん比較条件とか処理が多かったので
結局諦めてこっちを参考にした。
http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_102
結論。やっぱりループのほうが速かったねw
https://ideone.com/KmmnH7
recursive
real 0m0.550s
user 0m0.548s
sys 0m0.000s
loop
real 0m0.439s
user 0m0.436s
sys 0m0.000s
なお再帰版も>>326よりも速くなっているのは、
上で指摘した点をリファクタリングしたため。
>>326のコード
> recursive
> real 0m0.637s
> user 0m0.636s
> sys 0m0.000s
>
> loop
> real 0m0.723s
> user 0m0.720s
> sys 0m0.000s
353(3): デフォルトの名無しさん [sage] 2015/12/27(日)03:35 ID:Y7IK7QLW(12/16)
ループの方が速かったので訂正よろw
328 名前:デフォルトの名無しさん[] 投稿日:2015/12/26(土) 21:22:21.55 ID:EXUTS9i+ [10/10]
なんだやっぱり再帰の方がいいのか
329 名前:デフォルトの名無しさん[sage] 投稿日:2015/12/26(土) 21:26:26.06 ID:hFLlv/LI [1/3]
ぐうの音も出ないなこれは
356(1): デフォルトの名無しさん [sage] 2015/12/27(日)07:39 ID:Y7IK7QLW(13/16)
>>355
いいだしっぺどうぞw
358: デフォルトの名無しさん [sage] 2015/12/27(日)07:55 ID:Y7IK7QLW(14/16)
言い出しっぺの定義を変えるなよw
本当に往生際が悪いw
360: デフォルトの名無しさん [sage] 2015/12/27(日)08:06 ID:Y7IK7QLW(15/16)
と言われてもなぁw
俺は1万倍速いなんて言ってないし。
ループのほうが速いという証拠も出したからどうでもいいかなw
362: デフォルトの名無しさん [sage] 2015/12/27(日)08:18 ID:Y7IK7QLW(16/16)
>>361
これでいいのかい?w
ループの方が速かったよwww
328 名前:デフォルトの名無しさん[] 投稿日:2015/12/26(土) 21:22:21.55 ID:EXUTS9i+ [10/10]
なんだやっぱり再帰の方がいいのか
329 名前:デフォルトの名無しさん[sage] 投稿日:2015/12/26(土) 21:26:26.06 ID:hFLlv/LI [1/3]
ぐうの音も出ないなこれは
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.033s