请教一个比较抽象的问题,海星等大虾们都来看看啊。。

chxr 2002-05-28 10:52:00
什么情况下二重循环可以改为一重循环呢。
小弟有几次都看到用二重循环解决的问题,实际上一重就
够了,而有的时候似乎又不可以。请问有什么内在的关系吗?
谢谢了。
...全文
81 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
one_add_one 2002-05-30
  • 打赏
  • 举报
回复
如果你实在搞不明白。

你就找两个字符串来 分别用两个程序匹配。
一步一步的跟踪。

就会明白了。
chxr 2002-05-30
  • 打赏
  • 举报
回复
HI.1+1等大虾帮忙看看呀..
ahahai 2002-05-29
  • 打赏
  • 举报
回复
双重循环改单循环,可以找循环数的共同递加关系。
ahahai 2002-05-29
  • 打赏
  • 举报
回复
大同小异,我觉得程序要易懂再优化。
opengl3d 2002-05-29
  • 打赏
  • 举报
回复
存储是线形的,但计算不是
starfish 2002-05-28
  • 打赏
  • 举报
回复
我认为任何循环都可以改成1重循环
因为我们的存储器模型就是线性的
但是你必须找到一重循环的存储器地址x和二重循环的存储器地址(i,j)之间的对应关系,而这种对应关系必须根据具体问题的不同来分析,没有通用的方法。
one_add_one 2002-05-28
  • 打赏
  • 举报
回复
写错。应该是:

int a,b,p[100][100];
for (a=0;a<10000;a++)
(*p)[a]=1;
one_add_one 2002-05-28
  • 打赏
  • 举报
回复
要你这样说任何二重循环都可以改成一重。

比如:
int a,b,p[100][100];
for (a=0;a<100;a++)
for (b=0;b<100;b++)
p[a][b]=1;

改成

int a,b,p[100][100];
for (a=0;a<10000;a++){
b=a/100;
p[a%100][b]=1;
}

有必要吗?

不过改成

for (a=0;a<10000;a++)
*p[a]=1;

比较简单,但还是没有必要,程序的可读性降低了。
one_add_one 2002-05-28
  • 打赏
  • 举报
回复
faint。

该用二重循环的时候就用二重,

该用一重的时候就用一重,谁也不会再加一个循环。

怎么会有这样的问题:(
chxr 2002-05-28
  • 打赏
  • 举报
回复
啊,1+1兄继续继续..呵呵..
qiangqiang1112 2002-05-28
  • 打赏
  • 举报
回复
同意海星的,你可以看看位图的存储情况,多数情况下,我们用一个矩阵来表示位
图,(用2重的)可是在存储或者显示的时候你却可以把他转化成一维数组来表示
这时自然要用一重循环
csw 2002-05-28
  • 打赏
  • 举报
回复
复杂度,能不能分析一下,谢谢了.
one_add_one 2002-05-28
  • 打赏
  • 举报
回复
两个程序时间复杂度是一样的。

实际上第二个程序是模拟第一个的双重循环。

只要程序的时空复杂度低,编写方便。其他都是无关紧要的。
chxr 2002-05-28
  • 打赏
  • 举报
回复
我来具体的说说吧,
比如字符串的模式匹配,用效率最低的那种匹配方式,
我们可以给出下面的程序
commstr(char *t,char *p)
{
int srclen=strlen(t);
int deslen=strlen(p);

int i,j=0;

for(i=0;i<=srclen-deslen;i++)
{
// 一个一个匹配
for(j=0;j<deslen;j++)
{
if(t[i+j]!=p[j])
break;
}
if(j==deslen) return i;
}
return 0;

}
这个是双重循环,思路也很常规.

不过又有一种更加简单的写法
void commstr1(char *t,char *p)
{
int srclen=strlen(t);
int deslen=strlen(p);

int i=0,j=0;
while((i<=srclen-deslen)&&(j<deslen))
{
if(t[i]==p[j])
{
i++;j++;
}
else
{ i=i-j+1;j=0; }

}
if(j==deslen) return i
else return 0;

}

这样看起来又很简洁且只有一重循环,
这个就是我比较迷惑的地方,怎么两者都可以呢,
请大家帮忙看看,谢谢各位.
bary1980 2002-05-28
  • 打赏
  • 举报
回复
我想这是搞汇编的人可以关心的问题,如果让我说,我说不能,因为我们的语言太高级了,已经把底层的问题抽象成逻辑问题,所以你说的情况应该在非常低级的层次用汇编实现,高级语言如果连这个也要考虑,那么实在活得太累。
总之,同意superzjx2000(锥子)
斑竹大哥是不是太操心了
superzjx2000 2002-05-28
  • 打赏
  • 举报
回复
任何循环都可以改成1重循环 就如 starfish(海星) 所说
但 机器语言的魅力就在于 程序员可以站在 逻辑的角度上
更加抽象的考虑和设计问题的解 而不必因于多细节而耗费精力

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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