算法启蒙

来源:互联网 发布:淘宝直播代申请可信吗 编辑:程序博客网 时间:2024/04/27 13:58

      所谓算法就是解决问题的方法,一般而言,对于一个问题,肯定

有N种可行的解决方案,但是哪种方法,是最简单呢?哪种方法又是

最有效率的呢?    编程最重要的,最难的地方就是想法,掌握了一

门语言,只是掌握了一种工具,更重要的是对于算法和一些基础知识

的掌握。
       对编程而言,想法很重要,第一次认识到算法的重要性,是去苏

州软件园培训中心的时候,卢宗元给我出了一道简单的编程题目:
       有一个数组int array[10] = {0,1,2,3,4,5,6,7,8,9};写一个

函数对这个数组进行随机变换,生成一个新数组,这个新数组所包含

元素还是从0到9这10个数字,只是所有的数字出现在新数组中位置是

随机的了。
        我当时用的是最笨的办法,用了很多的选择加循环的语句,费了一

天的时间才搞定,然后我把这道题,告诉了另外一个同学,他说:"哦,这

个太简单了吧?",我当时还不相信这道题目真的是像他说的那么简单

,结果他用他的方法,只用了不到一个小时就完全搞定了。
       我当时被打击掺了,震惊了,原来我这么笨啊?其实只是算法的

不同,就可以让问题的复杂度不同,我当时拿到这个题目,想都不想

,就着手写代码,因为觉得这个问题是很简单的用不着动脑筋,当时

的思路是这样:先用随机函数取得新数组的第一个值,再用随机函数

取的数组的第二个值,把第二个值和第一个比较,如果相同则另外取

值,取第三个值时,又需要和前两个值比较,若相同就另外取值,直

到不同为止,要为第N个元素取值时,先要和前面n-1个元素的值比较

,若相同就另外取值,直到不同为止...
       这样子做的话,费力又不讨好,复杂,效率低,可读性差。而别

人是这么来做的,把这个函数看成是从一个口袋里取编了号的圆球的

过程,每次取了一个球后,就把数组的大小减少一个单位。这样的话

,问题就简单得多了。
       初学编程的人,要想学好算法很简单,在学习《数据结构》“排

序”这章之前,可以尝试着用自己的方法写给数组排序的函数。不管

当时你的想法多么低效,一定要用代码实现自己的思路。只要写出来

了,通过和书上的经典算法比较,肯定会有很大的收获。
       后来,我有做了些算法相关的题目,简单点的像,给一个已经排

好序的数组插入一个值的算法,用C写了一个万年历;复杂点的像,n

皇后问题的求解,华容道各种布局的最少步数求解
       n皇后程序完全是根据自己的思路来写的,没有参考任何网上的

资料,不知不觉的用上回溯法(深度优先),第一次知道深度优先原

来是这么回事;后来看了网上关于n皇后的算法,把自己的程序优化

了一下,效率提高了。
       写华容道程序时,首先想到的就是深度优先算法,什么资料也不

看,埋头写了近一千行代码后,好不容易调试通了,发现程序是可以

正常运行的,但是几个小时都不能得到结果,效率低地不能忍受,于

是去网上查,用“华容道与数据结构”这几个关键字搜索到了想要的

资料,受到很大的启发。
       完全改写了华容道程序,算法上用广度优先搜索,用哈希表检索

重复布局,数据结构用链表树,终于写出了效率合格的华容道程序。

我现在的华容道程序,还有很大优化空间,运行速度还可以提高很多

倍,只是人比较懒了,一直放在那里,没有去理会了,现在很想得到

李智广用VC写的华容道程序的原代码,因为他的算法可能是最高效的

,可惜一直没有找到。要想提高还是要一点一点地改良自己的代码最

实在。(解同样的华容道布局,我的程序耗时29秒,李智广的程序耗

时0.028秒,都是用c来编写的程序,差距咋就那么大呢)
    “AI人工智能”可能是算法最为复杂的运用领域了。

 

 

华容道搜索算法研究  许剑伟 2006五一节于福建莆田十中
http://www.fjptsz.com/xxjs/xjw/rj/110.htm

华容道与数据结构
http://www.cnblogs.com/zhenyulu/category/14888.html