深入理解逆序数+八数码原理
什么是逆序数?
比如2 4 3 1。
依次看下去,2比1大,4比3大,4比1大,3比1大。所以逆序数就是4。
所以我们得知了逆序数就是体现在一个逆字上。相比于在正常序列下1234。有多少前面的数比后面的数大的这种情况,就是逆序数了。
逆序数为什么可以判八数码的无解?
(八数码:
1 2 3
4 5 6
7 8 x)
因为如果起始状态和目标状态,如果把目标状态的x也放到右下角,如果起始状态逆序数的奇偶性和目标状态的奇偶性是一样的,那行就代表这两个状态可以互相移动到。反之,就不可以互相移动到。
(感兴趣的的人看看证明吧,不感兴趣直接用也行)
我们首先需要明白,不管哪两个数进行一次交换,逆序数的奇偶性都一定会发生变化。
比如 2 4 3 1 原来的逆序数是4,假设我们交换了2和4,那么后面的数没有被影响,2和4之间的关系调换就使得了逆序数+1。那么这种关系可以被推广吗?可以的。因为两个数交换,那么仅仅看这两个数之间,他们的大小顺序肯定变换了,所以逆序数仅仅通过他们来判断肯定是+1或者-1了。与此同时还要看看他们之间顺序的改变对其他数有没有影响,显然如果这个影响发生了偶数次,就能验证我们的结论了。
这里我没看官方的结论,我只是自己简单验证了一下。
先看第一个黑色的交换。这个情况,前两个数间的大小肯定发生了交换,所以肯定发生了一次影响,但是由于那些东西在他们之后,所以他们没有对后面造成任何的影响。
再看棕色的交换。这一次是1号位和3号位交换。首先1,3之间肯定发生了一次逆序数的改变。其次2,3之间也是肯定发生了一次大小的改变了的!1,2之间也是肯定发生了一次大小的改变了的!所以总的改变次数就是奇数!
而当中间夹了n个的时候呢?我们可以仍然像上一个例子中一个一个地去看待。对于1个,我们造成的改变是偶数个(忽视两个数自身的对换的改变+1或者-1),那么不管中间有几个,都是偶数个的变化,再加上他们两个自身的交换的改变,总是依然是奇数个的改变。
有人可能会问,如果前面还有数怎么办?就是我们不是让第一个和后面的交换,而是中间的某个的和中间的另一个的交换,会怎样。其实我想说前面有没有丝毫不影响。前面的数的逆序数。
所以我们得出了元素之间的交换是一定会改变逆序数的奇偶性的。
其次我们这里假设一个m*n的矩阵,先假设m是大于n的
假设这是我们要求的目标矩阵。我们初始矩阵是有序的,且x在右下角的。
现在我们把x迁移到左上角去(这总是能够办到的)
我们观察到他的排序是这样的。
我们的初始矩阵是这样的。
123
456
789
10 11 x
那么我们有没有办法使得把我们的最后一行变成像上图这样的9 10 11呢?当然可以。
就比如说我们x先移动到9的左边,令他左移一格。再这样进行一次,令9到了最左边。最后x跑到9的下面,和他进行一次交换。
10也是一样的方法。
那么问题来了,11应该怎么办。我们就需要想办法把11放到上图中2原来的位置(就是倒数第二行倒数第二列)
当我们达成这个目标以后,现在的图是这样的。
那么我们把x移动到9的上方,和9换,再和10换,再和11换,就形成了
9
10 11
再让x走到右下角
9
10 11 x
和11换,和10换,和9换,最终达成了这个目标。
那么右边那最后一列也能如法炮制,使得和x在左上角那张图是一样的。最后我们继续这样做,最后会发现会形成一个2*2的矩阵。
x在左上角那张图是这样的。
x 1
5 6
那么我们通过初始数组移动过来的显然有两种情况。
x 1
5 6
和他一样。
x 5
6 1
和他始终不能一样了。
由此我们可以得出,一种目标状态,我们有两种可能。1.可以到达这种状态2.始终都不能到达这种状态。
继续再看
x 1
5 6
和x 5
6 1
他们之间唯一的区别是5,6在对角线上。就好比5和6交换位置后他们就一样了。所以根据我们一开始的结论:如果任意两个元素交换了位置,那么他们逆序数的奇偶性肯定就不一样了。所以我们这里就明白了。当起始状态和目标状态在同一个位置的时候,我们只有他们的逆序数的奇偶性是一样的,才能实现他们之间可以互相移动到对方的状态。八数码也就是一样,如果目标状态的x不是在右下角 ,就把它移到右下角,看看两者的逆序数是否奇偶性相同。同,则肯定有可能遇到。不同,则肯定不可能遇到。这解决了他的无解状态,使得双向bfs以及A*搜寻有了极好的表现。