【 数据结构 】---- 八大数据结构

一、数据结构的类型简介

数据结构是计算机存储、组织数据的方式。

1. 数组

  • 数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问。
  • 数组可以进行方便的查找,但是删除和增加相对来说复杂。数组一旦固定之后,就确定了,无法改变大小。
  • 使用场景: 频繁查询,对存储空间要求不大,很少增加和删除的情况。

2. 队列

  • 与数组不同的是,队列没有长度限制。但是队列只能在两端对数据进行操作。并且符合FIFT(first in first out)原则。
  • 队列是一种线性表(所谓线性表就是除了首尾两个位置元素之外,其余中间的元素都是首尾相连的)
  • 使用场景: 在多线程阻塞队列管理中非常适用

3. 栈

在这里插入图片描述

  • 栈也是一种线性表结构,但是与队列不同的是,栈只能先进后出(LIFT)
  • 使用场景: 栈常应用于实现递归功能方面的场景,例如斐波那契数列。
    python实现:
class Asstack(object):
    def __init__(self, size):
        self.size = size
        self.lst = []
        self.top = 0

    def push(self,item):
        if self.top >= self.size:
            raise ValueError('stack is ful')
        self.top += 1    # 因为list中insert是插入在TOP指针之前的位置,所以这里先做了+1
        self.lst.insert(self.top, item)
        return self.lst

    def pop(self):
        if self.top == 0:
            raise ValueError('stcak is empty')
        self.lst.pop()       # lst.pop的返回值是删除的元素,可以选择接收
        self.top -= 1
        return self.lst

4. 链表

链表是物理存储单元上非连续的、非顺序的存储结构。数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。

  • 需要注意的是,链表尾的指针需要指向NULL,将意味遍历结束。
  • 链表的优点是只要改变指针域就能轻松实现插入和删除操作。
  • 缺点是要查找某个元素可能需要对链表遍历一次。
    在这里插入图片描述
    双链表就是结构体内部存在两个结构体指针,循环链表就是指某一指针指向头指针多指向数据域。双向循环链表如下所示:
    在这里插入图片描述

5. 散列表

hash函数就是根据key计算出应该存储地址的位置,而散列表,又称为哈希表是基于哈希函数建立的一种查找表。
散列表是数组和链表的结合,因此兼具两者的特点。
在这里插入图片描述

6. 树

树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点有零个或多个子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;
    在日常的应用中,我们讨论和用的更多的是树的其中一种结构,就是二叉树。

二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。

扩展:
二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等,这些数据结构二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。

7. 堆

堆是一种比较特殊的数据结构,从形状上看就是一颗完全二叉树,具有以下的性质:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。
    可分为大顶堆和小顶堆,大顶堆是指父节点永远比子节点大,反之则为小顶堆。
    常见的堆有二叉堆,斐波那契堆等

8. 图

由一系列节点和边连接组成。可以分为有向图,无向图,常见的表示方式有邻接矩阵和邻接链表。
在这里插入图片描述
度,权,连通图的概念
度是指从顶点引出的边的数量,如果在有向图中,度可以分为入度和出度。权是指每条边可以占有一定的权重,一个无向图中每个顶点从所有其他顶点都是可达的,则称该图是连通的;如果一个有向图中任意两个顶点互相可达,则该有向图是强连通的。

  • 图的广度搜索(广度优先遍历)
  • 图的深度搜索(深度优先遍历)

二、 资料参考

https://blog.youkuaiyun.com/yeyazhishang/article/details/82353846
https://blog.youkuaiyun.com/iva_brother/article/details/84036385

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值