问题
将一个 N X N 的矩阵 逆时针旋转90度。
算法分析
乍一看问题很眼熟。。。不就是C语言入门100道例程里的嘛。一开始我用的是基于矩阵转置+逆序的方法,或者建立一个新矩阵去填充。这两种算法解决小矩阵的转置可以说得心应手,但是一旦涉及到10000X10000这种大矩阵,感觉就力不从心了。比如,建立新矩阵可能会消耗大量内存;转置加逆序两次运算会大大降低旋转速度。因此在做题的时候想到了一种从元素交换法入手,可以简单的多线程旋转矩阵的方法。不过我写算法的能力比较差,可能没法全方面的比较算法之间的利弊,因此将想法在这里描述一下,若有不足还请大佬们指正。
其原理图如下
图 一
如图是一个 4X4 的矩阵,每一个元素有 初始坐标(X,Y) 及 旋转后坐标(X',Y') 。在这里把矩阵像洋葱一样分成一层又一层(如图中红色框与绿色框为两层),根据元素旋转的轨迹看出,层与层之间的旋转是独立的,这不正好可以并行运算吗~
接着,每层找四个特殊点来看一下坐标的变化,试着将每一层的元素坐标变化公式化:
<