打印

C算法大讨论:关于数组移动的,每次都更新一个数

[复制链接]
楼主: gudeng614
手机看帖
扫描二维码
随时随地手机跟帖
21
gudeng614|  楼主 | 2010-5-12 15:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 gudeng614 于 2010-5-12 15:11 编辑

谢谢大家了,6楼的思想我用过,原来是程序的位置有问题,后来解决了。我喜欢13楼的思想,结构很好,但实现方法我还不太清楚,有空列出程序让像我一样的菜鸟学习学习。
再次谢谢各位

使用特权

评论回复
22
gudeng614|  楼主 | 2010-5-12 15:09 | 只看该作者
21楼的程序,可能因为你的N始终为1,所以只有一种度数的转法吧。我不知道你理解程序为什么能转72度吗?

使用特权

评论回复
23
ba.ma.me| | 2010-5-12 20:16 | 只看该作者
通过指针 来取数据或修改数据!! 变化指针就能实现 顶4楼

使用特权

评论回复
24
highgear| | 2010-5-12 20:39 | 只看该作者
居然这么多讨论, 看来这个论坛学过计算机算法的人不多。
circular buffer, array, link list, array list, que, stack, tree 等等都是一个程序员**必不可少**的基本知识, 认真的学习学习, 会有不少收获的, 即便永远呆在 mcu 里。

使用特权

评论回复
25
原野之狼| | 2010-5-13 00:22 | 只看该作者
本帖最后由 原野之狼 于 2010-5-13 00:34 编辑

匠人的点评很好
25楼说的也很有道理
还是得看应用的要求 没有绝对的答案
如果为了简单明了 冷漠大侠已经给出了答案
为了降低时间复杂度 那么就用队列之类的数据结果
队列虽然降低了时间复杂度 但和数组一样具有较高的空间复杂度 因为空间毕竟不是动态的
所以如果应用比较苛刻 那么可以在队列的基础上再加入链表的处理 使得空间能够动态化 同时又能具有较低的时间复杂度

使用特权

评论回复
26
xuyiyi| | 2010-5-13 03:56 | 只看该作者
原野之狼大侠 总结的不错,学习了。

使用特权

评论回复
27
冷漠| | 2010-5-13 08:38 | 只看该作者
挺好的题目。
25楼highgear老师是计算机软件专业的。这个题目用指针实现才算高手,几天过去就等高手出现,highgear老师该出手时就出手。指导我们这些菜鸟大众才是引以为自豪的事。
    我们尊重你,等待你。也等待其他老师讲课。

使用特权

评论回复
28
highgear| | 2010-5-13 09:54 | 只看该作者
"这个题目用指针实现才算高手", 冷漠又开始胡扯了, 别糟践“高手“这个词。

对于搂住 8个元素的定长短数组, 下移是最好的方法, 何况很多cpu 有 block move 指令
对于超长定长数组,circular buffer 是更好的选择。
对于不定长而且支持动态内存分配, 或者要能从任何一点插入数据, 那么链表是最好的选择。

使用特权

评论回复
29
xuyiyi| | 2010-5-13 10:25 | 只看该作者
学习了!

对于搂住 8个元素的定长短数组, 下移是最好的方法, 何况很多cpu 有 block move 指令
对于超长定长数组,circular buffer 是更好的选择。
对于不定长而且支持动态内存分配, 或者要能从任何一点插入数据, 那么链表是最好的选择。

在整个程序处理过程中,指针只不过是一种寻址方法,可优化程序,提高算法的执行效率,请教 highgear老师,这样理解是否正确?

使用特权

评论回复
30
反质子| | 2010-5-13 11:39 | 只看该作者
这不就是堆栈么  后进先出

使用特权

评论回复
31
highgear| | 2010-5-13 20:45 | 只看该作者
30楼 xuyiyi: 对于上面的某些特定算法, 你这样的理解是正确的。 不过, 指针只是 C 中一个运算表达而已, 掌握了并不能就此成为高手, 也不一定就能提高算法的执行效率(效率更体现在算法本身的设计思想和运行环境),但没有掌握一定是低级蔡鸟。

31楼 反质子:
可以认为是堆栈。 不过堆栈在具体实现上, 可以用数组, 也可以是 circular buffer, PC上更常用的是基于链表。

使用特权

评论回复
32
冷漠| | 2010-5-13 21:50 | 只看该作者
本帖最后由 冷漠 于 2010-5-13 21:58 编辑

菜鸟的第二个花样,简单一点,效率高一点。O型血型的人不会光说不练。
#define uchar  unsigned char
#define  Qsize  8
uchar iend;
uchar istart;
uchar  arr[Qsize+1];

void main( )
{
uchar  i=1;
iend=iend+Qsize;
do {
    arr[iend--]=i++;
      
  }while(iend!=istart);
while(1);
}




使用特权

评论回复
33
highgear| | 2010-5-13 22:37 | 只看该作者
冷漠,这种简单的几行代码蔡鸟游戏有什么好练的, 最苯的,不用循环一个个搬动的方法也不过8行而已.你若想练,先把你哭天喊地的按键控制LED"思维挑战"的程序练出来.
 

使用特权

评论回复
34
冷漠| | 2010-5-14 09:15 | 只看该作者

33楼修改:循环数组用法(菜鸟初级学习程序)。

本帖最后由 冷漠 于 2010-5-14 09:20 编辑

33楼冷漠程序的缺陷:iend=istart+Qsize; ???!!!   如果istart初始不为零怎么办?
看菜鸟冷漠玩循环数组:

#define  Qsize  8
char iend;
uchar istart;

uchar  arr[Qsize+1];

void main( )
{
uchar  value=1;
iend=istart;
do {
    arr[(--iend)&0x07]=value++;
  }while((iend&0x07)!=istart);

while(1);
}

使用特权

评论回复
35
highgear| | 2010-5-14 10:02 | 只看该作者
最简单,效率最高的代码:
void BlockMove(char input)
{
a[7] = a[6];
a[6] = a[5];
a[5] = a[4];
a[4] = a[3];
a[3] = a[2];
a[2] = a[1];
a[1] = a[0];
a[0] = input;
}
讨论算法有必要, 但像冷漠这样在一个及其简单的问题弄来弄去, 无怪乎大家称冷漠一伙为脑残。

使用特权

评论回复
36
冷漠| | 2010-5-14 11:35 | 只看该作者

感情“天下第一”就这水平?

本帖最后由 冷漠 于 2010-5-14 17:59 编辑

光说不练的 high 老师终于写了一个程序,真逗,闹了半天,老师连LZ题目的意思还没看懂。要是这么简单,LZ会上论坛来展开什么大讨论?站长,版主还会参与?high老师真是比站长和版主还高明?记得以前还自称过“天下第一”,天下第一只会写 BlockMove(char input) 这么个程序?LZ要求顺序输入8次数据,—— 前次输入数据处理完,再输入下一个数据,一共输入8次,highgear 老师可真快,第一次输入后程序就完成了——这天下第一也实在太高明了,LZ的第二个数据还没出现,high 老师已经8个数据处理完成了!先知道答案,然后写程序?——BlockMove( )程序运行结果除了7个“0”和一个input 值之外,什么都没有,还有7个输入数据哪去了?程序员写好程序至少要运行一下,看看结果与用户要求是否一致。天下第一写程序得不到期望的结果,还不如不写?(难道老师意思是要让用户调用8次BlockMove( ),拷贝一堆没用的0来提高效率?)喊了半天链表,做出来看看,也好让人见识一下老师不是只会嘴上天下第一,空谈理论的人。


使用特权

评论回复
37
lxyppc| | 2010-5-14 12:16 | 只看该作者
本帖最后由 lxyppc 于 2010-5-14 12:18 编辑

个人觉得数据不多用循环直接复制就行了,没必要讨论算法什么的,毕竟人的精力是有限的

25楼说得有些道理,要写程序不是学完语法就行了,这个问题在学了那些“必不可少的基本知识”后根本就是“不是问题的问题”
算法和数据结构才是程序的灵魂
这就像会写字的人不一定写得出书一样

使用特权

评论回复
38
索伦之眼| | 2010-5-14 13:07 | 只看该作者
偶觉得关键是LZ位提问水品欠佳~

使用特权

评论回复
39
冷漠| | 2010-5-14 13:26 | 只看该作者

先知道结果?够老师BlockMove(char input)打字的。

本帖最后由 冷漠 于 2010-5-14 13:39 编辑

来个256字节的,注意第一个输入不是从arr[0]开始的,要是不用循环数组或者队列,恐怕第一个字节应该拷贝的位置都不好确定。现在由程序确定,管它在哪?再假定连续输入300个字节,最后一个字节它应该(拷贝)存储在什么位置?按照BlockMove(char input)程序,应该拷贝到 arr[300] !没这个地址呀。 简单拷贝?256字节的数组如何缓冲300字节数据 ?

使用特权

评论回复
40
xuyiyi| | 2010-5-14 14:02 | 只看该作者
谢谢 highgear老师指点,领悟了更深一层的境界。

使用特权

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

本版积分规则