常见的几种数据结构


前言

  自从大学毕业后,数据结构相关知识已忘的差不多,现在准备复习下数据结构相关知识,并记录下来。

正文

常见的数据结构如下:

  数组

  链表

  栈

  队列

  树

  图

  哈希表

以下会逐一细说。

1、数组:

  数组是一种连续存储线性结构,通过使用整型索引值来访问它们的元素。

 

数组的优缺点:

(1)优点:

  数组查询效率高

(2)缺点:

  数组插入和删除效率低

  需要大块连续的内存块

  创建时需要指定数组的长度

 

2、链表:

  n个节点离散分布,彼此之间用指针相连。每个节点(除了首节点、尾节点)有一个前驱节点和一个后续节点,首节点只有一个后续节点,尾节点只有一个前驱节点。

 链表的优缺点:

(1)优点:

  链表的插入或删除效率高

(2)缺点:

  链表的查询效率低

 

链表分类:

①单向链表:只有一个指针域,指向该节点的后续节点。

②双向链表:有两个指针域,指向该节点的前驱节点和后续节点。

③循环链表:(单向或者双向)链表的尾指针指向头节点,实现循环链表。通过任意一个节点都可以推出整个链表。

 

3、栈:

   先进后出,后进先出。

 

4、队列:

  先进先出,后进后出。

 

5、树:

  一种非线性的数据结构。

 

 

树的分类:

①二叉树:每个节点最多只有两个分支。(注:后面会有一篇文章专门写二叉树的遍历)

  完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树;

  满二叉树:是一种特殊的完全二叉树。除了最后一层节点无任何子节点外,其他节点都有两个子节点。

②二叉搜索树(二叉查找树、二叉排序树):若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值,并且左、右子树也分别为二叉搜索树。

③平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

  AVL树:是一种最先发明的自平衡的二叉查找树。

  红黑树:是一种自平衡(不是绝对的平衡)的二叉查找树,树上的每个节点都遵循下面的规则:

      每个节点都有红色或黑色;

      根节点是黑色;

      每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点;

      从任一节点到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点。

④B树:是一种自平衡的查找树,但不是二叉树。

⑤B+树:类似于B树,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

 

6、图:

  一种非线性的数据结构。所有的顶点构成一个顶点集合,所有的边构成边的集合,一个完整的图结构就是由顶点集合和边集合组成。   图结构中顶点集合不能为空,必须包含一个顶点,而图结构边集合可以为空,表示没有边。

 图的分类:

①无向图:如果一个图结构中,所有的边都没有方向性,那么这种图便称为无向图。

 

 ②有向图:一个图结构中,边是有方向性的。

 

 ③无向完全图:在一个无向图中, 每两个顶点之间都存在条边,那么这种图结构称为无向完全图。

 

 ④有向完全图:在一个有向图中,每两个顶点之间都存在方向相反的两条边,那么这种图结构称为有向完全图。

 

 ⑤有向无环图(DAG图):在一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图。  

 

7、哈希表:

  是一种根据关键码去寻找值的数据映射结构。

 

(1)哈希函数:根据数据的关键词 key ,通过一定的函数关系,计算出该元素存储位置的函数。

  ①直接定址法:取关键字或关键字的某个线性函数值为散列地址。即 H(key) = key 或 H(key) = a*key + b,其中a和b为常数。

  ②除留余数法:取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。即 H(key) = key % p, p < m。

  ③数字分析法:当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列地址。仅适用于所有关键字都已知的情况下,根据实际应用确定要选取的部分,尽量避免发生冲突。

  ④平方取中法:先计算出关键字值的平方,然后取平方值中间几位作为散列地址。随机分布的关键字,得到的散列地址也是随机分布的。

(2)哈希冲突:对于不同的key,通过哈希函数获取到相同的结果时,产生哈希冲突。

  解决哈希冲突的方法如下:

  ①拉链法(链接法):将所有关键字为同义字的记录存储在一个单链表中,我们称这种单链表为同义词子表,散列表中存储同义词子表的头指针。

        

  ②开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到。

  按照形成探查序列的方法不同,可将开放定址法区分为线性探查法、二次探查法、双重散列法等。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM