淘客熙熙

主题:【原创】继续关于swap的讨论 -- 不锈钢破锣

共:💬22 🌺5 新:
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 【原创】继续关于swap的讨论

都知道程序设计里的swap()吧。一般是这么写的:

temp=a;

a=b;

b=temp.

如果不用临时变量,只用a,b这两个变量和算术运算该怎么办呢?再推广到逻辑门运算又该怎么办呢?

答案不是唯一的,楼下的朋友给的回答可以算其中之一,但还可以简化到三步:

a = a+b; (a:a+b, b:b)

b = a-b; (a:a+b, b:a)

a = a-b; (a:b, b:a)

推而广之,如果用一个实数域上的可交换运算符,比如*,来替换+,再用它的逆运算符,比如/,替代-, 结果同样成立。

但是,当应用于计算机时,答案中给出的交换方式有两个问题,一个问题是临时结果可能溢出(如果用*和/,会发生除0),另一个问题是精度可能降低。所以这样的方法不适用于传统计算机结构。

如果把一个变量看成一个二进制数组A(1),A(2),...,A(i),...,A(n), 现在再来看逻辑运算符XOR:

A(i) = A(i) XOR B(i);

B(i) = A(i) XOR B(i);

A(i) = A(i) XOR B(i);

这个表达方式很有意思,同样可以起到交换的作用,而且解决了上面的溢出和精度问题。

那为什么现在比较常用的方法还是使用临时变量呢?两个原因,一个是赋值运算比逻辑运算的速度更快;另一个是在编程方面,使用临时变量可读性更高。

从题目一开始就可以知道,新的运算方式节省了一个临时变量。这在传统计算机结构下是无足轻重的,但是,如果应用到新的计算机机构,比如量子机或者神经网络机,就需要重新衡量不同方法的效率。

从上面的例子可以看出,哪怕最简单的计算机问题,都未必是单一最优解的,原因主要在於问题的解决域不是单一的,从而导致最优解的衡量方式不同。也就是说,计算机科学所研究的往往不是地球围绕太阳转这一类普适性问题,而是条件约束问题。这也是计算机科学与物理之类自然科学在方法论上的主要区别。很可惜的是,当自然科学的方法论已经系统化时,计算机科学的方法论研究还不太成熟。关于这个问题,以后慢慢再谈。


本帖一共被 1 帖 引用 (帖内工具实现)
家园 To 不爱吱声兄

上回答应的关于方法论的文章,兄弟我还没忘。前阵子做的报告,因为是oral, 用powerpoint写的,而且是英文版,贴成文本可读性很差,所以准备用中文重新码。有些例子和描述也需要更新过以便于阅读。

上面这篇算是开个头,以后有空陆续写点。以我的散漫个性,写到哪里算哪里,只是表达一些观点跟网友们探讨一下。因为上网时间无法保证,文笔又生疏,比不得那些牛牛的出产频率,请谅解。

家园 对,好像计算机解决问题的方式很多时候不是数学意义上的最优解。
家园 现在计算机解决问题的方式, 都是基于现在

的存储程序计算机,又叫冯?诺依曼机

如果这个结构有所改变, 很多算法和结论恐怕都会要改变.

家园 谢谢老兄还记得此事,就奖励你个精吧,在讨论一下

老兄谈到量子计算机中算法的问题。我想由于量子计算机是靠概率,而且量子计算机一个位可以同时表示两个变量,是不是对于两个变量交换的问题,只需要筛选变量的时候用不同的“筛子”就可以了?量子算法和现在的所有计算机算法差别太大,现在已由数学家研究处量子算法,有谁明白的,能否给简单解释一下。

家园 那时候大概只有某些Search Engine可以原样照搬了
家园 这个哈,十几二十年前的电脑类报刊上的解答没有一百也有几十

似乎不是只有不锈钢兄提的这几条思路。很多很有趣的,匪夷所思,可惜我愚笨,都想不起来了。另外一个有趣的话题就是,“一行”程序,程序只有一行,也能干很复杂的事。

家园 下文?
家园 有重大问题请教-----

(1)

temp=a;

a=b;

b=temp;

固然要用一个临时变量,但是

(2)

a=a+b;

b=a-b;

a=a-b;

是不是只是在表面上不用临时变量?

拿 "a=a+b;"打个比方:变量 a 在assignment的两边都出现,那么一个compiler是

如何编译这个a=a+b的? 除了暗中用一个临时变量,还有其它办法吗?

即这样: 

temp=a+b; a=temp;

也就是说 a 不能同时被用来做加法,而在这个过程中又改变它的值.

更有甚者,(2)中的三行,每行都有一个变量同时出现在assignment的两边,那是不是

compiler要在暗中使用三个临时变量? 如果是这样,岂不是比在程序中明着使用

一个临时变量更糟糕吗?

家园 放到寄存器呀。。。
家园 不管放到什么地方,

都需要一个与临时变量相同大小的内存啊。

所以,不用临时变量的意义又在何处呢?

家园 你说什么?你知道什么是寄存器吧?

他只是举个例子。。。就如你没钱,一分钱你都要珍惜。。。如果你有一百万,随便请我几次客,可能你都会同意。。。搁浪财除外。。。

家园 不就是register吗?我的意思是---

一个有optimzation功能的compiler,

对于

temp =a;

a = b;

b = temp;

这样的简单指令,也可以把temp的值放到register里(放一次),

而并不真正使用一个临时变量。

而对

a=a+b;

b=a-b;

a=a-b;

要放三次。

所以我还是不明白, 不使用临时变量有什么更好处呢?

家园 没什么大好处。。。

他只是假设其他不变,也不作什么OPTIMAZATION(那个功能有没有都是疑问,放正我不知道),如此这般,就可以省点内存(其实现在内存这便宜,没人干这事,当年贵时都没人干)。。。

他只是用这个做例子,讲其他东西。。。你别老钻在这里出不来。。。

家园 谢谢。

btw,一个没有optimization的compiler对于

a=a+b这样一个指令的处理,一般就是把它

编译成temp=a+b; a=temp; 就是暗中用临时变量。

类似这种问题在写一些C++的operators时常常遇到。

也有人写文章,教人怎么尽量避免这种暗中

临时变量。倒不是为了省内存,主要是速度问题。

扯远了,呵呵。谢谢讨论。

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河