免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2008-12-04 12:09 |只看该作者
切,我那段代码的目的在前面写了。是某人华丽地跳出来,说“看来不怎么样啊”。然后给出一个一段代码,本质上处理的却是另一个问题。


当元素很多时,遍历整个状态空间是不可能的。

通过计算阶乘只可以处理整个状态空间里的一个小子集。

nextperm 可以随机生成一个排列,遍历其附近的排列。复杂度只有 O(n)。

懂了吗,小网友。

论坛徽章:
0
32 [报告]
发表于 2008-12-04 12:14 |只看该作者
本帖最后由 starfuck 于 2019-11-26 23:57 编辑












论坛徽章:
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
33 [报告]
发表于 2008-12-04 13:56 |只看该作者

回复 #32 starfuck 的帖子

讨论问题就好好讨论,嘴里不干不净的算是怎么回事?

论坛徽章:
0
34 [报告]
发表于 2008-12-06 00:43 |只看该作者
本着学习一下 python 的想法,研究了 starfuck 的代码。

下面是他的正向推导代码:


  1. def swap_g(a, i, j):
  2.     if a[i] > a[j]:
  3.         a[i], a[j] = a[j], a[i]
  4.         return 1
  5.     return 0

  6. def fuck(a):
  7.     for i in xrange(2, len(a)+1):
  8.         for j in xrange(1, i):
  9.             if swap_g(a, -j, -j-1):
  10.                 return
  11.         for j in xrange(1, i+1):
  12.             if swap_g(a, -j, -i-1):
  13.                 a[-i:] = sorted(a[-i:])
  14.                 return

  15. import time
  16. t0 = time.time()
  17. a = range(1000000)
  18. for i in xrange(200000):
  19.     fuck(a)
  20. print time.time()-t0
复制代码


后面的比较逻辑把我弄糊涂了。后来加了几句代码才看得比较清楚。很有意思

这是添加了输出的代码:


  1. def swap_g(a, i, j):
  2.     if a[i] > a[j]:
  3.         a[i], a[j] = a[j], a[i]
  4.         return 1
  5.     return 0

  6. def fuck(a):
  7.     for i in xrange(2, len(a)+1):
  8.         for j in xrange(1, i):
  9.             print a[-j], "<->", a[-j-1]
  10.             if swap_g(a, -j, -j-1):
  11.                 print a
  12.                 return
  13.         for j in xrange(1, i+1):
  14.             print a[-j], "<=>", a[-i-1]
  15.             if swap_g(a, -j, -i-1):
  16.                 a[-i:] = sorted(a[-i:])
  17.                 print a
  18.                 return
复制代码


这是计算排列  8,9,7,6,5,4,3,2,1 后继排列的代码


  1. def swap_g(a, i, j):
  2.     if a[i] > a[j]:
  3.         a[i], a[j] = a[j], a[i]
  4.         return 1
  5.     return 0

  6. def fuck(a):
  7.     for i in xrange(2, len(a)+1):
  8.         for j in xrange(1, i):
  9.             print a[-j], "<->", a[-j-1]
  10.             if swap_g(a, -j, -j-1):
  11.                 print a
  12.                 return
  13.         for j in xrange(1, i+1):
  14.             print a[-j], "<=>", a[-i-1]
  15.             if swap_g(a, -j, -i-1):
  16.                 a[-i:] = sorted(a[-i:])
  17.                 print a
  18.                 return

  19. a = [8, 9, 7, 6, 5, 4, 3, 2, 1]

  20. print a
  21. fuck(a)
复制代码


从输出可以看出比较的逻辑


  1. [8, 9, 7, 6, 5, 4, 3, 2, 1]
  2. 1 <-> 2
  3. 1 <=> 3
  4. 2 <=> 3
  5. 1 <-> 2
  6. 2 <-> 3
  7. 1 <=> 4
  8. 2 <=> 4
  9. 3 <=> 4
  10. 1 <-> 2
  11. 2 <-> 3
  12. 3 <-> 4
  13. 1 <=> 5
  14. 2 <=> 5
  15. 3 <=> 5
  16. 4 <=> 5
  17. 1 <-> 2
  18. 2 <-> 3
  19. 3 <-> 4
  20. 4 <-> 5
  21. 1 <=> 6
  22. 2 <=> 6
  23. 3 <=> 6
  24. 4 <=> 6
  25. 5 <=> 6
  26. 1 <-> 2
  27. 2 <-> 3
  28. 3 <-> 4
  29. 4 <-> 5
  30. 5 <-> 6
  31. 1 <=> 7
  32. 2 <=> 7
  33. 3 <=> 7
  34. 4 <=> 7
  35. 5 <=> 7
  36. 6 <=> 7
  37. 1 <-> 2
  38. 2 <-> 3
  39. 3 <-> 4
  40. 4 <-> 5
  41. 5 <-> 6
  42. 6 <-> 7
  43. 1 <=> 9
  44. 2 <=> 9
  45. 3 <=> 9
  46. 4 <=> 9
  47. 5 <=> 9
  48. 6 <=> 9
  49. 7 <=> 9
  50. 1 <-> 2
  51. 2 <-> 3
  52. 3 <-> 4
  53. 4 <-> 5
  54. 5 <-> 6
  55. 6 <-> 7
  56. 7 <-> 9
  57. 1 <=> 8
  58. 2 <=> 8
  59. 3 <=> 8
  60. 4 <=> 8
  61. 5 <=> 8
  62. 6 <=> 8
  63. 7 <=> 8
  64. 9 <=> 8
  65. [9, 1, 2, 3, 4, 5, 6, 7, 8]
复制代码


学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP