打印

送10分,求最佳算法。

[复制链接]
楼主: 刘前辈
手机看帖
扫描二维码
随时随地手机跟帖
41
请教刘前辈,这种写法大占用内存了吧?

编译如下:

创建目标 '目标 1'
编译 Text2.c ...
连接 ...
Program Size: data=45.0 xdata=0 code=472
创建 HEX 文件 "333" ...
"333" - 0 个错误, 0 个警告。

---------------------------------------------------------------------------------------

多用了 data=45-44=1 ,   code=472-183=289

使用特权

评论回复
42
123jj| | 2011-5-6 10:09 | 只看该作者
个人感觉,在C语言中,用指针综合效率最高,但结构可能有些不够清晰。

当然,如能适当的插入一些汇编,则能让程序更精简,但移植不方便。

使用特权

评论回复
43
刘前辈|  楼主 | 2011-5-6 10:18 | 只看该作者
本帖最后由 刘前辈 于 2011-5-6 15:14 编辑
30#
题目的确还有错误.0结构后面是4组数据,而非三组.copy 15个数据是肯定得不到这个结果的.应该20个数据


呵,我要是没经过实际运行,我能说123jj正确么?你运行了?有结果了?从结构3到结构5移动了4X5=20个char 数据?!——没运行瞎喊什么。运行过贴出图来给众人看看,谁的BUG。谁在蛙鸣。

我4种算法反复运行了几十遍了,结果都是对的。123jj的程序运行结果也是对的。可惜我这贴不了图;你一次没运行过,到反而如此肯定别人都有BUG ,你移动20次倒正确了?你那是书上写的——移动到数组结尾最后一个字节;
     我没抄书,我要求的是移动到第5结构,后面保留。

     说的再明白点:类似把任务2原来的公有5字节堆栈(0填充表示。)上移给任务5使用。哈,那里现在不是5个0了,但它是空的,归属任务5使用。(是2,4,6,0,0)。
     ——这下更没人看得懂了。只有一个人能看懂——xxxxxx保留他的隐私。

运行前内存映像



运行后内存映像






//

使用特权

评论回复
44
刘前辈|  楼主 | 2011-5-6 11:13 | 只看该作者
38#
LZ意思表达明确,俺试着多写几个字,不知能否说清?

有下面一结构STRUC_a[ ],里面有这么一组数{{1,2,3,0,0},{4,5,6,0,0},{0,0,0,0,0},{7,8,9,1,0},{1,3,5,0,0},{2,4,6,0,0},{3,5,7,0,0}};

现在要求把中间第三组5个0删掉,用后面3组数前移补充,也就是最后结果成了{{1,2,3,0,0},{4,5,6,0,0},  {7,8,9,1,0},{1,3,5,0,0},{2,4,6,0,0},  {2,4,6,0,0},{3,5,7,0,0}};


38楼123jj 一看就懂LZ说的是什么,我想说的是,这些都是基础的基础,如若连数组初始化可以简化,或者什么叫结构数组、数组/结构的指针这样的概念都不知道的话,还能知道什么叫算法?——如若真的需要LZ把问题写到38#-123jj 如此详尽的地步,我还用上来求算法么?

  幸亏论坛上还有123jj,所长,sysdrive(25楼),ccubasa(15楼),icecut 这样一些概念清楚的高手。他们看的懂!否则,一片抱怨声中,LZ 反而成了概念不清的人。

    在上面几位高手的解说下,那些看不懂的人终于看懂了,终于可以把一些基本概念重新学习一遍。看看别人怎么写的算法,看懂了也写一个试试,与别人不一样的才好。世界上很多算法是以发明人命名的,有中国人名字才好。


、、

使用特权

评论回复
45
bnyuli| | 2011-5-6 11:55 | 只看该作者
还有多少个道理 啊

使用特权

评论回复
46
cubasa| | 2011-5-6 12:06 | 只看该作者
欢迎刘前辈再多出点这样的题给我们做做,学到不少东西呢。

使用特权

评论回复
47
ltbytyn| | 2011-5-6 13:02 | 只看该作者
链表

使用特权

评论回复
48
dan.lin| | 2011-5-6 13:22 | 只看该作者
看不懂,帮顶

使用特权

评论回复
49
cecwxf| | 2011-5-6 13:27 | 只看该作者
24# 刘前辈

引用struct的地址 应进行类型转换 即p1=(char *) &struct_a[2];
否则下面的*p++ 只能从a[2] 跳到a[3]  而不是从结构体内部字符地址的增加。

学习了~~~

使用特权

评论回复
50
eydj2008| | 2011-5-6 13:49 | 只看该作者
是要把该集合中的元素全为“0”的子集删掉 还是要把第三个子集删掉?
真有点弄不明白。
看你们的程序就是拿第三个后面的向前移。应该是第二种?

使用特权

评论回复
51
刘前辈|  楼主 | 2011-5-6 14:50 | 只看该作者
本帖最后由 刘前辈 于 2011-5-6 16:07 编辑

回50楼,注意这里省略了一项,完整写法是: p1=&STRUC_a[2].arr1[0];  
显然 &STRUC_a[2].arr1[0]与 &STRUC_a[2] 相等。我认为&STRUC_a[2] 意思更清楚。例如
算法1:
       STRUC_a [i]=STRUC_a[i+1] ;

与算法2比较   for(i=2;  i<5; i++)
                  for(j=0;j <5;  j++)
         STRUC_a[i].arr1[j] =STRUC_a[i+1][j] ;

我坚决不用算法2,是< 还是 <= , 我数不过来。

p1与p2 地址相差5是肯定的,所以不可能p1++=p2;









、、

使用特权

评论回复
52
eydj2008| | 2011-5-6 14:57 | 只看该作者
来个直观的
/*******************************************************************************
* 有下面结构STRUC_a [ ] 这么一组数,现在要求把中间5个0删掉,
* 用后面3组数前移补充,也就是最后结果成了
* 1,2,3,0,0,4,5,6,0,0,7,8,9,1,0,1,3,5,0,0,2,4,6,0,0,2,4,6,0,0,3,5,7,0,0,
idata  struct
{
char  arr1[5];
}STRUC_a [ ]={{1,2,3},{4,5,6},{0,0,0,0},{7,8,9,1},{1,3,5},{2,4,6},{3,5,7}};
//有几种算法?哪个是最佳?也就是 code 最小,data  最少。
*******************************************************************************/
//------------------------------------------------------------------------------
#include <iostream>
using namespace std;
//------------------------------------------------------------------------------
typedef struct
{
char  arr1[5];
} data_typedef;
data_typedef STRUC_a[ ]={{1,2,3},{4,5,6},{0,0,0,0},{7,8,9,1},{1,3,5},{2,4,6},{3,5,7}};
//------------------------------------------------------------------------------
void delstr(void);
//data_typedef *p_delstr(data_typedef *pDataStr,int size1,int n);
void delstr1(data_typedef *pDataStr,int size1,int n);
void Show(data_typedef *pDataStr,int size3);
//------------------------------------------------------------------------------
/*******************************************************************************/
int main(int argc, char *argv[])
{
int sizestr = sizeof(STRUC_a)/sizeof(STRUC_a[0]);
Show(STRUC_a,sizestr);
// SHOW0----------------------------------------
delstr();
Show(STRUC_a,sizestr);
// SHOW1----------------------------------------


// SHOW2----------------------------------------
delstr1(STRUC_a,sizestr,3);
Show(STRUC_a,sizestr);

return 0;
}
void Show(data_typedef *pDataStr,int size3)
{
int size4 = sizeof(pDataStr[0]);
//int size3 = sizeof(pDataStr);
cout <<">>-----------------------------"<<endl;
for (int i=0; i<size3;i++)
{
  for(int j=0; j<size4; j++)
  {
   cout << (int)(pDataStr+i)->arr1[j]<<",";
  }
  cout << endl;
}
return;
}
//--------------------------------------------------------
void delstr(void)
{
char n;
char *p1, *p2;
p1=(char*)&STRUC_a[2];
p2=(char*)&STRUC_a[3];
for (n=20; n>0; n--)
  *p1++ = *p2++;
return;  
}
//------------------------------------------------------------
void delstr1(data_typedef *pDataStr,int size1,int n)
{
int size2 = sizeof(pDataStr[0]);

for (int i=n; i<size1;i++)
{
  for (int j=0;j<size2;j++)
  {
   (pDataStr+i-1)->arr1[j] = (pDataStr+i)->arr1[j];
  }     
}
  
return;
}
  //static data_typedef *pData=NULL;
  //pData = new data_typedef[size1]; //申请内存
  //delete [] pData; //释放内存
/****************************************************************************/

使用特权

评论回复
53
eydj2008| | 2011-5-6 14:58 | 只看该作者
贴上来 就乱了 。。。。

使用特权

评论回复
54
123jj| | 2011-5-6 15:12 | 只看该作者
刘老前辈,您怎么老是拿俺菜鸟的烂例子解剖?那是俺外行胡乱抄的,上不了台面。

请刘老前辈还是多讲解讲解您的标准答案,俺菜鸟坐等着学习捡菜呢~~~

使用特权

评论回复
55
123jj| | 2011-5-6 15:16 | 只看该作者
本帖最后由 123jj 于 2011-5-6 15:18 编辑
回50楼,注意这里省略了一项,完整写法是: p1=&STRUC_a[2].arr1[0];  
显然 &STRUC_a[2].arr1[0]与 &STRUC_a[2] 相等。我认为&STRUC_a[2] 意思更清楚。例如
算法1:
       STRUC_a =STRUC_a[i+1] ;

与算法2比较   for(i=2;  i<5; i++)
                  for(j=0;j <5;  j++)
         
STRUC_a.arr1[j] =STRUC_a[i+1][j] ;

我坚决不用算法2,是< 还是 <= , 我数不过来。


刘前辈 发表于 2011-5-6 14:50



这两个应该是笔误吧?

算法1:
       STRUC_a[ i ] =STRUC_a[i+1] ;

与算法2比较   for(i=2;  i<5; i++)
                  for(j=0;j <5;  j++)
         
STRUC_a[ i ].arr1[j] =STRUC_a[i+1].arr1[j] ;



使用特权

评论回复
56
123jj| | 2011-5-6 15:19 | 只看该作者
呵呵!

不是笔误,是被二姨妈和谐掉了~~~  :L

使用特权

评论回复
57
eydj2008| | 2011-5-6 15:29 | 只看该作者
我们都向 刘老 学习种菜

程序员算法  是内功啊

使用特权

评论回复
58
123jj| | 2011-5-6 15:37 | 只看该作者
回50楼,注意这里省略了一项,完整写法是: p1=&STRUC_a[2].arr1[0];  
显然 &STRUC_a[2].arr1[0]与 &STRUC_a[2] 相等。我认为&STRUC_a[2] 意思更清楚。例如
算法1:
       STRUC_a =STRUC_a[i+1] ;

与算法2比较   for(i=2;  i<5; i++)
                  for(j=0;j <5;  j++)
         
STRUC_a.arr1[j] =STRUC_a[i+1][j] ;

我坚决不用算法2,是< 还是 <= , 我数不过来。


刘前辈 发表于 2011-5-6 14:50



另外,刘老前辈关于只用算法1, 坚决不用算法2 ,说实话,论坛上的任何高手都无法得到刘老前辈送出的这10分,只能请您老自个留着慢慢享用了~~~ :lol

因为,算法2除了写法有点不易读之外,无论在运算速度上,在内存占用上都是最优秀的,最合理的,也就是刘老前辈追求的最佳答案,也就是 code 最小,data  最少

但是,刘老前辈坚决不用算法2 ,错失最佳答案!!!   :L




使用特权

评论回复
59
123jj| | 2011-5-6 15:38 | 只看该作者
有图为证!

第一种算法:






第二种算法:


使用特权

评论回复
60
晴天见雨| | 2011-5-6 15:43 | 只看该作者
来学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则