[過去ログ] 関数型プログラミング言語Haskell Part22 (1001レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
731
(3): 2013/03/23(土)12:46 AAS
とりあえず、よくあるもっとも簡単な実装はこれかな。

qs :: (Ord a) => [a] -> [a]
qs [] = []
qs (x:xs) = qs (filter (< x) xs) ++ [x] ++ qs (filter (> x) xs)

空間計算量が最悪O(n^2)になるケースってのは、どういうリストに適用した時?
732
(1): 2013/03/23(土)12:46 AAS
>>713で正しいよ

なんかwikipediaのクイックソートのページにも実用性が云々と書かれているけど、そもそもリストという
データ構造自体がソートと相性が悪いんだから、そんなこと言っても仕方ないと思うけどね

大量のデータを扱うなら他のデータ構造を使うべきだし、ごく少量のデータなら入門書の実装の
方がむしろ実用的だろう

>>731
それだと重複した要素が消えることないかな?
735
(1): 2013/03/23(土)12:46 AAS
>>731
>空間計算量が最悪O(n^2)になるケースってのは、どういうリストに適用した時?
入力が既に正順か逆順にソートされている場合。O(n^2)になるのは正順か逆順のどちらか
だけなんだけど忘れた。この板のHaskell関係の過去スレの一つに議論があったはず
(ちょっと探したけど見つからなかった、曖昧でごめん)
746: 2013/03/23(土)12:46 AAS
>>732
すまんすまん、= を書き忘れてた。
< か > のどちらかに = を追加して考えて。

>>735 >>736
モリタポ使っても、なぜか Part 7 が見れない。

>>731 のような感じのクイックソートの実装だと、
A ++ B ++ C という形の式が大枠であるよね。

これを順に弱頭部正規形にして評価していくとき、最悪の場合、
左側の ++ 演算子が評価可能になるまで(++の左辺が x:xs の形になるまで)ずっと、
(((・・・((A'' ++ B '' ++ C'') ++ B' ++ C'))・・・))) ++ B ++ C
というような再帰的な形で左側が伸びていくと思う。

未評価の A'' や B' などが何個作られるかというと、
qs 関数が適用するリストの長さを n とすると、ざっと見積もって
3 + 2 * (n - 1) 個かな。
(最初の 3 は一番深い所の A++B++C で、2 は ()++B++C の B と C)

最悪ここまで式が伸びきるので、空間計算量は O(n) ではないか、
と俺は思ったんだが、どこで勘違いをしているのか分からない。

過去ログ Part 7 が見られるようになったら調べてみるけど、
今の所自分の頭ではこう考えた。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.042s