写在前面的话:
学习算法,需要做的是领悟算法思想、理解算法对内存空间和性能的
影响,以及开动脑筋去寻求解决问题的最佳方案。
正文如下:
第1章 算法概述
1.1.2 什么是算法
算出1+2+3+4+5+6+7……一直加到10000的结果,算不完不许回家!
(1+10 000)×10 000 ÷ 2 = 50 005 000
所采用的这种等差数列求和的方法,被称为高斯算法。
在数学领域里,算法是用于解决某一类问题的公式和思想。
计算机科学领域的算法,它的本质是一系列程序指令,用于解决特定的
运算和逻辑问题
算法有简单的,也有复杂的。
简单的算法,诸如给出一组整数,找出其中最大的数。
复杂的算法,诸如在多种物品里选择装入背包的物品,使背包里的物品
总价值最大,或找出从一个城市到另一个城市的最短路线
算法有高效的,也有拙劣的
刚才所讲的从1加到10000的故事中,高斯所用的算法显然是更加高效的
算法,它利用等差数列的规律,四两拨千斤,省时省力地求出了最终结
果。
而老师心中所想的算法,按部就班地一个数一个数进行累加,则是一种
低效、笨拙的算法。虽然这种算法也能得到最终结果,但是其计算过程
要低效得多。
在计算机领域,我们同样会遇到各种高效和拙劣的算法。衡量算法好坏
的重要标准有两个。
时间复杂度
空间复杂度
1.1.3 什么是数据结构
数据结构是算法的基石。如果把算法
比喻成美丽灵动的舞者,那么数据结构就是舞者脚下广阔而坚实的
舞台。
数据结构,对应的英文单词是data structure ,是数据的组织、管理和
存储格式,其使用目的是为了高效地访问和修改数据。
数据结构都有哪些组成方式呢?
1. 线性结构
线性结构是最简单的数据结构,包括数组、链表,以及由它们衍生出来
的栈、队列、哈希表。
2. 树
树是相对复杂的数据结构,其中比较有代表性的是二叉树,由它又衍生
出了二叉堆之类的数据结构。
3. 图
图是更为复杂的数据结构,因为在图中会呈现出多对多的关联关系
关于算法在不同数据结构上的操作过程,在后续的章节中我们会一一进
行学习。
1.2.1 算法的好与坏
时间复杂度和空间复杂度究竟是什么呢?首先,让我们来想象一个场
景。
某一天,小灰和大黄同时加入了同一家公司
一天后,小灰和大黄交付了各自的代码,两人的代码实现的功能差不
多。
大黄的代码运行一次要花100ms ,占用内存5MB 。
小灰的代码运行一次要花100s ,占用内存500MB 。
于是……
在上述场景中,小灰虽然也按照老板的要求实现了功能,但他的代码存
在两个很严重的问题。
1. 运行时间长
运行别人的代码只要100ms,而运行小灰的代码则要100s,使用者肯定
是无法忍受的。
2. 占用空间大
别人的代码只消耗5M