现在的位置: 首页 > 综合 > 正文

AB交换问题

2013年01月27日 ⁄ 综合 ⁄ 共 739字 ⁄ 字号 评论关闭

问题描述,给两个变量A和B,设计算法交换他们.一个合理的约定: A和B在内存内是连续的并且长度相同.对于不连续的,可以调用这个算法,因此这里只讨论连续的.

 

把问题简化,我们下面讨论int类型的.

 

answer1:

t = A; A = B; B = t;

评价:最朴素的想法,附加空间为O(1)

 

answer2:

A+=B; B = A-B; A-=B;

评价:没有附加空间, 但是可能溢出,要想不溢出也行,要加if语句判断情况

 

answer3:

A*=B; B=A/B; A/=B;

评价:2的一个变种,缺点更容易发生,写在这里只是想提示一下,方法2只是一个模式

 

answer4:

A^=B; B^=A; A^=B;

评价:比1少一个变量,速度相同,没有溢出,看起来是个不错的算法.

 

answer5:

对于支持swap指令的CPU,直接调用这个指令就OK了.

 

第一种方法不讨论,后面的2-4方法实际上想法是相同的:先让一个变量附带上两个变量都有的并且可还原的属性,然后在还原两个变量的同时随手把变量交换掉.2和3的缺点就是还原度不好,因为可能有溢出,因此不是好算法.

 

对于非int型的数据呢?比如double或者float[], 其实无所谓的,交换和数据类型是无关的,对于交换操作来看,要的只是字节数而已.当然,对于32位机来说,先4个字节4个字节的交换,然后再交换不足4个字节的部分,这样快些

 

最后,实际操作中你用哪个呢?我选择1或者4,如果不是大的结构体,就用1,速度照样很快,清晰明了.如果结构体比较大,那么用4,只是为了效率.

 

对于方法5,除非给定我操作平台,否则懒得写汇编代码.和方法5雷同的是高精度加减法问题,对于高精度加减法,实际上CPU内部的adc指令非常有效,使用这个指令的话运行效率不知道要比写c代码快多少倍.

 

抱歉!评论已关闭.