なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net (914レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

341: デフォルトの名無しさん [sage] 2015/12/27(日) 00:54:47.63 ID:Y7IK7QLW(1/16) AAS
>>325
bashを使うのであれば

if [ $i -ge $j ]; then
の代わりに
if (( $i < $j )); then と書ける。

また(( )) の中で単体の変数は$を省略できる
if (( i < j )); then

一行で書くこともできる。
(( i >= $ )) && break
342: デフォルトの名無しさん [sage] 2015/12/27(日) 01:09:36.05 ID:Y7IK7QLW(2/16) AAS
stack=("${stack[@]:0:((${#stack[@]}-2))}")

これは、こう書ける。

stack=("${stack[@]::${#stack[@]}-2}")

ついでに、""をつける方が正しいのではあるが、
値にスペースが無ければ、"" は省略可能。
343: デフォルトの名無しさん [sage] 2015/12/27(日) 01:15:06.76 ID:Y7IK7QLW(3/16) AAS
p=$(( $((${array2[$i]}+${array2[$j]}))/2 ))

$((・・・)) の中では普通に () が使用可能

p=$(( (${array2[$i]} + ${array2[$j]}) / 2 ))
344: デフォルトの名無しさん [sage] 2015/12/27(日) 01:21:25.37 ID:Y7IK7QLW(4/16) AAS
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:25.91 ID:Y7IK7QLW(5/16) AAS
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:16.35 ID:Y7IK7QLW(6/16) AAS
ループ版で時間がかかってるのはこの部分な気がするな。
配列をコピーしているわけだし。

stack=(${stack[@]::${#stack[@]}-2})

http://www.drk7.jp/MT/archives/000995.html
さて、ここの非再帰版を見ると、どうも配列のコピーはしてないようだ。
ループ版は高速化の余地がありそうだ。

やってみるかね? うまく実装できるかな?
348: デフォルトの名無しさん [sage] 2015/12/27(日) 02:20:49.37 ID:Y7IK7QLW(7/16) AAS
さーて、コードをほとんど読まずに、Perl版をそのまま置き換えてみたが
きちんと動かんぞとw 面倒くさいな。
速度的には再帰版より速くなりそうな感じはしてるが、処理間違ってるからなw
349: デフォルトの名無しさん [sage] 2015/12/27(日) 02:32:42.88 ID:Y7IK7QLW(8/16) AAS
あ、できたっぽい? 参考にしたコードに二箇所バグが有るようだな。

> &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:29.15 ID:Y7IK7QLW(9/16) AAS
ごめん嘘だったw 。あれぇ〜?
351: デフォルトの名無しさん [sage] 2015/12/27(日) 02:58:09.23 ID:Y7IK7QLW(10/16) AAS
Perl版実行してみたがもともとのコードからして動いてないw
352
(1): デフォルトの名無しさん [sage] 2015/12/27(日) 03:31:06.37 ID:Y7IK7QLW(11/16) AAS
マジめんどくさかったわ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:18.72 ID:Y7IK7QLW(12/16) AAS
ループの方が速かったので訂正よろ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:49.49 ID:Y7IK7QLW(13/16) AAS
>>355
いいだしっぺどうぞw
358: デフォルトの名無しさん [sage] 2015/12/27(日) 07:55:16.56 ID:Y7IK7QLW(14/16) AAS
言い出しっぺの定義を変えるなよw
本当に往生際が悪いw
360: デフォルトの名無しさん [sage] 2015/12/27(日) 08:06:42.55 ID:Y7IK7QLW(15/16) AAS
と言われてもなぁw

俺は1万倍速いなんて言ってないし。
ループのほうが速いという証拠も出したからどうでもいいかなw
362: デフォルトの名無しさん [sage] 2015/12/27(日) 08:18:08.68 ID:Y7IK7QLW(16/16) AAS
>>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 1.156s*