当前位置: 代码迷 >> C语言 >> 关于动态分配+算法
  详细解决方案

关于动态分配+算法

热度:561   发布时间:2008-05-06 06:30:33.0
还有,既然LZ知道空间复杂度是2^26,那么自然会想到,不要保存已经算出的值,而是马上输出、以上的代所有码,都是一得出一个值,就马上输出的。你想想看,2^26将近70M的内存了。就算是动态分配估计也有点够呛。因为一般的堆并没有这么多,如果要分配这样大的内存,在Win32下需要进行虚拟页分配。
当然,malloc其实还是可以分配这么多的。但是,一则会很慢,二则明明可以想办法降低空间损耗的,何必非要消耗内存呢……
----------------解决方案--------------------------------------------------------
今天一大早就打开帖子!昨天研究大家代码很晚!谢谢各位!
koolism说出提问者有时候的心声!(*^__^*) 嘻嘻……!
也谢谢StarWing83,解决了我的问题!
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]StarWing83[/un] 在 2008-5-6 06:10 的发言:[/bo]

LS的,服了你了。我们就是在讨论这道题的算法嘛。
LZ的代码……你自己看吧,别的不说,第一眼就可以发现,malloc了几次?free了几次??
我们讨论的算法,二叉树一种,递归一种,计数一种,二进制三种,二分法一种,给出了一共七种方法解决这道 ...



提问者问你这道题的算法了吗?请看他的问题:

“我用固态分配数组空间,可以实现的(算法应该正确),但要p[2^26]这么大的空间,浪费!
用动态分配(代码如上),怎么输出乱码?怎么回事????
求高人!”

你说:“LZ的代码……你自己看吧,别的不说,第一眼就可以发现,malloc了几次?free了几次??”
可是楼主不发现啊?所以我们应该引导楼主去发现、去解决,而且这是他自己写的代码,肯定也花
了心思,并且他认为“我用固态分配数组空间,可以实现的(算法应该正确)”,如果他自己写出
代码能解决问题,心里肯定会有成就感,不管他的代码有多繁琐,然后就是和你们那些“优化”的
代码算法作比较并从中汲取更好的算法。
如果一来就拿你们的代码,而他自己写的代码问题没解决,心里肯定有点失落感,这个我相信很多人
都有这样的感受...
   你也不用动不动就服了谁谁谁?你就这么容易服人吗?
   我只是提出我的一点建议,我图什么??难道这个论坛上的人都不能听别人的一点建议吗?
   我不牛,你们很牛,我写不出你们那样好的代码。所以说我是初学者,我只是提出一点作为
初学者的心声,我们初学者写出的即便是繁琐的代码只要能解决问题,我们心里是很高兴的...
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]lnhaing[/un] 在 2008-5-5 22:25 的发言:[/bo]

似乎回来晚了!
各位 程序写的很精妙!谢谢!
先学习了!
但是 好像 没有解决我的问题!为什么我程序不行!
继续求――――――――??


...大家来说说想法吧,要是大家都觉得我提出的建议不好或者误人子弟,我向你们道歉!!

[[it] 本帖最后由 koolism 于 2008-5-6 08:53 编辑 [/it]]
----------------解决方案--------------------------------------------------------
问题是光循环的话很难解决..而且大家一起进步..谢谢楼主提供的问题...看懂别人的程序也可以提高的...
----------------解决方案--------------------------------------------------------
呵呵,可是所有回复当中没有一个于提问者的问题有关,他的程序哪里错了?为什么
输出是乱码?没有人告诉他...
所以“但是 好像 没有解决我的问题!为什么我程序不行!
      继续求――――――――?? ”
"看懂别人的程序也可以提高的"这是肯定的!
----------------解决方案--------------------------------------------------------
输出是乱码,这点真的不知道,程序的风格整体很乱……额……我看了五分钟,实在没看出来名堂……
唯一比较明显的错误是内存泄露,上面已经说了……
只是稍微看出来,LZ似乎是想根据“两个相同字母的中心是同样的字母”这个规律来……
非要去整理楼主的代码的话,建议楼主
1 先画出流程图
2 确保分配一次,释放一次,即不要将malloc放到循环里面去。
3 仔细思考,自己的方法依赖的原理是什么,能不能用自然语言描述出来,描述的过程是不是流程图所表示的过程。
这样自己分析,应该知道错误在哪儿了。看别人的代码总是有点不太明白的。还是自己写的最清晰。所以也需要自己去分析,这一点,别人很难帮上忙(因为大家都在学习中嘛,呵呵)
建议就这么多。还是希望看看大家给出的算法,然后了解思想(代码写的都很清晰啦)如果不懂可以回帖问。
To LS 你表达观点是你的事情,当然也有道理,以后我会注意的。不过当然我也有坚持自己做法的自由咯,嘿嘿~~~不管怎么说,看楼主怎么处理吧……
----------------解决方案--------------------------------------------------------
再次感谢StarWing83!
看了大家的代码,我的代码不算程序代码了!敲入Z,CPU达到100%,想想我的代码!汗
想不到大家这么热情,各种思路百花齐放,我想大家最希望就是这种效果!我以后也多提供这些题目,多多向各位请教!讨论推动算法进步!
最后还是问个题目:
燕子那个代码是根据什么思路来的:
程序代码:
while (d<=n)
        {
            putchar('A'+d);
            ++str[0];
            for (d=0; str[d]>1; ++d)
            {
                ++str[d+1];
                str[d] = 0;
            }
        }

在纸上画了一大推,貌似明白,又不~~~
----------------解决方案--------------------------------------------------------
呵呵,以上其实是模拟加法

[color=white]
----------------解决方案--------------------------------------------------------
和我的差不多..模拟二进制数的进位..
1111111111111   d=0  A
2111111111111   d=1  B
1211111111111   d=0  A
2211111111111   d=2  C
0021111111111   d=0  A

[[it] 本帖最后由 sunkaidong 于 2008-5-6 12:42 编辑 [/it]]
----------------解决方案--------------------------------------------------------