关于求全排列

shexinwei 2012-04-10 10:00:03
现在正在做的一个算法,由于问题的特殊性。一个排列(1,2,3)与它的逆排列(3,2,1)的结果是一样的。因此在程序中不需要计算逆排列。

因为一个长度为n的序列的排列个数有n!个,且都是对称的。即:其中n!/2是另外n!/2的逆排列。

怎样设计一个求全排列的算法,只求其中一半排列,而不用计算它们对应的逆排列?
...全文
166 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shexinwei 2012-04-14
  • 打赏
  • 举报
回复
Thank you !!
[Quote=引用 7 楼 的回复:]

比如 (1,2,3,4,5)
分成
(1,2),(3,4,5)
==> (1,3,4,5,2),(1,3,5,4,2),(1,4,3,5,2),(1,4,5,3,2),(1,5,3,4,2),(1,5,4,3,2)

(1,3),(2,4,5)
==> (1,2,4,5,3),(1,2,5,4,3),(1,4,2,5,3),(1,4,5,2,3),(1,5,2,4,3),(1,5,……
[/Quote]
keeya0416 2012-04-11
  • 打赏
  • 举报
回复
比如 (1,2,3,4,5)
分成
(1,2),(3,4,5)
==> (1,3,4,5,2),(1,3,5,4,2),(1,4,3,5,2),(1,4,5,3,2),(1,5,3,4,2),(1,5,4,3,2)

(1,3),(2,4,5)
==> (1,2,4,5,3),(1,2,5,4,3),(1,4,2,5,3),(1,4,5,2,3),(1,5,2,4,3),(1,5,4,2,3)

.....
如此下去
keeya0416 2012-04-11
  • 打赏
  • 举报
回复
其实很简单
n 个数 分成 2 + (n -2) 两种组合
n-2 个数做全排
完事把另外2个数在 n-2 个数的全排的基础上首尾各放一个就行了
cnmhx 2012-04-11
  • 打赏
  • 举报
回复
do i=1,n;do j=1,i;do k=1,j;...
当然可以不用显式循环结构啦!
amani11 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

找出一個與其他數都不等的數, 這個數只允許出現在(0,n/2)即可.
當然n是奇數的時候,當這個數出現在中間時需要特殊處理一下.
[/Quote]

nod,

LZ担心的算法复杂度,,理论上是一样的,hoho~~~

或者,你可以考虑算法的时候,先放头尾两个数,确保头<=尾即可,【任意某两位都可】

这样子还有去重问题,集合里有相同的数的时候,组合就没有N!这么多了
shexinwei 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

如果空间允许,用hash_map去除逆排列。 设计一个hash函数,保证一个排列(1,2,3)与它的逆排列(3,2,1)的hash值相同。
[/Quote]

需要避免逆排列的计算,如果逆排列都计算出来了,还比较什么啊。。。。。。。那复杂度就没有任何降低啊。。。
I_code 2012-04-10
  • 打赏
  • 举报
回复
如果空间允许,用hash_map去除逆排列。 设计一个hash函数,保证一个排列(1,2,3)与它的逆排列(3,2,1)的hash值相同。
fire_woods 2012-04-10
  • 打赏
  • 举报
回复
找出一個與其他數都不等的數, 這個數只允許出現在(0,n/2)即可.
當然n是奇數的時候,當這個數出現在中間時需要特殊處理一下.

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧