算法和数据结构概述
什么是算法
- 大家小时候听过的关于1+2+3+4+5+…+10000的故事。高斯用一个公式很快就将他算了出来,这就是算法。
- 定义:一系列程序指令,用于解决某一类问题的公式和思想
- 算法有简单的,有复杂的
- 简单:找出一组数中的某个数
- 复杂:一个城市到另一个城市的最短路径
- 算法有高效的,也有低效的
- 如高斯的公式是高效的,而慢慢加是低效的
- 衡量标准:时间复杂度和空间复杂度
- 应用领域
- 运算:找两个数的最大公约数,两个大树相加
- 查找:查找某个数
- 排序:信息显示有很多需要排好序
- 最优决策:找到最优路径
什么是数据结构
数据结构(data structure):数据的组织、管理和存储格式。其目的是为了高效地访问和修改数据。
数据结构是算法的基石。很重要,一定要掌握好。
数据结构有哪些组织方式呢?
- 线性结构:数组,链表,栈,队列,哈希表
- 树:二叉树,二叉堆
- 图
- 其他:从基本数据结构而来,用于解决特定的问题,如跳表,位图等。
时间复杂度
-
衡量算法的好坏标准:时间复杂度和空间复杂度(运行时长和占用空间)
-
定义:一个算法运行时间长短的度量
-
程序的基本操作执行次数,常见的四种方式:线性,对数,常量,多项式
-
时间复杂度,大O表示法。
-
就是把程序的相对执行时间函数T(n) 简化为一个数量级
-
原则:
-
如果运行时间是常数量级,则用常数1表示
-
只保留时间函数中的最高阶项
-
如果最高阶项存在,则省去最高阶项前面的系数
-
-
-
时间复杂度很重要,一般来说,比空间复杂度要重要
空间复杂度
-
一个算法运行过程中临时占用存储空间大小的度量(有时会根据需要,会存储一些中间数据)
-
例子:n个整数中,有两个重复,找出两个重复的整数
法一:双重循环,遍历数组,不断回顾之前的数,看看有没有相同的。时间复杂度O( n 2 n^2 n2)
法二:加入中间数据,一个“字典”。key为整数的值,value为整数出现的次数。这个“字典”也叫散列表。
- 读“字典”时间复杂度为O(1),因此整个算法时间复杂度为O(n),因为只用遍历一次数组
-
空间复杂度如何计算:
-
常量空间:空间大小固定,与输入规模没有直接关系:O(1)
-
线性空间(如数组):空间是一个线性的集合,且 集合的大小与输入规模n成正比:O(n)
-
二维空间:空间是二维数组集合,且 集合的长度宽度与输入规模n成正比:O( n 2 n^2 n2)
-
递归空间:执行时,会专门分配一块内存,来存储“方法调用栈”
-
入栈:把调用的方法和参数信息压入栈中
-
出栈:把调用的方法和参数信息从栈中弹出
-
内存空间和递归深度成正比。递归的深度为n则空间复杂度为O(n)
-
-
-
取舍好时间和空间
- 一般来说,时间复杂度更重要一点