Haskellで蟻本を解く1
最近Haskellを勉強していて、練習がてら、蟻本こと「プログラミングコンテストチャレンジブック」の問題をできるだけ解いてみようと思います。
最初は練習問題の
n本の棒から周長が最大となる三角形を作る
という問題。これをO(nlogn)で解くにはどうしたらいいかというものです。(しらみつぶしでO(n^3)の方法については本に書いてあります)
qsort :: [Int] -> [Int] qsort [] = [] qsort (x:xs) = qsort [x' | x' <- xs, x'>x] ++ [x] ++ qsort [x' | x' <- xs, x'<=x] maxTriangleSorted :: [Int] -> [Int] maxTriangleSorted (x:xs) | length xs < 2 = [] | x < sum xss = [x] ++ xss | otherwise = maxTriangleSorted xs where xss = take 2 xs maxTriangle :: [Int] -> [Int] maxTriangle = maxTriangleSorted.qsort
maxTriangle [15,2,7,3,8,6] [8,7,6]
qsortはO(nlogn)で比較は高々n回なので計算時間はO(nlogn)です。
あまりHaskell的にはよろしくないコードだと思いますが…。
- 作者: 秋葉拓哉,岩田陽一,北川宜稔
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2010/09/11
- メディア: 単行本(ソフトカバー)
- 購入: 52人 クリック: 1,538回
- この商品を含むブログ (83件) を見る