1.求一个算法思想
思想:
用2个数组,一个是最后要求的答案,即a数组,另一个b数组里面放1~9的值。用随机函数生成1~9之间的随机数,然后将该随机数作为b数组下标,将该元素的值赋给a数组第i位。然后用b数组中的最前/最后1个元素来覆盖刚才随机抽取的元素。同时,要求下次生成随机数的条件是随机数>i。
可能写的不太清楚,以下提供了参考代码:
public class demo {
int[] a;
int[] b;
public demo() {//构造器
a = new int[9];
b = new int[9];
for (int i = 0; i
2.怎样学习算法
c++要比c语言难的多,每个人学习新的东西时都会感觉到乱的,等你感觉不到乱的时候,可以说你已经入门了或者说已经掌握了,一下接触许多陌生的名词就会感觉乱的,一定的沉得住气努力的学下去,有许多人在中途放弃c++就是辅助课程就把人给搞烦了,高数里要用到傅里叶级数,微分积分等,你两本高等数学都的学,c语言的知识就不多了,了解就行了,数据结构和算法你可以看看清华大学编的数据结构(c语言版的),这本书上数据结构和算法都有。
高等数学和c语言你一起看,看完了你在学c语言和数据结构和算法,最后学c++,c语言里的函数一定要学会,数据结构和算法都要用到这些。
虽然不好学,努力坚持学习下去,你一定会成功。
3.如何写一个算法
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。
一个算法应该具有以下五个重要的特征:
1、有穷性: 一个算法必须保证执行有限步之后结束;
2、确切性: 算法的每一步骤必须有确切的定义;
3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;
4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题:
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题:
1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二*树)上?如果不是,则要自己设计数据结构。
2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,排序。)3.
分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要设计出合理的参数表以及递归结束的条件,则基本上大功告成.)4.
继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时间.5.
通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.6.
确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.7.
举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题.
8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。
9. 撰写思路分析,注释.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------看不懂,还是不明白,有谁清楚告诉我啊,
4.我如何才能学好编程思想
最近很多人都在问如何学习编程。我觉得学习编程最重要的是入门,如果你入门的时候有一个好的方法和思路,打下比较扎实的基础,对今后的编程工作是很有益处的。即使在学习新的编程语言也无所谓,因为它们有很多相通之处,可以相互借鉴。
我认为可以先学习一下pascal,这个语言比较严谨,适合初学者。pascal它被称为教学语言,结构严谨,不像C语言那么灵活,易于理解和学习。 然后可以继续学习C语言,这个语言比较灵活。有了pascal的基础,在进行C语言编程就不会因为C语言的灵活而有问题 。后面的就可以学习VC什么的了。
C语言的书推荐谭浩强的,比较好。
我当时学习pascal和C语言的时候是将书后的习题都做了一遍,感觉效果很好。
当然了,学习什么语言也要看你具体准备从事什么行业。例如你要进行嵌入式开发,C就是很好的选择,如果是Windows开发,那么VC就不错。还有数据库方面的开发、网络开发等等。不同的语言适合不同的方面。要看自己的选择的,呵呵 。
还有很多人说自己的基础很差,甚至中学毕业什么的。其实这个并不重要,比较说英语,在计算机语言里所用到的单词量很少,而且都是常用词,经常使用就记住了。当然,如果你要看原文资料或者帮助的话,专业词汇比较多,不过在金山词霸的帮助下,经常看,也是没什么大的问题的。至于数学什么的,其实数学只是培养你一个逻辑思维能力,在初学编程的时候影响不是很大。况且,作为一个基础编程人员来说,上面还有系统分析师、项目经理,他们会把需求分析、概要设计和详细设计做好的,你只要按照文档写代码就OK了。不过,要上更上一步的话,其他基础知识就非常重要了,毕竟你不能写一辈子代码。
在你学习好C语言以后,个人建议好好学习一下数据结构和软件工程。这两门对你的水平提高都是很有帮助的。特别是软件工程,它能够使你按照科学的工程方法进行软件开发,对今后的发展很有好处。
只是一家之言,有不到之处,还望见谅!
参考资料:
5.《人生的算法》作文 有范文吗
几年前的一次算法考试,准备写篇文章上去的,可惜考试的时间太短,做完那些题目后,已经没有时间了。
于是写给了自己,近日翻了出来,给大家分享,请大家批评指正。 算法与人生,看上去没有什么联系,其实不然。
算法是由若干条指令组成的有穷序列。人生是由若干指令(去吃饭、去睡觉、去工作等)组成的有穷序列。
算法有零个或多个由外部提供的量作为算法的输入。人从生下来开始就不断地接收来自于自然界、社会各种信息。
算法产生至少一个量作为输出。人生当中的输出也至少有一个,包括物质的和精神的。
组成算法的每条指令是清晰的,无歧义的。组成人生的指令也是清晰的,不过由于硬件具有很大的不稳定性,执行起来会造成误差。
算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。 人生中的每条指令当然也如此。
算法分析的目的在于分析算法的复杂度,从而改进算法,使算法能够使用尽量少的资源(时间、空间)完成算法的计算,得到结果。每个人的人生都有一定的目的,不管这个目的是高尚的还是庸俗的,也不管这个目的是宏伟的,还是渺小的。
每个人都为了这个人生目的而奋斗,有的人在奋斗过程中不断分析,寻求更好的方式达到目的,有的人按部就班的前行。当然不会思考的人获得成功的可能性是很小的,所以相对应于算法分析,这里提出人生分析。
如同算法分析一样,人生分析的目的在于分析如何目前的现状,使用最少的资源(时间、金钱等)达到自己的目标。 所以说,人生如算法,算法分析也就是人生的分析。
无论从宏观的角度来看,还是从微观的角度来看,算法中最重要的一个指令是“选择”,人生也如此。算法寻求结果是通过try出来的,人生也是try出来的,说得通俗一点,人生是摸索出来的,说得更科学一点,人生是探索出来的。
如果人生的目的是排好序的,那我们没有理由从小到大一点一点去try,如果有共n个目的,那么平均要试n/2次,但以选择二分查找法去寻求自己所追求的那个目的,平均只需要logn次。可惜假设不成立,但是人生中的很多事情是可以通过二分查找法来进行改进的,大家应该知道,人生中很多事情不是只有两种答案,一种是0,还有一个是1,正确的答案往往在0和1中,而且根据不同的外部输入,答案也不同,换句话说,只有把握好了一个度,才能处理好。
这样的例子人生中太多。 人生是复杂的,复杂得我不知道人生是否属于NPC,或者说这里用“属于”这个词是否正确我都不能明确。
但有一点可以确信,人生中应用了各种算法。 分治算法。
这是用得最多的,而且也是最直观的。社会的进步,造成了社会的复杂,复杂得依靠个人能力已经不能去解决,那么此时,我们通常采用的方法就是,大事化小,小事化了(呵呵,后半句不要)。
为什么化小啊,为了小到能够让个人能够去完成啊,是不是只要化小就可以了呢?当然不是,划分时还得注意划分的规模,如果一件事情需要10天完成,你分给A、B两个人,A,70%, B,30%,那么最终需要7天才能完成,如果A,50%, B,50%,那么5天就能完成。还有一点要注意,A和B的工作完成后要能够准确的接上。
呵呵,这是管理学中的方法,其实这就是分治了。分而治之,治而合之。
动态规划。货郎担问题够通俗话了吧。
什么,你没有用到,呵呵,其实每个人在无形中都用到了该算法(计算得准不准确另当别论)。比如有时候想上街去买东西,要去一个地方买鞋子,还要去另外一个地方买衣服,再去另一个地方买点吃的,最后回家,出门前你都会盘算一下应该先去哪里,再去哪里,怎样走线路会更近一点,会节约更多的时间。
这个时候你就用到了动态规划。忘了说非常非常重要的一点,动态规划在计算过程中一定要保留已经计算过的数据,避免重复计算。
没有这一点,就是穷举算法,有了这一点就是动态规划算法,没有这一点,你也能成功,但是你的花100年,有了这一点,你可能只需花10年。人生何其短,有多少时间能让你重复计算? 贪心算法。
拥有贪心算法思想的人肯定不是一个战略家,因为他只注重当前利益。不过拥有贪心算法思想的人肯定是一个最开心的人,因为他得到的总是当前最好的。
在这个世界上,我想大多数人和我一样贪心。 回溯法和分支界定法。
这两个算法是体现try思想最明显的了。不就是解决问题吗,我去先去按这条路走一走,走不通,再试一试走另一条路,呵呵,走通了,这个方法是最好的方法吗,还有没有更好的,在去试,试,试,呵呵,找到一个更好的方法,难道人生不是这样的吗?不过有一点要注意,不要盲目的试,要学会在试之前对这种方法进行判断,如果明显不行,就没有必要再试了,以免浪费时间。
虽然人生如算法,可是千万别严格的按照算法去生活,当你每天一成不变的按照你计算的从家到公司最近的线路来来回回的时候,不妨偶尔绕绕路,你会发现不同的风景,毕竟,我们是在生活,不是在做算法考试,不会因为没有达到最优而扣你的分:)。
6.请教编程高手:如何培养编写算法的思路
选一本出色的教材.有条件就看英文的,然后给自己一个环境,例如LINUX+GCC+GDB,用纯粹的语言去在解决问题的过程中学习算法. 没有目的性去学习,往往效率不高,可以找一些ONLINE JUDGE的题目做做.例如Welcome To PKU JudgeOnline,对着里面的问题,先自己思考,尝试编程解决,如果不能解决,就翻翻算法书,想想为什么. 如果还是不行,那就上网看看别人有没有解决掉,怎么做,看看他们用到什么算法,比对着,然后进一步自己去实现. 有时候对于算法的问题的实现,你在实现之前也许会卡住,但是在编程过程中,随着你的锻炼和熟练度的提高.会有那么一天你觉得什么都通了,而且,你是在用的过程中学习.坚持走下去,一定事半功倍. “cracking the coding interview”,题目是按照array, stack&queue, 链表,树图,递归这种章节安排的,每章节题目7-8个,不多,难度中等,找感觉很有帮助。
第一遍自己写不出来的话(我就是,这么弱!),画图分析,抄背默。一遍做完再做一遍,第二遍就快很多,理解也深刻了,所谓读书百遍,其意自现,算法也一样。
不要一开始就看《算法导论》,这本书有太多关于算法的数学证明. 推荐你看看这本:算法(第4版) (豆瓣),作者是高德纳的学生:塞奇威克 (Robert Sedgewick) 书中算法代码主要是用Java编写,里面有大量的图来让你明白例如:排序,查找,树和图的算法运行过程。 这本书的目录编排也很清晰,他就告诉你算法主要就可以分为:排序,查找,图和字符串。
从这4个方面可以演化出很多算法,最关键是:这本书的作者不但是在告诉你what,而且告诉你why(分析各种算法的优缺点) 这本书其他好的地方 比如讲到快速排序,很多书可能讲了快速排序的原理就完了。但这本书就直接讲了原始的快速排序可以改进的地方:1. 在小数组上,切换到插入排序;2. 三取样切分;3. 三向切分的快速排序。
优先队列怎么和排序算法扯上关系呢?其实优先队列就是可以用堆排序来实现,堆排序的时间复杂度和快速排序是一样的,但是实际中为什么堆排序的运行时间要比快速排序多呢?因为这和CPU的Cache命中率有关系,堆排序不符合算法运行的局部性原则 比如书中2.5节,讲了排序算法的实际用途,这本书不光告诉你算法的原理,还告诉你算法的用途。