数据结构学习一:概述
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:
- 数据的逻辑结构;
- 数据的物理存储结构;
- 对数据的操作(或算法)。
一、什么是数据结构:
1、数据:
是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。
也就是说,数据其实就是符号,而且这些符号必须具备两个前提:
- 可以输入到计算机中。
- 能被计算机程序处理。
对于整型、实型等数值类型,可以进行数值计算。对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。
2. 数据元素
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
3. 数据项
数据项:一个数据元素可以由若干个数据项组成。
举个例子吧。比如人这样的数据元素,可以有眼、耳、鼻、嘴、手、脚这些数据项,也可以有姓名、年龄、性别、出生地址、联系电话等数据项,具体有哪些数据项,要视你做的系统来决定。
4. 数据对象
数据对象:是性质相同的数据元素的集合,是数据的子集。
数据 data | |||||||
数据对象 data object | |||||||
数据元素 data element | 数据元素 | 数据元素 | 数据元素 | ||||
数据项 data item | 数据项 | 数据项 | 数据项 | 数据项 | 数据项 | 数据项 | 数据项 |
5. 数据结构
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
为编写出一个“好”的程序,必须分析待处理对象的特性及各处理对象之间存在的关系。这也就是研究数据结构的意义所在。
二、数据的逻辑结构
逻辑结构:是指数据对象中数据元素之间的相互关系。
逻辑结构分为以下四种:
- 集合结构。集合中任何两个数据元素之间都没有逻辑关系,组织形式松散。
- 线性结构。线性结构中的结点按逻辑关系依次排列形成一个“锁链”。
- 树形结构。树形结构具有分支、层次特性,其形态有点象自然界中的树。
- 图状结构。图状结构中的结点按逻辑关系互相缠绕,任何两个结点都可以邻接。
三、数据的物理结构
物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据元素的存储结构形式有两种:顺序存储和链式存储。
逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。
四、数据类型
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
数据类型是按照值的不同进行划分的。在高级语言中,每个变量、常量和表达式都有各自的取值范围。类型就用来说明变量或表达式的取值范围和所能进行的操作。
抽象数据类型(Abstract Data Type, ADT) 是一个数据结构以及定义在该结构上的一组操作的总称。它是对数据类型的抽象,抽象的意义在于数据类型不是高级程序语言支持的基本数据类型,而是自定义的数据类型。
五、数据结构的知识点
1、线性表
顺序存储结构:连续的存储。
链式存储结构:内存中随机存储的,只需要指针写出下一个结点在哪里即可。
- 线性表:逻辑上不分叉就行。一个个数据元素前后相连(就是前驱、后继)。数据项平等对待。与此相对就是树、图。用途:其实就是数组啦。
- 链表:采用链式存储方式的线性表。什么是链式存储?就是一个数据项中不仅保存数据还要告诉下一个数据在哪里。用途:数据大小不确定时用。
从普通链表拓展的概念:
- 循环链表:首尾相连的链表;
- 双链表:前后相随的链表;前< >后
用途:特殊情况加快链表的操作;
2、栈和队列
这个什么东西?就是功能被限制的线性表,没有什么区别;
栈:只能从上面往下放,然后从上面去取; 就是一个坑啊,有木有!
- 链栈:链式存储的栈;
- 顺序栈:顺序存储的栈;
队列:前面装入数据,后面取出数据; 用途:保障时间的顺序,比如用户事务操作;
- 链队列:链式存储的队列; 链队列:长度没限制啊,是不是、
- 顺序队列:顺序存储的队列;
3、串
就是把字符放到前面的线性表中。不然怎么叫字符串呢? 所以很多语言字符串就是一个对象;
4、多维素组
素组的元素可以又是一个数组。 这个就是一个树。
5、树
有分叉的链表但是不能首尾相连;(线索二叉树除外,线索二叉树就是图了都);
- 二叉树:最多两个分支。
- 深林:几个树放到一起(没连接哈),就是个深林;形象啊、
- 遍历:记住以根为标准即可,先访问根:先序;访问了左边,再访问根:中序;最后访问根:后序;
- 最优二叉树(哈夫曼树):就是把权重的往上放。 用途:用来编码,用的多的,权重的自然放在前面了,权力大的就在上面(和金字塔的社会不是很像么?);
- 线索二叉树:叶子节点的指针域不要浪费,指向其他,按照遍历的顺序来。其实就是一个图了。
6、图
无限个指针域,随你指向那个结点,不要重复就行。
- 无向图:指向a 被指向a,算作一样;
- 有向图:指向a被指向a,不同的,不一样;
- 带权:指向这个行为还有程度值,权值。
- 网络:带权的有向图。 路由协议中,由路由器组成的网络就是向且带权,比如速度、延迟不一样,上传、下载速度不一样;
遍历的问题有点麻烦
- 深度优先:就是一直往下走,不回头。
- 广度优先:一层一层剥下去。
- 生成树:把图滤成一个树。删除循环的连接;primus算法类似深度优先的思想,克鲁斯卡尔算法类似广度优先的思想;
- 最短路径:一个一个列出来,比较最小的;
7、排序和查找
先看排序:
- 冒泡排序:就像气泡一样,当前元素和下一个比,合适就这样,不合适就交换折腾 n * n次
- 快速:元素找到自己的排序位置,当每个人都找到了,那个顺序就定了。
- 选择:老实的排序法,找到最值,放在哪里,又去找最值。。。。
- 堆:和选择一样建一个具有堆的性质二叉树(节点永远比子节点大),堆顶就是最值,拿出来,再建一次堆。。。
- 插入:随便拿一个向有序的中放。问:开始没有有序的序列啊?答:开始只有找一个元素参照,一个必然是有序的,然后可以结合二分法查找,来排序,用查找的思想排序,逆天了有木有啊、
- 归并:几组有序的合并成一个。很简单,每人轮流拿出一个比较下,放进篮子里不就完了。
排序好了才能查找,否则就只能一个一个查找了
- 顺序查找:就是一个一个来;
- 二分法:简单,找中间,每次排除一半;
- 分块:建个索引,就是分割区域,这些区域对应到一个序列,例如123,然后去找,索引越细致,速度越快,但是修改了,会重建索引,把握程度即可。
- 二叉排序树:把数据存在一个树里,这个树的数据以中序遍历的顺序来存,这个结点的左边比右边小,就很好找了、每次排除整体的一半。
- B-树:用二叉排序树当做索引存普通数据,因为二叉排序树的建立、删除代价太大了。
8、主要的数据结构包括:
Arrays Link lists Queues Stacks Heaps Graphs Scene graphs Octrees Quad-trees Binary trees Minimax trees kd trees Sphere trees Bounding volume hierarchies Hash tables Portals and sectors
9、主要的算法:
Recursion Insertions Deletions Merging Various sorting algorithms
Various searching algorithms
Transversal Various algorithms for balancing trees
Data compression Texture compression Data encryption Texture filters