数据结构:线性结构:数组(Aray),栈(stack),队列(Queue),链表(Linked List)
非线性结构:树(Tree),图(Graph),堆(Heap),散列表(Hash)
数据结构大多是冲淡种分类方式分类:逻辑结构,物理结构,存储结构。
1.数组 (Array)
int[] array=new int[100];
优点:按照索引查询,遍历更加快捷方便
缺点:大小固定,只能存活粗一种类型的数据,添加删除操作缓慢。
应用于:多次查询,对存储空间要求不大,很少出现增加与删除的情况。
ArrayList array=new ArrayList();
array.Add(),
array.Remove();
List<int> array1=new List<int>;
array1.Add();
array1.Remove();
//ArrayList和List属于动态数组,可以随时的添加以及删除元素。
注意:ArrayList存储的数据是Object类型,会涉及到装箱以及拆箱的操作。比较消耗性能。并且存储的数据可能是不安全的类型。
2.栈(Stack)
特点:先进后出,放入元素为进栈,取出元素为出栈。
应用于:需要进行递归的操作。
3.队列(Queue)
特点:先进先出:放入元素为入队,取出元素为出队。
应用于:多线程阻塞队列管理中心。
4.链表(Linked List)
物理存储单元上非连续的,非顺序的存储结构。数据元素的逻辑顺序是通过链表的指针地址实现的。每一个元素有数据域和指针域。根据指针指向分为:单链表,双链表,循环链表。
优点:不需要初始化容量,可以任意的加减元素。加减元素的时候只需要改变前后两个元素的指针域的指向即可。
缺点:占用空间,查询遍历的操作耗时。
应用于:数据量小,需要频繁的加减操作的场景。
5.树(Tree):根朝上,叶朝下。
1.每一个结点有0或者多个子节点
2.没有父结点的结点叫做根节点。
3.每一个非根节点只有一个根节点。
4.处理根节点,每一个子节点可以分为多个不相交的子树。
二叉树:树的一种特殊结构。
1.每一个结点最多有两个子节点。
2.左子树,右子树是有顺序的,不可颠倒。
3.即使是只有一个子节点,也要区分左右子树。
优点:二叉树继承了数组和链表的优势
应用于:处理大量的动态的数据的时候后适用。
拓展:二叉树又有平衡二叉树,红黑树,B+树等等。
6.图(Graph)
由结点的有穷集合V和边的集合E组成。按照顶点指向的方向可分为无向图以及有向图。
特点:在存储数据上有着较为复杂和高效的算法。
临近矩阵:邻接表,十字链表,邻接多重表,边集数组等存储结构。
7.堆(Heap):可以看做是完全二叉树
1.堆中的某个节点的值总是不大于或者不小于父结点的值。
2.堆是完全二叉树。
3.根节点值最大的堆叫做大顶堆,反之称之为小顶堆。
ki>k2i,ki>k(2i+1) ki<k2i,ki<k(2i+1)
8.散列表【哈希表】(Hash)
根据关键码和值(key,value)进行访问。通过key,value映射到集合的某一个位置。
记录的存储 位置==f(key),f 为散列函数【哈希函数】。通过散列函数将key通过算法转成一个整形数字,然后该数字对数组的长度进行取余,取余的结果当作数组的下标,将value存储到以该数字为下标的数组空间里。
优点:查找元素很快
缺点:增加删除元素的操作很慢。
拉链法:数组+链表(后改为数组+红黑树)。数组的每一个成员包含一个指针,指针指向一个链表的表头。指向的链表可能为空,也可能有很多链结点。