数据结构和算法介绍
什么是数据结构和算法
- 广义上,数据结构就是一组数据的存储结构,算法就是操作数据结构的一种方法。
- 程序 = 数据结构 + 算法
- 结构是数据元素之间不是独立的,存在特定的关系,数据结构指的是数据对象中数据元素之间的关系。
算法的概念
- 算法是计算机处理信息的本质,用过算法来告诉计算机如何执行程序。
- 算法是一种解决问题的方法和思想
算法的5大特性
- 输入
- 输出
- 有穷性
- 确定性
- 可行性
算法的效率的衡量
- 好的算法可以优化程序的执行时间
1.依赖测试的环境
测试环境中的硬件的不同会对测试的结果有不同的影响。如i9的处理器要比i3的处理器明显要块很多。
2.数据规模的影响
如果测试的数据规模太小,测试的结果可能无法准确的反映算法的性能
大O复杂度表示
T(n) = O(fn())
时间复杂度的分析
1.只关注循环执行次数最多的一段代码
2.加法法则:总复杂度等于量级最大的那段代码的复杂度
时间复杂度
在分析执行的算法中,算法完成工作需要多少基本的操作。完成最少的操作,是最优时间复杂度;完成最多的操作,是最坏时间复杂度;平均的操作,是平均时间复杂度。
我们只考虑最坏时间复杂度。最坏时间复杂度,提供了一种保证,表明算法在此程度的基本操作中一定能完成的工作。
常见的时间复杂度
从低阶到高阶:常数阶O(1)、对数阶O(logn)、线性阶O(n)、nlogn阶O(nlogn)、指数阶O(n**2)
顺序表
顺序表
将元素顺序地存放在一块连续地存储区里,元素之间地顺序关系由他们地存储顺序自然连接。
链表
将元素存放在通过链接构造起来地一系列存储块汇中。
单向链表:它的每个结点包含两个域,一个信息域和一个链接域,这个链接指向链表的下一个结点,最后一个结点的链接域则指向一个空值。
循环链表:循环链表的尾节点指针是指向链表的头结点。
双向链表:支持两个方向,每个结点不止有一个后继指针next指向后面的结点,还有一个前驱prev指向前面的结点。
1.常见的数据结构
栈
栈是一种特殊的线性表,它只能在表的固定一段进行数据节点的插入和删除。后进者先出,先进者后出。
队列
队列也是一种线性表,允许在表的一段进行插入数据,在另一端进行删除数据。先进先出。
树
用来模拟具有树状结构性质的数据集合,它是由n和有限结点组成一个具有层次关系的集合,它像一个倒挂的树,根朝上,而叶朝下。
树的高度、深度、层
树的种类
无序树:树中任意节点之间没有顺序关系,也是自由树。
有序树:二叉树、霍夫曼树、B树
图
是一种更复杂的非线性表,图中的顶点可以与任意顶点建立连接关系,把这种建立的关系叫做边。
散列表
散列表用的是数组支持按照下标随机访问数据的特性,散列表是一种数组的扩展。如果在结构的存在关键字和有相等的记录,那么可以在存储的位置可以找到该记录,就可以不用进行比较操作而直接取得所查的记录。
2.常用算法
数据结构研究的内容:就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。算法研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行
检索
就是在数据结构里查找满足一定条件的节点。一般是通过给定某字段的值,找有该字段值的节点。
插入
在相应的位置向数据结构中增加新的节点
删除
把指定的节点从数据结构中删除
更新
改变指定节点的一个或多个字段的值
排序
把节点按照某种指定的顺序重新排列,如递增递减。