突然发现我们系学的数学知识少得可怜——区区一个代数系统都让我感到新奇了半天。well,get to our business
置换是一个有序对的集合,通常写作两行,用括号包围,上下的位置关系表示对应一个置换。显然,上下两行的元素组成的集合是相同的,置换本身就是一个自身到自身的一一映射。我们可以对置换进行划分,每个划分子类中的元素的象都在该子类中,而且子类中不包括非子类元素的象。
循环——或许翻译成“环链”更好些,其实就是我们对置换进行划分时的足迹,每个划分子类中的元素依赖于置换这种全序(linear order)而组成一条环链(循环),以任意元素起始按顺序列出得到一个序列,便可表示一个置换子群。由于环中可以选择n个起点(考虑子群有n个元素),所以有n种环链表示形式。
从置换到环链的变换就是 从任意一个元素开始,在置换对中不断向前找,并标记,或者用记忆栈保存路径,直到发现重复的,然后分割出一个独立的子群(连通子图“似的?);对剩下的元素继续执行上述操作,直到所有元素被取出。时间复杂度O(N)。
从环链到置换的变换就是 -更简单,将环链一字拉开,这样做两条相同的行,然后将第二行向后错开一个位置,并将末位元素搬到空出来的位置,这样得到的两行的对应关系即反映/表示一个置换群。
这里,算法的轮廓还不涉及具体的数据结构的选择。
考虑在置换群上做乘积:类似于矩阵连乘时候计算乘法运算次数的情况,那里我们发现选择连乘的结合顺序对运算次数有特定的函数关系,而这里关心的是如何迅速计算出最终置换后的位置。简单的办法,参照我们的手工计算方法,从左至右逐个计算,是一种迭代模式iterative model,时间复杂度为O(sigma Ni)=O(N),N是所有元素出现次数之和,当无聊的人对群中少数元素做无谓的反复迭代置换时,it will suffer low efficiency.是否可以采用一种closer的方式,linear-with-n 的效率直接计算出每个元素的最终位置?individual model
这里有一个to be or not be 的问题:是否实际中有搜索的动作。人工操作时,直接定位最终的置换位置是轻易的,但本质上来说,为路径上的上一个元素探求这次乘积后的位置不是随机寻址的,你不能拿着上一个元素就可以一眼找到它在这次置换下的第一行中的位置——暂时不考虑作Hash映射的话。那么,探求成了搜索,不得不承担miss 的代价,直到目标出现在搜索对象中。一样的时间复杂度。
<<<<<< 这个问题还没不知道怎么办好
另外一个问题,考虑如何直接对置换的简写形式:环链作乘积运算,就是说,不允许变换到置换的算法空间来做,算法必须直接以环链为处理对象,并且不允许出现置换作为中间运算单元。
这个问题要仁慈一点在于,环链本身作为一个等价类,不可再分割了,所以就根本不用考虑对元素进行垂直分割、递归求解了——递归也只能以每个因子:环链为递归对象,这个,看起来没什么希望。可是,最终的结果——的环链表示也可能是分裂的!包括多个环链,不象置换,可以全局考虑,最后的全局状态就是结果;结果中的多个环链必然是在计算/算法执行过程中适时得到的!
<<<<<<< 不知道对不对? 先睡觉了zzzz