なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net
あっ、繰り返し版は10000倍速いんだっけ? (爆笑) 早く実装コードみたいなあ。 >>266 そんなに実装したいのなら教えてしんぜよう。 5000万件で >>201 を実行してみたまえ。 再帰呼出しというのは効率が悪いとても頭の悪いやり方なんだよ。 シェルスクリプトを証拠として使うのは笑ってしまうからやめろ >>268 反論できないのな?じゃあお前の負けってことで。 野次飛ばしてる観客相手に勝利宣言も笑うからやめろ おまえはプロレスのヒール役か >高々定数倍 そんな安全なもんじゃあねぇ。 データが増えれば差も増大。 >>267 ぷぷぷぷ 知能障害者は>>201 をクイックソートと呼ぶのか? >>271 ミジメすぎるぞ。クイックソートのスタック消費量はlog nに抑える事が可能。 こんな基本的な事を知らないから数千万件はソート出来ない。キリッ とか、赤面な発言しちゃうんだよ。 ちなみにglibcのqsort(これは非再帰)も同じ手法で自前スタックを管理してる 知能が低いって本当にかわいそう。 https://sourceware.org/git/?p=glibc.git ;a=blob_plain;f=stdlib/qsort.c;h=04c25b984f74a8f738233cc6da8a738b6437833c;hb=b8079dd0d360648e4e8de48656c5c38972621072 /* The next 4 #defines implement a very fast in-line stack abstraction. */ /* The stack needs log (total_elements) entries (we could even subtract log(MAX_THRESH)). Since total_elements has type size_t, we get as upper bound for log (total_elements): bits per byte (CHAR_BIT) * sizeof(size_t). */ >>272 バカかお前は。ボウフラサイズの脳ミソしか搭載してないのか? ただの繰り返しでさえ130倍の差があるのだから クイックソートを実装したらそれ以上の開きがあるのは自明だろうが。 >>275 バカはお前だ。シェルスクリプトでクイックソートを実装するなんて誰がするか。 sortプログラムを使え。 ちなみにシェルスクリプトの場合、関数呼び出しはそれ自体がスタックの深さをnとしてO(n^2)くらいの計算時間を持つっぽい。 >>275 ぷぷぷ。知能障害は本当にかわいそう。 qsortの繰り返し版は関数呼び出しの代わりに自前でスタック管理しなきゃならないんだよ。 10000倍高速化の実証コードはよ。 >>276 確かに、うん、確かに、非常にゆるやかに発散するね。 n=2^64としてもlog nは64だけどね。 定数と変わんないレベルだよね。 >>277 実装できないのな?無理なのな?はい論破。 >>278 >>201 がすべてを物語っている。 これが何よりの証拠。再帰がとてつもなく効率が悪いことを つまびらかにしてみせた。ここに来て見てみぬふりは通用しない。 エビデンスもきちんと示されている。もはや知らぬ存ぜぬでは済まされない。 >>280 何万倍も高速だっ。キリッ。 って主張してる奴に実証責任があるんだが ガイジにはわからないの? >>280 練習のためなら兎も角、シェルスクリプト「だけ」でソーティングなんてやる意味が無い。 ループだろうと再帰だろうとね。 理由は遅いから。 ループで組んだとしても、非常に遅いから、実装するだけの意味が無い。 sortを呼べばCで書かれた非常に高速でスケーラブルなソーティングが出来るから、普通はそっちを使う。 さぁ君は一体何を論破したというのだい? >>281 障害児くん 10000倍と130倍って、どっちがどれだけ大きいかわかる? >>282 >>201 で完全に証明してみせた。 反証する責任がお前にあるとは俺は思わないよ。 俺は自分の都合の良いように他人に責任を押し付けるなんて 卑劣な真似はできない。俺はただの真実の探求者。 >>281 ちょっと試せば分かることなんだけど、シェルスクリプトに於いて再帰の実行速度は 呼び出し深さnに対してO(n^2)くらい掛かる。 で、クイックソートの呼び出しの深さは要素数mについてO(log m)なので O(log^2 m)の計算時間が再帰だけで掛かることになる。 つまり全体の計算量はO(m log^2 m)だ。 一方でループの場合にはO(m log m)掛かるから、その差はO(log m)だ。 この値はm=5000万、底2として約25だ。 つまり、理論上は再帰とループで25倍の差が開きうる。 そして君は10000倍違うと言う。 残り400倍はどうやって稼ぐんだい? >>284 ボウフラ並みの脳ミソをメダカにでも食われたのかお前。 頭悪いにも程があるだろうが。こんな鶏頭野郎の 相手する俺の身にもなれ。なんていいやつなんだ俺。 聖人君子としか言いようがないわ。>>201 は5000回の繰り返しだ。 5000回の繰り返しでさえ130倍の開きがあるのだから回数が 増えれば差は開く一方だ。だから、>>267 で5000万と言ったのだよ。 霊がいるのかいないのかは判りませんが 人間の目が無いものを見ることがあるのは事実です >>287 5000回の再帰で130倍の差が開いた訳じゃなくて、 深さ5000の関数呼び出しで130倍の差が開いたって事を理解してる? 5000万要素のクイックソートなら最良のケースで深さ25の再帰だからね? 130倍どころか2倍にもならないからね? >>286 クイックソートを実装して試したのか?あ? だれが実装するかと言っていたのと矛盾するだろうが。 つまり、君は嘘をついている。ゆえに俺が言ってることの方が正しい。はい論破。 >>289 当たり前だろ。小さな町の町長が東京の都知事になって 仕事をこなせると思うか?数が増えるほどにコストは増大するんだ。劇的にな。劇的にだ! >>292 すまん、その例えどこまで信用していいか分からないからそういうの語るときは式でお願い >>290 ヤってみたのか?ヤったのか?ヤってから言えや! さっさとクイックソートのコード提示しろよ! いつまでグズグズ言ってりゃ気が済むんだ 俺はお前がクイックソートをシェルで実装するのをあとどれだけ待てばいいわけ? >>295 再帰は数万倍遅いといったお前が実証しろよ >>294 log2・5000 : log2・5000 ? 30 ⇒ log2・50000000 : 10^4 ? A QED. >>296 俺は >>201 で示したし、それで十分に満足の行く結果を得た。 >>201 に不満だというのならそれを超えるものをお前が書け。自分でやれ。 他人にやらせるっていうのは俺の常識からは考えられない。 >>298 お前がやるんだ。お前が言い出したことだろうが。 >>295 どうして俺が実装しなきゃならないわけ? 数万倍遅いって言い出した奴が実証のためにコードを提供するのが筋だろ? >>301 そんな筋は通らない。実証コードが欲しいといいだしたのは お前なのだからお前が自分で書け。言い出しっぺの法則は プログラマを始め科学的論証に関わる人間すべてに通じる基本原則だ。 どうやればそれを確認できるかという手順も道筋も結論も示した。 自分の満足のいくものが欲しいのなら自分で行動しろ。 他人の足にしがみつくな、気持ち悪い。 1万倍の実証コードとか言い出しといて書かないってどういうことよ? 他人に頼りっきりってどういうことよ? 夢があるのなら自分で叶えろよ 親の足かじってんじゃねえぞニート野郎 >>302 IDをよく見ろ。俺は実証コードが欲しいだなんて一言も言ってない。 >>297 何この記法初めて見た もしかして情報界隈では常識なのか? >>219 親のスネかじってんじゃねーぞニート野郎 とっとと数万倍速いクイックソートの実証しろよ ID:6n5NtJkMは発狂して「再帰は数万倍遅い」発言をウヤムヤにしたい模様 でも、まだ300レス。先は長いぞ。頑張れ。 >>305 俺も見たこと無い。 一瞬、三項演算子にも見えるけど順序がおかしいし。 >>304 言ったかどうかは問題じゃない! お前はクイックソートで1万倍の差があるのか確認したい、 それを確認する手段としてシェルでクイックソートを実装すればわかる ということを俺は示したんだよ。それだけわかってればいいよもう! >>308 ?はただの文字化けだぞ。 数理式計算量証明の理想解近似法を大学で習ってたらわかるだろ。 情報科学の基礎中の基礎だし。 >>309 いいや、そもそもそんな事は望んでない。よく読め。 俺が言いたいのは、1万倍もの差が出るなんて事は理論上ありえないって事だ。 それでも尚、実際に1万倍の差が出ると言い張るのであれば それを実証するコードを君が示すべきだよね? >>310 すまん、その文字化けしてるところ元は何だったのか教えてくれ O? >>311 だから、俺は示したって言ってるだろうが! >>201 でくっきりはっきりと証明してみせただろうが。 それで満足できないというのであれば、満足の行くコードを見たいというのであれば お前がそれを書くべきだ!それが論理的検証というものだ。科学的な姿勢というものだ。 他人の論文に満足できないと言ってるばかりじゃ学会では一切評価されないよ。 それを超える論文を自分で書いてこれでどうだと魅せつけるべきだ。 君はシェルでクイックソートを書くべきなんだ!! >>312 掛け算の掛けるだ。 右側では1万倍になってるのがわかっていただけると思う。 >>313 いいかい? 君は「示した」と何度もはっきり発言してはいるけど、実のところ何も示しちゃいないんだ。 >>315 バカかお前は。大脳半球が全損して産まれて来たのか? 名前解決に時間がかかるとするならば、名前解決まで含めて再帰呼出しだ。 外務省はシリアへの渡航を自粛するよう日本国民に通告しているが、そんな不安な情勢の中、 「シリアが危険なんじゃないテロリストが危険なんだ」と言って 意気揚々とシリアに出かけていく頭の中お花畑野郎と同じだろうが。 お前が言ってるのはそれと全く同じこと。 シリアという地域でテロの被害に遭う確率が高いから外務省は渡航を自粛するように 必死に呼びかけているんだ。少しでも日本の国民がテロの被害に遭わないよう骨身を削って 頑張っているんだ。再帰呼出しでプログラム事故に遭う確率が高いから俺は再帰を自粛するよう 呼びかけているんだ。外交官としての俺の立場に立って再考してみろ。お前がどれだけ 愚かなことを言っているか今一度ようく考えてみることだな。 障害児は シェル関数呼び出しはwhileより130倍遅い と 再帰版のクイックソートは何万倍も遅い が等価らしい 必死で再帰を否定しているバカが低知能であることのエビデンスがまた一つ明らかになってしまった >>317 >>201 の画像が見えないのか?俺はエビデンスをしっかりちゃっかりくっきりまるっきり示したぞ。 お前はアイマスク付けて前が見えないと言ってるだけのただのうつけ者。話にならない。 もしかしてだけどさ、もししてだけどさ、>>201 で示されてることってシェル関数呼び出しがシェルwhileより130倍遅いことだけじゃね? >>322 おいおいいい加減にしろよナメクジ野郎。 自らの関数を呼び出すことを再帰と言うのだろうが。 関数の呼び出しが遅い、すなわち再帰の効率がとてもよろしくないということだ。 テロリストが民間人を殺害するのならば、テロがはびこっているシリアには行くべきじゃないということだ。 お前、後藤さんのご家族の前で後藤さんが悪いって言えるのか?後藤さんは悪いよ。 とても危険なところと知りつつシリアに言ったんだから。だけど、それをご家族の前で言う意味がないよね。 再帰を使うっていうのはテロリストの前に自らの首を差し出すことと同義。 何があっても文句言うな。そして周囲の人間をその愚行に巻き込むな。 悲しませるな。俺はお前らが再帰を使うと悲しいよ。 純粋にシェルスクリプトだけでクイックソートを組むのは骨が折れたぞっと http://www.fastpic.jp/images.php?file=2429159438.png ループのほうが遅いです本当にどうもありがとうございました ____ / \ / ─ ─ \ / (●) (●) \ | (__人__) | \ `⌒´ ,/ / ー‐ \ シリアとか言わなきゃよかった 後藤さんのくだりとか意味わかんないし フィボナッチとかはループと再帰で指数倍の差が出るんだっけ? >>334 それは再帰的定義を使う方では? フィボナッチ数列の第n項を直接nの式で表せるはずだが >>335 文脈読もうな。 メモ化に必要な記憶領域が線形ではないか、と言ってる奴がいたから定数だ、と答えただけ。 再帰メモ化定数メモリフィボナッチってどんなソースになるの? fibonacci = fib (0,1) fib (m1,m2) 0 = m2 fib (m1,m2) n = fib (m2, m1+m2) (n-1) タプルの代わりに木かハッシュを使えば値を全部保持する 普通のメモ化にできるがフィボナッチの計算にはもちろん不要 >>325 bashを使うのであれば if [ $i -ge $j ]; then の代わりに if (( $i < $j )); then と書ける。 また(( )) の中で単体の変数は$を省略できる if (( i < j )); then 一行で書くこともできる。 (( i >= $ )) && break stack=("${stack[@]:0:((${#stack[@]}-2))}") これは、こう書ける。 stack=("${stack[@]::${#stack[@]}-2}") ついでに、""をつける方が正しいのではあるが、 値にスペースが無ければ、"" は省略可能。 p=$(( $((${array2[$i]}+${array2[$j]}))/2 )) $((・・・)) の中では普通に () が使用可能 p=$(( (${array2[$i]} + ${array2[$j]}) / 2 )) for i in `seq 1 1 1000`; do `` は基本的に $() と同等。新しい$()の使用が推奨されている。 for i in $(seq 1 1 1000); do また、これは以下のように書ける for i in {1..1000}; do 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 が未使用 その他の警告は、上の指摘を修正すれば消えるはず ループ版で時間がかかってるのはこの部分な気がするな。 配列をコピーしているわけだし。 stack=(${stack[@]::${#stack[@]}-2}) http://www.drk7.jp/MT/archives/000995.html さて、ここの非再帰版を見ると、どうも配列のコピーはしてないようだ。 ループ版は高速化の余地がありそうだ。 やってみるかね? うまく実装できるかな? ループの途中でコマンドを呼び出すようにすればもう少し遅くできるんじゃないかな。 さーて、コードをほとんど読まずに、Perl版をそのまま置き換えてみたが きちんと動かんぞとw 面倒くさいな。 速度的には再帰版より速くなりそうな感じはしてるが、処理間違ってるからなw あ、できたっぽい? 参考にしたコードに二箇所バグが有るようだな。 > &qsort_array($array2,0,$size); > $right_stack[0] = $right; $sizeが$rightに入るが、正しくは$size-1 > if ($i - $left < $right - i) { ↓ > if ( ($i - $left) < ($right - i) ) { Perlの優先順位は、下のように解釈されるんだっけ? そんなの変えないよな。 今コードを見直してる。 Perl版実行してみたがもともとのコードからして動いてないw マジめんどくさかったわ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 ループの方が速かったので訂正よろ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 >>219 の主張を受け継いで高速化したお前が言い出しっぺ 言い出しっぺの定義を変えるなよw 本当に往生際が悪いw >>353 でお前が訂正を求めたレスはID:6n5NtJkMの 「再帰は1万倍遅い」に対するレス。 なので、訂正を求めるには10000倍高速化する必要がある 知能障害児には理解不能かな? と言われてもなぁw 俺は1万倍速いなんて言ってないし。 ループのほうが速いという証拠も出したからどうでもいいかなw >>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] ぐうの音も出ないなこれは 少し速いと10000倍速いの区別がつかないおバカさんとうエビデンス(笑) 分かったことは ・再帰をただ単にループに直すと却って遅くなる ・最適化を施せばループのほうが速くなるが、10000倍速くなるなんてことはない の2点でおっけい? そうだな。シリアがどうとか言い始めるほどループの方が優秀な訳では無さそうだな ∞倍だね。 再帰なんってのと比較すること自体おかしい。 却って遅くなるなんて書いてる恥知らずは、プログラミング技術が無さ過ぎ。 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる