我们实际在工作当中,会经常遇到存储数据的情况,但是具体选中哪种方式去存储呢。这个时候我们学习数据结构的原因了,通过了解不同数据结构的特点,选择合适的数据结构进行数据的存储。数据结构其实就是让我们了解 常见的数据存储方式以及内部存储机理。
线性结构:数组(Aray),栈(stack),队列(Queue),链表(Linked List)
非线性结构:树(Tree),图(Graph),堆(Heap),散列表(Hash)
数据结构基本按照三类方式区分:逻辑结构,物理结构,存储结构。
1.数组 :int[] string[] 。ArrayList 。 List<int> List<string>
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 类型,会涉及到装箱以及拆箱的操作。比较消耗性能。并且存储的数据可能是不安全的类型。
《1》数组:数组类型的创建。
<1>一维数组
<2>二维数组
<3>交错数组
《2》ArrayList 数组
Arraylist 小例子
《3》List 泛型数组。确定类型,只能存储对应类型的数据。
2.栈(Stack)
特点:先进后出,放入元素为进栈,取出元素为出栈。
应用于:循环遍历的递归写法。
《1》栈 Stack
栈 小例子
《2》泛型栈
使用和栈类似。使用的时候需要指定类型。只能存储对应类型的数据。可以避免转型拆箱的操作。
3.队列(Queue)
特点:先进先出,放入元素入队,取出元素出队。
应用于:在多线程阻塞队列管理中适用。
《1.》队列 queue
《2》泛型队列
使用和队列类似。使用的时候需要指定类型。只能存储对应类型的数据。可以避免转型拆箱的操作。
4.链表(Linked List)
物理存储单元上非连续,非顺序的存储结构。数据元素的逻辑顺序是通过链表的指针地址实现的。每一个元素有数据域和指针域。根据指针指向分为:单链表,双链表,循环链表。
优点:不需要初始化容量,可以任意的加减元素。加减元素的时候只需要改变前后两个元素的指针域的指向即可。
缺点:占用空间较大,查询遍历等操作耗时。
应用于:数据量小,需要频繁的加减操作的场景。
《1.》链表的连接原理。
《2》链表的原理。包括添加,移除元素。
《3》C#封装的链表的基本用法。LinkedList 链表。 LinkedListNode 结点。
5.树(Tree):根朝上,叶朝下。
1.每一个结点有0或者多个子节点
2.没有父结点的结点叫做根节点。
3.每一个非根节点只有一个根节点。
4.每一个子节点可以分为多个不相交的子树。
《1》二叉树:树的一种特殊结构。
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) Hashtable Dictionary
根据 关键码 和 值(key,value)进行访问。通过key,value 映射到集合的某一个位置。
记录的存储 位置 == f(key),f 为散列函数【哈希函数】。通过散列函数将key通过算法转成一个整形数字,然后该数字对数组的长度进行取余,取余的结果当作数组的下标,将value存储到以该数字为下标的数组空间里。
优点:查找元素很快
缺点:增加删除元素的操作很慢。
拉链法:数组+链表(后改为数组+红黑树)。数组的每一个成员包含一个指针,指针指向一个链表的表头。指向的链表可能为空,也可能有很多链结点。
《1》Hashtable
《2》Dictionary 字典 。确定 key ,value 的类型。只能存储对应类型的数据,只能以对应类型为key进行索引。