深入理解逆序数+八数码原理

什么是逆序数?

比如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张图片

先看第一个黑色的交换。这个情况,前两个数间的大小肯定发生了交换,所以肯定发生了一次影响,但是由于那些东西在他们之后,所以他们没有对后面造成任何的影响。

再看棕色的交换。这一次是1号位和3号位交换。首先1,3之间肯定发生了一次逆序数的改变。其次2,3之间也是肯定发生了一次大小的改变了的!1,2之间也是肯定发生了一次大小的改变了的!所以总的改变次数就是奇数!

而当中间夹了n个的时候呢?我们可以仍然像上一个例子中一个一个地去看待。对于1个,我们造成的改变是偶数个(忽视两个数自身的对换的改变+1或者-1),那么不管中间有几个,都是偶数个的变化,再加上他们两个自身的交换的改变,总是依然是奇数个的改变。

有人可能会问,如果前面还有数怎么办?就是我们不是让第一个和后面的交换,而是中间的某个的和中间的另一个的交换,会怎样。其实我想说前面有没有丝毫不影响。前面的数的逆序数。


所以我们得出了元素之间的交换是一定会改变逆序数的奇偶性的。



其次我们这里假设一个m*n的矩阵,先假设m是大于n的

假设这是我们要求的目标矩阵。我们初始矩阵是有序的,且x在右下角的。

深入理解逆序数+八数码原理_第2张图片


现在我们把x迁移到左上角去(这总是能够办到的)

深入理解逆序数+八数码原理_第3张图片


我们观察到他的排序是这样的。

我们的初始矩阵是这样的。

123

456

789

10 11 x

那么我们有没有办法使得把我们的最后一行变成像上图这样的9 10 11呢?当然可以。

就比如说我们x先移动到9的左边,令他左移一格。再这样进行一次,令9到了最左边。最后x跑到9的下面,和他进行一次交换。

10也是一样的方法。

那么问题来了,11应该怎么办。我们就需要想办法把11放到上图中2原来的位置(就是倒数第二行倒数第二列)


当我们达成这个目标以后,现在的图是这样的。

深入理解逆序数+八数码原理_第4张图片


那么我们把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*搜寻有了极好的表现。

你可能感兴趣的:(算法知识)