アカウント名:
パスワード:
コンピュータサイエンスの初級コースってのがどんな教育をする場かは知りませんが、アルゴリズムのお勉強とかは、C/C++ がベストと思うんですよね。使える機能がもっとも原始的という意味で。ま、最低、Java でもいいとは思うけど。
数あるプログラミング言語でも飛び抜けて多機能なC++を、「使える機能がもっとも原始的」とは恐れいった
そうかもしれない。私がイメージしたのはGCとかに邪魔されず。基本的なデータ構造を自作しても効率が悪くないくらいに原始的という感じ。確かにSTLとか使っちゃったらアルゴリズムのお勉強にならないね(^^;
STLの存在がデータ構造のアルゴリズムの学習を妨げるとしたら、qsortがあるCだってソートの学習に向いていないことになってしまうある機能が学習の妨げになるというのなら、それを使わないようにすればいいだけそれに、より原始的なほうが適しているというのなら、マシン語やアセンブリ言語から学ぶべきだし、GCがアルゴリズムの学習を阻害するというのも意味がわからないな
> GCがアルゴリズムの学習を阻害するというのも意味がわからないな
ここだけ説明、GC のある言語でマージソートのようなメモリを確保するアルゴリズムを実装すると、実装に仕方にもよるけど、正体不明の速度低下を引き起こすことがあったりするんですよ。私自身の体験ですけどね。で、アルゴリズムの素の性能を見極めるときの邪魔にならないかなぁと思ったと。
教科書通りに再帰的なコードを書かなければ問題はないかと。現場では絶対に再帰的なソートなんて書きませんし。スタックオーバーフローを避けるために通常ループに展開します。演算子とループ構文とIf構文と配列だけで出来ますから。なんで再帰的なソートを初めに教えるのか理解に苦しみます。更に、マージソートは改善策が沢山在って(以下うんちく
わかりにくい皮肉だな
> スタックオーバーフローを避けるために通常ループに展開します。
で結局、配列側でオーバーフローするんでしょ?(以下うんちく
なんで再帰的なソートを初めに教えるのか理解に苦しみます。
教育の初歩の段階だからこそ数学的な定義に基づいてやってるんじゃないんですかね。
> 現場では絶対に再帰的なソートなんて書きませんし。
まあ結果的にはそのとおりだけど。
通常C言語ですらライブラリがあるのに自分で劣化コピーの再発明なんかしねーよ。逆にアルゴリズムの教育用ならコンパイラが末尾呼び出しの最適化すらできない「現場」とやらの都合を持ち込むほうがおかしい。
コードがループで書かれても、このアルゴリズムは再帰的なんだから、再帰的なソートを教えるのは当たり前じゃないかな。
最近の gcc とか再帰をループに展開してくれますよね。
どうして無限に深いスタックのあるプッシュダウンオートマトンや無限に長いテープのあるチューリング機械が計算機のモデルになるのかいつも不思議で仕方ない。それこそ無限のほうが何かと楽になるという数学屋の都合にすぎないと思うんだが。
2000年という有限ですら目を背けてたのがコンピュータサイエンスの世界ですから。
数学屋の都合というのはその通りと思いますよ。もともと現実のコンピュータの能力をモデル化するためじゃなく、数学の限界、すなわち人間の思考の限界をモデル化するためのものですよね。だから、考えられる限り最高の計算能力を持ったコンピュータである必要があった。
じゃあそれに代わる有限かつ妥当な計算機のモデルを示してくださいよ。
C++がとんでもなく多機能なのは誰が見ても明らかで、「使える機能が原始的」という根拠はまったく説得力を持たない。そして「アルゴリズムの素の性能を見極めるときの邪魔にならないかなぁと思った」とのことだが、もちろん現実にはデータの個数やデータの並びの乱雑さ、比較関数の複雑さなどによって結果は異なるため、実際のコードを走らせても「素の性能」を測ることはできない。「アルゴリズムの素の性能」を測るときに用いるのは数学的な計算量だ。
「基本的なデータ構造を自作しても効率が悪くない」と、C++が効率に優れることも根拠としているようだが、Javaは通常の用途ではC++と遜色ないレベルまで効率的になっており、情報科学
>C++がとんでもなく多機能なのは誰が見ても明らかで、「使える機能が原始的」という根拠はまったく説得力を持たない。
私は「原始的なほど多機能」だという感覚があるから、全然違和感ありませんが。
(私にとって)超高級言語の LOGO とか、他の言語に比べて機能が少ないどころの話じゃないですし。
そうですね、アルゴリズムの性能は計算量のオーダーで議論する。その通りと思います。マージソートの話は私の気の迷いです。はい。
ところで、私は最低 Java でも悪くないと書いてます。Java を否定するつもりはないですよ。
C++がアルゴリズムの学習に向いているという自説に揺るぎない自信というのもちょっと(^^;C++は多機能だろと突っ込まれた段階で揺らぎまくりです。よろしければ、あなたのおすすめの学習法とか教えていただけませんか?
クラスの生成・破棄のコストが高い。2〜3次元座標程度のクラスでも常に動的確保してGCで回収する必要がある。構造体やクラスをスタックに確保できるC++なら殆どの場合スタックポインタを書き換えるだけですむ。
型推論がない、pairやtuple等で関数から複数の値を返したいときに変更箇所が増える。
演算子オーバーロードがないジェネリクスを使っても自前の数値演算クラスと、組み込みの数値型の処理を共通化できない。
Pythonというもっとよい選択肢がある。動的型付け言語で、演算子オーバーロードがあり。クラスの生成にnewという古の呪文を必要としない。
と、いつの間にか最強論争を始めてしまう残念な人でしたいったいどういう教育を受けてきたんでしょうね
数学的な計算量を使おう、ってまっとうな答えは出てるけど、現場でちょっと測ってみたいことはありますね。その場合、私の周辺では、計測中のGCを禁止したり、タイミングを制御しています。GCの制御が出来ないとすると、ベンチマークだけじゃなくて実用上も困ることが出てくるような…
そうですね、現場では計算量のオーダーだけではなく、いわゆる隠れた係数など、実際の速度が気になりますね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日々是ハック也 -- あるハードコアバイナリアン
アルゴリズムのお勉強 (スコア:0)
コンピュータサイエンスの初級コースってのが
どんな教育をする場かは知りませんが、
アルゴリズムのお勉強とかは、C/C++ がベストと思うんですよね。
使える機能がもっとも原始的という意味で。
ま、最低、Java でもいいとは思うけど。
Re: (スコア:0)
数あるプログラミング言語でも飛び抜けて多機能なC++を、「使える機能がもっとも原始的」とは恐れいった
Re: (スコア:0)
そうかもしれない。私がイメージしたのはGCとかに邪魔されず。
基本的なデータ構造を自作しても効率が悪くないくらいに原始的という感じ。
確かにSTLとか使っちゃったらアルゴリズムのお勉強にならないね(^^;
Re:アルゴリズムのお勉強 (スコア:0)
STLの存在がデータ構造のアルゴリズムの学習を妨げるとしたら、qsortがあるCだってソートの学習に向いていないことになってしまう
ある機能が学習の妨げになるというのなら、それを使わないようにすればいいだけ
それに、より原始的なほうが適しているというのなら、マシン語やアセンブリ言語から学ぶべきだし、
GCがアルゴリズムの学習を阻害するというのも意味がわからないな
Re:アルゴリズムのお勉強 (スコア:1)
> GCがアルゴリズムの学習を阻害するというのも意味がわからないな
ここだけ説明、GC のある言語でマージソートのようなメモリを
確保するアルゴリズムを実装すると、実装に仕方にもよるけど、
正体不明の速度低下を引き起こすことがあったりするんですよ。
私自身の体験ですけどね。
で、アルゴリズムの素の性能を見極めるときの邪魔にならないかなぁと思ったと。
Re: (スコア:0)
教科書通りに再帰的なコードを書かなければ問題はないかと。
現場では絶対に再帰的なソートなんて書きませんし。
スタックオーバーフローを避けるために通常ループに展開します。
演算子とループ構文とIf構文と配列だけで出来ますから。
なんで再帰的なソートを初めに教えるのか理解に苦しみます。
更に、マージソートは改善策が沢山在って(以下うんちく
Re: (スコア:0)
わかりにくい皮肉だな
Re: (スコア:0)
> スタックオーバーフローを避けるために通常ループに展開します。
で結局、配列側でオーバーフローするんでしょ?(以下うんちく
Re: (スコア:0)
なんで再帰的なソートを初めに教えるのか理解に苦しみます。
教育の初歩の段階だからこそ数学的な定義に基づいてやってるんじゃないんですかね。
Re: (スコア:0)
> 現場では絶対に再帰的なソートなんて書きませんし。
まあ結果的にはそのとおりだけど。
> スタックオーバーフローを避けるために通常ループに展開します。
通常C言語ですらライブラリがあるのに自分で劣化コピーの再発明なんかしねーよ。逆にアルゴリズムの教育用ならコンパイラが末尾呼び出しの最適化すらできない「現場」とやらの都合を持ち込むほうがおかしい。
Re: (スコア:0)
コードがループで書かれても、このアルゴリズムは再帰的なんだから、再帰的なソートを教えるのは当たり前じゃないかな。
Re: (スコア:0)
最近の gcc とか再帰をループに展開してくれますよね。
Re:アルゴリズムのお勉強 (スコア:1)
どうして無限に深いスタックのあるプッシュダウンオートマトンや無限に長いテープのあるチューリング機械が計算機のモデルになるのかいつも不思議で仕方ない。それこそ無限のほうが何かと楽になるという数学屋の都合にすぎないと思うんだが。
Re: (スコア:0)
2000年という有限ですら目を背けてたのがコンピュータサイエンスの世界ですから。
Re: (スコア:0)
数学屋の都合というのはその通りと思いますよ。
もともと現実のコンピュータの能力をモデル化するためじゃなく、
数学の限界、すなわち人間の思考の限界をモデル化するためのものですよね。
だから、考えられる限り最高の計算能力を持ったコンピュータである必要があった。
Re: (スコア:0)
じゃあそれに代わる有限かつ妥当な計算機のモデルを示してくださいよ。
Re: (スコア:0)
C++がとんでもなく多機能なのは誰が見ても明らかで、「使える機能が原始的」という根拠はまったく説得力を持たない。
そして「アルゴリズムの素の性能を見極めるときの邪魔にならないかなぁと思った」とのことだが、
もちろん現実にはデータの個数やデータの並びの乱雑さ、比較関数の複雑さなどによって結果は異なるため、
実際のコードを走らせても「素の性能」を測ることはできない。
「アルゴリズムの素の性能」を測るときに用いるのは数学的な計算量だ。
「基本的なデータ構造を自作しても効率が悪くない」と、C++が効率に優れることも根拠としているようだが、
Javaは通常の用途ではC++と遜色ないレベルまで効率的になっており、
情報科学
Re:アルゴリズムのお勉強 (スコア:1)
>C++がとんでもなく多機能なのは誰が見ても明らかで、「使える機能が原始的」という根拠はまったく説得力を持たない。
私は「原始的なほど多機能」だという感覚があるから、
全然違和感ありませんが。
(私にとって)超高級言語の LOGO とか、他の言語に比べて機能が少ないどころの話じゃないですし。
Re: (スコア:0)
そうですね、アルゴリズムの性能は計算量のオーダーで議論する。
その通りと思います。マージソートの話は私の気の迷いです。はい。
ところで、私は最低 Java でも悪くないと書いてます。
Java を否定するつもりはないですよ。
C++がアルゴリズムの学習に向いているという自説に揺るぎない自信というのもちょっと(^^;
C++は多機能だろと突っ込まれた段階で揺らぎまくりです。
よろしければ、あなたのおすすめの学習法とか教えていただけませんか?
Re: (スコア:0)
クラスの生成・破棄のコストが高い。
2〜3次元座標程度のクラスでも常に動的確保してGCで回収する必要がある。
構造体やクラスをスタックに確保できるC++なら殆どの場合スタックポインタを書き換えるだけですむ。
型推論がない、
pairやtuple等で関数から複数の値を返したいときに変更箇所が増える。
演算子オーバーロードがない
ジェネリクスを使っても自前の数値演算クラスと、組み込みの数値型の処理を共通化できない。
Pythonというもっとよい選択肢がある。
動的型付け言語で、演算子オーバーロードがあり。クラスの生成にnewという古の呪文を必要としない。
Re: (スコア:0)
と、いつの間にか最強論争を始めてしまう残念な人でした
いったいどういう教育を受けてきたんでしょうね
Re: (スコア:0)
数学的な計算量を使おう、ってまっとうな答えは出てるけど、
現場でちょっと測ってみたいことはありますね。
その場合、私の周辺では、計測中のGCを禁止したり、タイミングを制御しています。
GCの制御が出来ないとすると、ベンチマークだけじゃなくて実用上も困ることが出てくるような…
Re: (スコア:0)
そうですね、現場では計算量のオーダーだけではなく、
いわゆる隠れた係数など、実際の速度が気になりますね。