数据结构与算法漫谈
引言
为什么要学习数据结构与算法呢?有什么用呢?
我认为算法就是帮助人们快速地、高效地解决问题,就好比从1000个无序的序列中找出一个指定的记录,你会怎么做呢?通常人们会将记录一个个比对,直到找到正确的为止,当然最终是可以找出来的。当数据是一万个,一百万个,一亿个呢??当然最终也是可以找出来的,但是会不会太浪费时间了,浪费时间就是浪费生命啊,所以我们要通过算法解决这些问题,而数据结构正是解决这些问题所采用的“模型”。数据结构是算法实现的基础,算法的操作对象是数据结构。
我相信你一定听过:算法+数据结构=程序。
-
-
线性结构 结构中的数据元素之间存在一对一的关系。
-
树型结构 结构中的数据元素之间存在一对多的关系。
-
图状结构或网状结构 结构中的数据元素之间存在多对多的关系。
-
-
链式存储结构:在每一个数据元素中增加一个存放地址的指针,用此指针来表示数据元素之间的逻辑关系。 时间复杂度 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n) 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。
常见数据结构:
- 线性表
- 栈与队列
- 串
- 树
- 图
算法(algorithm)就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。
算法具有五个基本特性:
- 输入输出:算法具有零个或多个输入,至少有一个或多个输出,算法一定要有输出!!!
- 有穷性:指算法在执行有限的步骤后,自动结束而不会出现无限循环,并且每一个步骤都在可接受的时间内完成。
- 确定性:算法的每一步都具有明确的含义,不会出现多义性。
- 可行性:每一步算法必须是可行的,也就是说能每一步通过执行有限次数完成。
算法设计的要求:
- 正确性:指算法至少应该具有输入、输出和加工处理无歧义性、能正确反应问题的需求,能够得到问题的正确答案。
- 可读性:便于阅读、理解和交流。
- 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
- 时间效率高和存储量低:也就是说运行时间尽可能快,需要的额外存储空间尽可能小。
从算法的简单性来看分为两类:
-
简单算法:冒泡、简单选择、直接插入
-
改进算法:希尔、堆、归并、快速
常见算法思想:
- 枚举法
- 递推算法
- 递归算法
- 回溯算法
- 贪心算法
- 分治算法策略
- 深度优先搜索算法
- 广度优先搜索算法
- 动态规划
常用算法 详参----->常用算法(Java表述)
- 冒泡排序(Bubble Sort)
- 简单选择排序(Simple Selection Sort)
- 直接插入排序(Straight Insertion Sort)
- 希尔排序(Shell Sort)
- 堆排序(Heap Sort)
- 归并排序(Merging Sort)
- 快速排序(Quick Sort)
- 顺序查找(Sequential Search)
- 二分查找(Binary Search)
- 差值查找
- 斐波那契查找
- 数表查找
- 分块查找
- 哈希查找
书籍推荐:《算法导论》、《图解算法》、《大话数据结构》等。
持续更新中,欢迎交流指导!!!