打印

送10分,求最佳算法。

[复制链接]
楼主: 刘前辈
手机看帖
扫描二维码
随时随地手机跟帖
21
谈的元| | 2011-5-5 20:22 | 只看该作者 回帖奖励 |倒序浏览
看懂的是神

使用特权

评论回复
22
sysdriver| | 2011-5-5 21:10 | 只看该作者
看了几遍,还是不懂,不得不怀疑自己的理解能力。

使用特权

评论回复
23
刘前辈|  楼主 | 2011-5-5 21:20 | 只看该作者
看不懂就对了。这是《数据结构》教材最基础的数组元素删除函数问题。优点……
缺点是要移动多少元素。——这叫线性表的顺序存储。

然后是链表,优点是不需要移动元素,缺点是……。——这叫线性表的链式存储。
两者优缺点互补。

由此入门《数据结构》了。


所长应该来讲课了。

、、

使用特权

评论回复
24
刘前辈|  楼主 | 2011-5-5 21:25 | 只看该作者
本帖最后由 刘前辈 于 2011-5-5 21:27 编辑

123jj是神?
我能否在简化一下,都可以的;多多指教。

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}};
// 输出---->{{1,2,3},{4,5,6},{7,8,9,1},{1,3,5},{2,4,6},  {2,4,6},{3,5,7}};

void main(void)
{ char n;
  char *p1, *p2;
  p1=& STRUC_a[2]; p2=& STRUC_a[3];
  for ( n=15; n>0; n--)
   *p1++ = *p2++;
while(1);
}


、、

使用特权

评论回复
25
sysdriver| | 2011-5-5 22:30 | 只看该作者
终于理解了,真不容易啊。一般来说,单个成员不常用结构体,而且还是一个结构数组。
(1)这是一个结构数组,有点像二维数组,[7][5]。
(2)初始时是省略了0,完整的是{{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}}
(3)要求就是,把中间5个0的那一成员删掉,后面3组向前移动。前面的解法是设2个指针,移动3*5个元素。

不知这样是否可以,没运行
for(i=2;i<5;i++)
{
      for(j=0;j<5;j++)
     {
            STRUC_a[i].arr1[j] = STRUC_a[i+1].arr1[j];
     }
}

使用特权

评论回复
26
流行音乐| | 2011-5-5 22:30 | 只看该作者
123jj的算法与五个零没有一点关系,如果楼主认为该算法可行,那根本就没必要在题目中提及五个零。
此外,楼主对问题的描述确实让人很难明白。

使用特权

评论回复
27
123jj| | 2011-5-6 05:17 | 只看该作者
123jj是神?
我能否在简化一下,都可以的;多多指教。

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}};
// 输出---->{{1,2,3},{4,5,6},{7,8,9,1},{1, ...
刘前辈 发表于 2011-5-5 21:25



谢谢刘前辈指点,其实俺啥都不懂,最多了解一点皮毛~~~
您看,连这 p1=& STRUC_a[2];都不会写,
未尾 while(1);都遗漏,俺C语言考试一定不及格~~~ :lol


很久以前,在一个网站上,看到有网友组织搞开源的PLC,前后有两批人马在搞,最终都流产,无功而终,俺觉得这玩意儿超级简单,也跟着起哄,带头组织网友DIY开源的PLC,硬件有网友认领,下位机PLC监控主程序没网友站出来认领,结果没办法,对C语言一巧不通的俺,依靠抄书的一点小本事,抄马潮老师编写的好书《AVR单片机嵌入式系统原理与应用实践》中的C语言实例和写法,东凑西拼,搞了个PLC监控程序,分解释型和编译型2种,也算交了个差,没像前两批人马,无功而终,成为先烈~~~ :lol

那时,才对C语言大致有点了解,  到现在已忘的差不多了,都还给马潮老师了,呵呵 ~~~

使用特权

评论回复
28
123jj| | 2011-5-6 05:49 | 只看该作者
这次受匠人委托,组织搞个了开源的《DIY两轮平衡小车》,匠人非常热心,向二姨申请了DIY开源资金,再此表示感谢~~~

因这段时间工作比较忙,忙于俺的本职工作,救火与打杂,故一直没时间开工动手,感谢老王,二姨家的老王斑竹,一个激将法,让俺在不到一个月的时间内,从硬件设计、PCB布板与制作、元器件选购,机械零件定型定购到最后一刻,在21ic上海网友会上成功向网友们赠送。也让俺这个从没学用过,怎样用AD09布一块PCB板的俺,学会了如何使用AD09,  尽管很生疏,  但总算了解了一个皮毛而毛,再次感谢老王斑竹~~~


在二姨家认识您刘前辈也是一种缘,俺不知什么原因,您和俺未曾谋面的所长有什么过节,所长和您刘前辈的C语言都比俺强上数千倍,是俺学习的榜样,希望在二姨家,一切以和谐为大~~~

很想送您一套《DIY两轮平衡小车》,不知是否愿意接受?
您有什么火,希望您发在《DIY两轮平衡小车》上,搞出点名堂出来,真金实银的干一场,总比那些打口水仗贴强多了,将您的手艺和技能拿出来晒一晒,将是21ic二姨之福、网友之福、菜鸟之福。

使用特权

评论回复
29
icecut| | 2011-5-6 07:07 | 只看该作者
看数据结构都是7年前了.
最好的办法是redesign

把最后的五个搬过去.时间上最快.

你们以上所有楼的代码都有bug,就是最后那个数组没有init.仅仅往前复制了.残留数据还有副作用.

使用特权

评论回复
30
icecut| | 2011-5-6 07:08 | 只看该作者
本帖最后由 icecut 于 2011-5-6 07:14 编辑

题目的确还有错误.0结构后面是4组数据,而非三组.copy 15个数据是肯定得不到这个结果的.应该20个数据

建议楼主修改如下:

一个数组unsigned char a[x][5],如果全0,则需要删除,后面的往前补.在一个关闭idcache的32bit处理器上完成.要求速度最快,代码量最少.可以用x86汇编,不考虑多核心与多发射
样例
unsigned char a[4][5]={{0}, {1,2,3,4,5}, {0},{5,4,3,2,1}};
调用方式
void check(unsigned char **a, 4)
{}
返回结果
a[4][5]={{1,2,3,4,5},{5,4,3,2,1},{0},{0}}

使用特权

评论回复
31
123jj| | 2011-5-6 08:31 | 只看该作者
icecut大虾高见!

改的题目表达的是很清晰,只是修改了LZ的题意~~~ :L

使用特权

评论回复
32
zhuyi2576| | 2011-5-6 08:35 | 只看该作者
看这个表达的意思,看了半天没明白,实在看不下去了

难道搞技术的文字水平真的这么差吗?

使用特权

评论回复
33
zhuyi2576| | 2011-5-6 08:43 | 只看该作者
本帖最后由 zhuyi2576 于 2011-5-6 08:46 编辑
有下面结构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];
...
刘前辈 发表于 2011-5-5 16:09


看的崩溃,,实在没看到中间有5个0,,倒是看到你输出结果有13个0

你上面的最后结果还这么多0,,你是指不输出东西还是就要输出0,,,如果不要输出,你就不要打0,不要担心别人看不明白。就和以前老师教的,不要写那么详细,不懂的看了也不懂,懂的不用这么废话也懂,,呵,我是不懂的

使用特权

评论回复
34
hxy6951| | 2011-5-6 08:48 | 只看该作者
数组的长度不能改变,全为零的那一组数不可能删了,只能移动位置或被别的数组代替。

使用特权

评论回复
35
425171513| | 2011-5-6 09:08 | 只看该作者
大家好

使用特权

评论回复
36
425171513| | 2011-5-6 09:08 | 只看该作者
我是新手,望多指教

使用特权

评论回复
37
425171513| | 2011-5-6 09:09 | 只看该作者
只求积分,还下载点前辈的东西

使用特权

评论回复
38
123jj| | 2011-5-6 09:10 | 只看该作者
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}};


附变化前和变化后的数据对比:
变化前数据:{{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}};
将上述蓝色字体的3组数据前移,复盖前5个绿色的0数据,得到下面红色字体的数据
变化后数据:{{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,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}};

有几种算法?哪个是最佳?也就是 code 最小,data  最少。

使用特权

评论回复
39
刘前辈|  楼主 | 2011-5-6 09:10 | 只看该作者
本帖最后由 刘前辈 于 2011-5-6 10:24 编辑

34楼说的对,严格讲第3个结构是用后面的结构数据永久覆盖了。——没有备份contex。所以数据结构概念称为delete(  )。

数据结构中数组的长度可以动态增长改变——realloc( ),例如在LZ的结构数组中再插入一个或多个同类结构时,数组(顺序表)就要求必须动态增长了。

在C51中,realloc(),malloc( )等是申请Xdata内存的,所以LZ的初始结构就应建立在xdata区 xdata  struct。

、、

使用特权

评论回复
40
刘前辈|  楼主 | 2011-5-6 09:43 | 只看该作者
本帖最后由 刘前辈 于 2011-5-6 09:47 编辑
  31#
icecut大虾高见!

改的题目表达的是很清晰,只是修改了LZ的题意~~~



123jj 高见,像这种题目,求的是算法 所谓算法和数据结构元素里的数据有什么关系?!——如若把所长,chunyang,版主这些高手请来看看,他们会关心123456后面有几个0 ?有几个0你能决定算法不同?有80个“0”算法也是一样!——写5个0只是为了调试时方便观看运行(覆盖,删除)效果。
          还有135,246,357等,纯粹是一堆便于观测,表示顺序表内容的随机数据,随便移动位置?那还叫线性顺序表么?


下面我写一个算法,看看和元素内容有关否?

main(void)
{
char  i;
i=2;
while(i<5)
{
STRUC_a [ i ] = STRUC_a[ i+1];
i++;
}
while(1);
}

和结构元素内容有多少个“0”有什么关系?!

待续……
、、

使用特权

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

本版积分规则