数据结构与算法介绍
数据结构
什么是数据结构
数据结构(data structure)逻辑上是指相互之间存在一种或多种特定关系的数据元素的集合,物理上是指计算机存储、组织数据的方式。数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。
数据结构的三要素
它包含三方面的内容,数据的逻辑关系、数据的存储关系及数据的行为。
1.**数据的逻辑关系:**逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。它与数据的存储无关,是独立于计算机的。数据的逻辑结构分为线性结构和非线性结构,线性表是典型的线性结构;集合、树和图是典型的非线性结构…
2.**数据的存储关系:**存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。它包括数据元素的表示和关系的表示。数据的存储结构…
3.**数据的运算:**施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算
常见的数据结构
- **栈(Stack):**栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。
- **队列(Queue):**队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。
- **数组(Array):**数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。使用连续的内存来存储,数组中的所有元素必须是相同的类型或类型的衍生(同质数据结构),元素可以通过下标直接访问。
- 集合(Set): 保存不重复的元素的数据结构
- 线性表(List): 由零个或多个数据元素组成的有限序列。
- **链表(Linked List):**链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。
- **树(Tree):**树是典型的非线性结构,它是包括,2 个结点的有穷集合 K。
- **图(Graph):**图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。
- **堆(Heap):**堆是一种特殊的树形数据结构,一般情况下,堆叫二叉堆,近似完全二叉树的数据结构。子节点的键值或者索引总是小于它的父节点,每个节点的左右子树又是一个二叉堆,根节点最大的堆叫最大堆或大根堆,最小的叫最小堆或小根堆。
- **散列表(Hash table):**散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。
空间复杂度
- 算法所耗费的存储空间g(n)
- 它是问题规模n的函数,记为S(n)
- S(n) = O(g(n))
算法
什么是算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。算法是利用数据结构针对一定的规范输入得到输出的处理步骤。
算法的特征
- 有穷性;算法的有穷性是指算法必须能在执行有限个步骤之后终止;
- 确切性;算法对于特定的输入有特定的输出,程序提供了确定算法结果的平台
- 输入项;一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
- 输出项;算法有一个或多个输出,以反映对输入数据加工后的结果
- 可行性;算法需要考虑设计的可能,程序则具体是实现算法上的设计
算法的意义
学习算法的同时能提高自己的编程能力。一个好的算法是编写程序的模型,因为它能创造计算机程序,其中还包含了程序的精髓。学过算法的人写出的程序和没学过算法的人写出的程序有明显的差距。要写出既能正确执行又能提高效率的好程序,算法的学习是不可或缺的。
常用算法
数据结构研究的内容:就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。算法研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。一般有以下几种常用运算:
-
**检索:**检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。
-
**插入:**往数据结构中增加新的节点。
-
**删除:**把指定的结点从数据结构中去掉。
-
**更新:**改变指定节点的一个或多个字段的值。
-
**排序:**把节点按某种指定的顺序重新排列。例如递增或递减。
想了解各种排序算法的实现请跳转到这篇博文:十大经典排序算法
时间复杂度
- 一个语句的频度指语句在算法中被重复执行的次数
- 算法中所有语句的频度之和记作T(n)
- 时间复杂度主要分析T(n)的数量级
- 通常采用算法中基本运算的频度f(n)来分析算法的时间复杂度
- T(n) = O(f(n)
关于空间复杂度的详细介绍可以参考这篇博文:时间复杂度