请解惑:一个空间换时间的例子转换

yanse51 2008-10-22 04:35:57
请大家帮忙解释下,这两个程序究竟咋回事?
程序如下:
void swap(int a,int b)
{
int c;
c=a;
a=b;
b=a;
}


void swap(int a,int b)
{
a=a+b;
b=a-b;
a=a-b;
}
...全文
922 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweetwxh 2011-04-06
  • 打赏
  • 举报
回复
嗯,这是一个简单的例子。
就是说第一个比第二个多了一个变量(额外的内存需求),但是不存在第二个的运算(BTW:计算机算+-的速度比*/的速度还慢),所以速度比第二个快。
zidane_yubo 2008-10-24
  • 打赏
  • 举报
回复
空间时间即矛盾又统一
lzp765 2008-10-23
  • 打赏
  • 举报
回复
学习
aozhi 2008-10-23
  • 打赏
  • 举报
回复
照lz这么写,不会有任何作用.因为是值传递.
ivan8222 2008-10-23
  • 打赏
  • 举报
回复
楼主的第一段似乎有问题
void swap(int a,int b) 
{
int c;
c=a;
a=b;
b=a; //应该为b=c;
}


chyjp2008 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ivan8222 的回复:]
楼主的第一段似乎有问题

C/C++ codevoid swap(int a,int b)
{
int c;
c=a;
a=b;
b=a; //应该为b=c;
}
[/Quote]

LZ真粗心,抄错数据了!
C821215 2008-10-23
  • 打赏
  • 举报
回复
#define Swap( a,b ) a^=b;b^=a;a^=b;

如果心疼一个空间的话,用异或交换得了。何必用加法减法...

chlaws 2008-10-22
  • 打赏
  • 举报
回复
空间就是多申请了一个变量的空间
时间就是运算所需要的时间
帅得不敢出门 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yetyongjin 的回复:]
第一个算法引入中间变量c,直接值交换,简单明了
第二个算法用求和来缓存变量值,然后交换相减,最后达到交换的上的。但如果数值太大,会出现溢出。

此外,因为C/C++参数是值传递的,调用过程参数是拷贝的,出栈后参数值不变,所以这样写的函数调用结果值是不变的应该用指针
void swap(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
}


void swap1(int *a,int *b)
{
*a=*a+*b;
*b=*a-…
[/Quote]
说的很对.
还有.

void swap(int &a, int &b)
{
a^=b;
b^=a;
a^=b;
}

有的面试题会要求不用额外空间.
mqiqe 2008-10-22
  • 打赏
  • 举报
回复
实现同一种方法
只是算法不同罢了

不过好没什么用处的

第二种花的时间长一点

DarknessTM 2008-10-22
  • 打赏
  • 举报
回复
void swap(int& a, int& b)
pingzi_1119 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 plutogod 的回复:]
两种方法都是用来进行变量交换的,当然如果像你这样写的话,因为都是值传递,结果是不会有任何变化的

第一种方式需要多一个临时变量的存储空间(int c),而第二种方式不需要有中间变量,所以从空间上来看第二种方式省了点空间
第一种方式仅需要三次赋值,第二种试工需要3次赋值,外加1次加法,2次减法,所以从时间上来讲明显第一种方式更好

所以说,第一种方式是以空间换时间,第二种方式是时间换空间

当然由于这两…
[/Quote]
这位大哥解释的够清楚!
mifeixq 2008-10-22
  • 打赏
  • 举报
回复
恩,第一个交换算法在栈中需要申请一个4字节的空间,做临时变量用,就是第一个swap中的int c 属于多消耗空间,时间消耗就是三个赋值而已

第二个算法 则是利用 加减法的特点进行数字的交换 进行计算时,消耗了时间,但不需要额外的临时存储空间,但是这个算法不推荐使用,可能溢出……

参考void swap(int a, int b)
{
a^=b;
b^=a;
a^=b;
}

freshairfly 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 yanse51 的帖子:]
请大家帮忙解释下,这两个程序究竟咋回事?
程序如下:
void swap(int a,int b)
{
int c;
c=a;
a=b;
b=a;
}


void swap(int a,int b)
{
a=a+b;
b=a-b;
a=a-b;
}
[/Quote]

首先函数是传值的,调用者起不到交换的作用
其次,第二种方法有问题,如果溢出了怎么办?

再说也不是空间换时间啊,是时间换空间
云梦谭 2008-10-22
  • 打赏
  • 举报
回复
第一个算法引入中间变量c,直接值交换,简单明了
第二个算法用求和来缓存变量值,然后交换相减,最后达到交换的上的。但如果数值太大,会出现溢出。

此外,因为C/C++参数是值传递的,调用过程参数是拷贝的,出栈后参数值不变,所以这样写的函数调用结果值是不变的应该用指针
void swap(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
}


void swap1(int *a,int *b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
lbh2001 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 yanse51 的帖子:]
请大家帮忙解释下,这两个程序究竟咋回事?
程序如下:
void swap(int a,int b)
{
int c;
c=a;
a=b;
b=a;
}


void swap(int a,int b)
{
a=a+b;
b=a-b;
a=a-b;
}
[/Quote]
这个还不能反映空间换时间的问题,只是少一个局部变量而已
真正的是用大量空间换取时间
Longinc 2008-10-22
  • 打赏
  • 举报
回复
一需要物理空间大,一个运算时间多点
plutogod 2008-10-22
  • 打赏
  • 举报
回复
两种方法都是用来进行变量交换的,当然如果像你这样写的话,因为都是值传递,结果是不会有任何变化的

第一种方式需要多一个临时变量的存储空间(int c),而第二种方式不需要有中间变量,所以从空间上来看第二种方式省了点空间
第一种方式仅需要三次赋值,第二种试工需要3次赋值,外加1次加法,2次减法,所以从时间上来讲明显第一种方式更好

所以说,第一种方式是以空间换时间,第二种方式是时间换空间

当然由于这两种方式实际运行速度差别可以忽略不计的,而第一种方式可读性要好很多,所以一般都采取第一种方式
canican 2008-10-22
  • 打赏
  • 举报
回复
第2个比第1个程序少一个整形变量 第2个省空间
第1个执行要快些 第1个省时间
  • 打赏
  • 举报
回复
交换a,b

算法不同而已,看个人爱好了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧