n个数字生成排列组合对象的算法(Johnson-Trotter)

这里我们使用

“箭头”

的方式来进行排列的讲解

比如给个三位数字【12, 3】求有多少种组合方式:
结果其实很简单:123 132 213 231 312 321 无非就是这六种

用代码实现的话普遍时间复杂度在大于 O(n!),小于 O(n∗n!)

这里我要讲的是另外一种方式,主要是靠“移动”来进行排列的负责度只有O(n!)

这里用三位数来讲解一下
[1,2,3]

先文字说明一下,后面代码实现

这里的话要实现移动排列的话首先要明白这两个步骤的意思:(主要按照下面图一、
图而来说明)
步骤1、找到最大能够移动的数字(图一)
	最大:不一定是数组中最大的,而是需要能够移动的最大的数字;
	能够移动:
		(1):箭头代表方向,首先这个数字头上箭头所指的方向
		必须要有数字,
			比如(参考下面图一):3头上箭头指向左边,左边还有5,4两个数字,
			这个可以,又比如4头像箭头指向左边,但是左边没有数字,
			所以4不满足条件,不能够移动(但是最后能不能移动还不能
			只靠有没有数字来决定,还需要第二个条件,如下)
		(2):除了箭头所指的方向有数据以外,还要要求箭头所指方向的数据
		要比当前数小才行,
			比如(参考下面图一):在第一个条件中说到3可以移动,但是他不满
			足第二个条件,因为3的箭头是向左边的,左边的数据5大于3,
			所以3不能移动。
			下图中唯一可以移动的是5,说明:5的箭头是向右的,右边右数据,
			满足第一个条件,右边的数据是3,比5小,满足第二个条件,
			所以5可以移动
步骤2、每次向左或者向右移动一位的时候需要做的两件事:(图二)
	(1):移动的话需要调换两个数的位置
	(2):然后就是把  比当前移动的数大的其它数的箭头掉转方向
		说明(参考下面图二)

每一次移动都要满足上面两个步骤才算是成功移动

图一
在这里插入图片描述
图二在这里插入图片描述

正式开始排列了

在这里插入图片描述
一直移动,直到没有数可以移动了就好了,所以只有六种

代码没有去实现,后期补上,你们可以试着去敲一下,

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值