TAOCP中1.1习题1解答与思考

来源:互联网 发布:c语言统计单词个数 编辑:程序博客网 时间:2024/06/04 23:28

       先大致叙述一下题目:

       使用书中给出的标记方法完成数值的序列的替换,比如交换m和n的数值可以通过这样的顺序实现:t ß m,m ß n,m ß t。现在要求用最少的步骤实现一下序列的调换,将(a,b,c,d)调换为(b,c,d,a)。

       除了这些要求之外,也没有什么额外的要求。观察上面的序列,其实最简单的一个理解模型是实现一次循环左移的操作。如果是这样,那么比较好的实现方案应该如下:

       S1: t ß a

       S2: a ß b

       S3: b ß c

       S4: c ß d

       S5: d ß t

       这样,一次循环左移的功能也就完成了。

       但是,这个题目的前提是给出了这个序列移动前后的状态,并没有给出实质的功能性含义描述。也就是说,并没有说这是一个循环左移的算法。那如果需要一个通用的算法来实现循环的重新排列应该怎么做呢?我觉得最好的方式还是要充分使用存储,尽量多地去设置中间的Buffer。如此,通用的算法描述应该如下:

       S1: t1 ß a

       S2: t2 ß b

       S3: t3 ß c

       S4: t4 ß d

       S5: a ß t2

       S6: b ß t3

       S7: c ß t4

       S8: d ß t1

       任意乱序的排列调整自然是使用上面的通用处理好一些,当然这种通用也只是针对一种方式下的固定解答。真若是覆盖全部的方式,那需要完成的工作还是很多的。而就题目来说,最快的解决方案自然还是通过一个数据的缓存来模拟一次循环左移的操作。

原创粉丝点击