免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: win_hate
打印 上一主题 下一主题

[ML][练习] 生成排列 [复制链接]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
1 [报告]
发表于 2008-11-17 09:45 |显示全部楼层
原帖由 flw 于 2008-11-17 09:22 发表

不要太在意语法糖,那些都是浮云,关键是思想。

对研究算法来说也许是这样,但对于编程语言本身来说,提供好的(也即易学易用的)语法是非常重要的。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2008-11-17 16:06 |显示全部楼层
原帖由 win_hate 于 2008-11-17 13:29 发表
haskell 那个我是这样测的(帮忙看看是否用错了命令):


let x = permutation [1..10000]
take 1 (drop 10000 x)

这个可以直接用 (permutation [1..10000]) !! 10000

我测试了一下,用 -O2 编译后,这个在我的机器(P4 2.2G, 1G 内存)上大概 6.8 左右的样子就可以跑出来。现在用的是 GHC 6.8,改天试试 6.10 的表现。

(permutation [1..10000]) !! 100000 需要的时间大概是 68 秒。

MMMIX 那个空间占得厉害。

是有这个问题。Boxed variable 和 lazy evolution 这两个都会消耗内存。

[ 本帖最后由 MMMIX 于 2008-11-17 17:32 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2008-11-17 17:38 |显示全部楼层

回复 #13 MMMIX 的帖子

BTW,我把 win_hate 用 ML 实现的 nextperm 翻译为 Haskell 测试了一下,超级快

不过我觉得主要问题在于才用 nextperm 这种方式,程序的执行流程相对简单,好优化;而我原来的实现其执行流程就复杂很多(至少是从实现方面考虑)。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2008-11-18 09:55 |显示全部楼层
原帖由 win_hate 于 2008-11-17 20:05 发表
把你的 Haskell 代码贴出来给我学习一下吧,

这是我把你的 ML 代码翻译为 Haskell 后的结果,你可以参考下:

  1. module Permutation (nextPerm, nthPerm, allPerm) where

  2. import Data.List (genericTake, genericIndex, sort)

  3. nextPerm :: Ord a => [a] -> [a]
  4. nextPerm (x:xs) = next [x] xs
  5.   where
  6.     next rs [] = rs
  7.     next (r:rs) (y:ys) = if r <= y then next (y:r:rs) ys else swap (r:rs)
  8.       where
  9.         swap [x] = y:x:ys
  10.         swap (x1:x2:xs) = if y < x2 then x1 : swap (x2:xs) else (y:x2:xs) ++ (x1:ys)

  11. nthPerm :: Ord a => Integer -> [a] -> [a]
  12. nthPerm n xs = (iterate nextPerm xs) `genericIndex` n

  13. allPerm :: Ord a => [a] -> [[a]]
  14. allPerm xs = genericTake (factorial n) $ iterate nextPerm xs'
  15.   where
  16.     n = length xs
  17.     factorial n = product [1..n]
  18.     xs' = sort xs
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2008-12-02 09:47 |显示全部楼层
原帖由 starfuck 于 2008-12-2 00:06 发表
我倒奇怪了,占空间的方式能撑到n!多大还不死的

应该是 n 多大。n 和 n! 的数量级是不能同日而语的。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2008-12-03 11:22 |显示全部楼层
原帖由 win_hate 于 2008-12-3 10:43 发表


如果在华丽地跳出来之前,能先看一看大家的讨论,就不会提这样的问题了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2008-12-04 13:56 |显示全部楼层

回复 #32 starfuck 的帖子

讨论问题就好好讨论,嘴里不干不净的算是怎么回事?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP