01数据结构与算法
概述
数据结构,就是数据之间的结构关系,或者理解成数据元素相互之间存在的一种或多种特定关系的集合。
分为逻辑结构和物理结构。
逻辑结构
指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后关系,而与他们在计算机中的存储位置无关。逻辑结构分为以下四类:
1.集合结构
集合结构中的数据元素同属于一个集合,他们之间是并列的关系,除此之外没有其他关系。
2.线性结构
线性结构中的元素存在一对一的相互关系
3.树形结构
树形结构中的元素存在一对多的相互关系。
4.图形结构
图形结构中的元素存在多对多的相互关系。
物理结构
又叫存储结构,指数据的逻辑结构在计算机内存存储空间的存放形式。通俗的讲,物理结构研究的是数据在存储器中存放的形式。
数据在内存中的存储结构,也就是物理结构,分为两种:顺序存储结构和链式存储结构。
顺序存储结构
是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。数组就是顺序存储结构的典型代表
链式存储结构
是把数据元素存放在内存中的任意存储单元里,也就是可以把数据存放在内存的各个位置。这些数据在内存中的地址可以是连续的,也可以是不连续的。
和顺序存储结构不同的是,链式存储结构的数据元素之间是通过指针来连接的,我们可以通使用指针来找到某个数据元素的位置,然后对这个数据元素进行一些操作。
顺序存储结构和链式存储结构的区别
以去银行取钱打比方,顺序存储结构就相当于,所有的客户照先来后到的顺序序的的坐在大厅的椅子上;
而链式存储结构相当于,所的客户只要一到银行,大堂经理就给他们每人一个号码,然后他们可以随便坐在哪个椅子上,
而每个客户手里的号码就相当于指针,当前的指针指向下一个存储空间,这样,所有不连续的空间就可以被有顺序的按照线性连接在一起了。
分类
一、线性表
1、数组Array
2、链表Linked List
链表被广泛用在各种语言的集合框架中.
链表是一张表,元素在内存中不一定相邻,并且每个元素都可带有指向另一个元素的指针.链表有单项链表,双向链表,循环链表。
链表失去了数组随机读取的优点,增加了节点的指针域,空间开销比较大https://www.cnblogs.com/wing011203/archive/2013/04/09/3010985.html
二、栈与队列
1、队列Queue
线性结构,特点是在某一端添加数据,在另一端删除数据,遵循先进先出。
在 现实生活中Queue的应用也很广泛,最广泛的就是排队了,先来后到,先来的先办事。比如我们的播放器上的播放列表,我们的数据流对象,异步的数据传输结 构(文件IO,管道通讯,套接字等);还有一些解决对共享资源的冲突访问,比如打印机的打印队列等。消息队列等。交通状况模拟,呼叫中心用户等待的时间的 模拟等等
2、栈Stack
线性结构,特点是只能在某一端添加或删除数据,遵循先进后出的原则。
栈这种数据结构用途很广泛,比如编译器中的词法分析器、Java虚拟机、软件中的撤销操作、浏览器中的回退操作,编译器中的函数调用实现等等。
队列和栈都可以通过数据和链表实现.
https://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html
三、树与二叉树
1、树Tree
https://www.cnblogs.com/maybe2030/p/4732377.html
2、二叉树
树的遍历方法:先序遍历、中序遍历、后序遍历
深度遍历,广度遍历
二叉树比较经典的有哈夫曼编码问题,二叉堆等问题;
哈夫曼问题就是要让频率高的节点编码最短,也就是要节点在哈夫曼树中的深度最小。
https://www.cnblogs.com/songwenjie/p/8955856.html
四、图Graph
五、其他
1、散列表Hash
2、堆Heap
可以被看成一棵树的数组对象
时间复杂度
O(1) 代表操作与数据量没有关系,是一个固定时间的操作,比如说四则运算
O(N) 对于一个算法来说,可能会计算出操作次数为aN+1,N代表数据量