前言
很多非科班和科班的朋友看到算法就头疼,因为这东西学起来困难,也不常用,唯二的两个做用,面试和装B,一个能赚钱,一个能爽,但是学习路线太过陡峭,不是不想学,而是感觉入地无门。 其实凡事都有技巧,难是因为不够了解它,就好像追不到女孩子其实不是你不够好,而是你不够了解对方。 当然,开篇严肃一些,后面会慢慢把一些不容易理解的,化繁为简,包教包会,不会不退学费,本来也没人给我钱^.^。
首先我先说明我对学习的观点,学习一项技能,没有聪明之分,只有用不用心。 如果在自己没有达到可以称之为努力的程序,千万不要跟自己谈天赋,自己学没有达到能谈天赋的地步。 如果实在学不下去,不要骗自己,你就是抗拒学习这件事,而不是学不会。
如果算法还没有到了让你非学不可,也不要骗自己,是浪费时间。还不如去玩游戏、陪女朋友。但是如果现在非常迫切,已经到了非学不可,比如考试、面试,那就逼自己一把,不要轻易放弃自己。
一、数据结构和算法
数据结构
是计算机存储、组织数据的方式。 数据结构往往同高效的检索算法和索引技术有关。
数据结构在计算机科学界至今没有标准的定义。 通常: "数据结构是数据对象,以及存在于该对象的实例合组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。" 例如数组、集合、栈、队列、树、图都是数据结构。
算法
是在有限步骤内求解某一问题所使用的一组定义明确的规则。 通俗点说,就是计算机解题的过程。 在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。 一个算法应该具有以下五个重要的特征:
- 有穷性: 一个算法必须保证执行有限步之后结束;
- 确切性: 算法的每一步骤必须有确切的定义;
- 输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;
- 输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
- 可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
二、问题规模
就是所要解决的问题,它的规模。 1 2 3 是一个规模 1 2 3... 10 是一个规模 问题规模与核心操作次数,决定了这个算法的复杂度。
三、时间复杂度 和 空间复杂度
这两个概念应该是很多非科班出身的程序员最难理解的,网上很多文章都讲的太云里雾里,其实没有那么难,化繁为简的讲明白才有用。 这两个概念就是的意义是什么才是关键,后面专门去说这两个概念。
总结
总体现,只需要先了解这么多即可,慢慢推进。 学习的第一步是在于不要骗自己,真的要学习,好好静下心来学习。