趣学算法-数据结构与算法

 14天阅读挑战赛​​​​​​​
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!


读书笔记

程序 = 数据结构 + 算法 


一   数据结构(data structure)是带有结构特性的数据元素的集合。

1, 数据元素

java的基础数据元素

  •         byte(位)
  •         short(短整数)
  •         int(整数)
  •         long(长整数)
  •         float(单精度)
  •         double(双精度)
  •         char(字符)
  •         boolean(布尔值)

2,数据结构​​​​​​​

8种常见数据结构

  •     数组(Array)
  •     链表(Linked List)
  •     队列(Queue)​​​​​​​
  •     堆(Heap)
  •     栈(Stock)
  •     哈希表(Hash)
  •     树(Tree)
  •     图(Graph)

介绍

 数组(Array)
    描述:一种 线性表 的数据结构, 连续的空间 存储 相同类型 的数据
    优点:查询速度快
    缺点: 数组在创建时大小确定,无法扩容。数组只能存储一种类型的数据。添加、删除元素慢

链表(Linked List)
    描述:链表是一种线性表的链式存储方式,链表的内存是不连续的
    优点: 动态扩容,易于插入和删除,内存利用率高
    缺点:与数组相比,在链表中存储元素需要更多内存。因为在链表中每个节点都包含一个指针,它需要额外的内存;遍历困难,不易于查询
    具体实现
        单向链表:每一个节点包含了数据块和指向下一个节点的指针
        双向链表:在双向链表中每一个节点不仅存储指向下一个节点的指针,而且存储指向前一个节点的指针
        循环链表:与双向链表相似,不同的地方在于:在链表的尾部增加一个指向头结点的指针,头结点也增加一个指向尾节点的指针,以及第一个节点指向头节点的指针,从而更方便索引链表元素

队列(Queue)
    描述
        先进先出(FIFO, First-In-First-Out)的线性表,在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
    具体实现
        顺序队列(数组)
            顺序队列
                “下溢”现象:当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件
                “真上溢”现象:当队列满时,继续往队列中插入元素,从而使数组越界产生程序代码崩坏
                “假上溢”现象:入队和出队操作,头尾指针不断增加,致使被删元素的空间永远无法重新利用。所以,当队列中元素个数远远小于向量空间的规模,或队尾指针已超越向量空间而不能插入元素的现象称为“假上溢现象”。
            循环队列
                解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环
                场景
                    同时排队数量有限(已知),及时消费,例如:窗口买票
        链式队列
            是一种特殊的单链表,它只能尾进头出
        优先队列
            顺序优先级队列
            链式优先级队列

树(Tree)
    描述
        一种非线性结构,由n(n >= 0)个节点组成,当n=0的时候,此时的树被称为空树。当n>0时,此时的树存在一个节点被称为根节点,而除根节点外的其它节点可以分为m个集合,每个集合本身又是一颗树,被称为根节点的子树
    具体实现
        二叉树
            特点
                若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)
                高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)(空树的高度为-1)
                对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n, 则m = n + 1
            具体分类
                完美二叉树
                    除叶子结点之外的每一个节点都有俩个孩子,每一层(包含最后一层)都被完全填充
                完全二叉树
                    除了最后一层之外的每一层都被完全填充,并且所有节点都保持向右对齐
                完满二叉树
                    除了叶子节点之外的每一个节点都有俩个孩子节点
            遍历方式
                中序遍历
                    左-根-右遍历,对于给定的二叉树根,寻找其左子树;对于其左子树的根,再去寻找其左子树;递归遍历,直到寻找最左边的节点i,其必然为叶子,然后遍历i的父节点,再遍历i的兄弟节点。随着递归的逐渐出栈,最终完成遍历
                先序遍历
                    根-左-右遍历
                后序遍历
                    左-右-根遍历
        二项树
            一种递归定义的有序树
            度数为0的二项树只包含一个结点
            度数为k的二项树有一个根结点,根结点下有  个子女,每个子女分别是度数分别为  的二项树的根。
        二叉查找树
            特性
                任意节点左子树不为空,则左子树的值均小于根节点的值
                任意节点右子树不为空,则右子树的值均大于于根节点的值
                任意节点的左右子树也分别是二叉查找树
                没有键值相等的节点
            缺点
                有可能退化成线性链
        AVL树
            定义
                带有平衡条件的二叉查找树,和红黑树相比,它是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1).不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的
            场景
                用于插入删除次数比较少,但查找多的情况
        红黑树
            一种自平衡二叉查找树, 通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保从根到叶子节点的最长路径不会是最短路径的两倍,用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决
            多用于查询,插入,删除操作多
        B树
            一种自平衡的树,它是一种多路搜索树(并不是二叉的),能够保证数据有序。同时它还保证了在查找、插入、删除等操作时性能都能保持在O(logn),为大块数据的读写操作做了优化,同时它也可以用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)
            有序数组+平衡多叉树
            文件系统和数据库系统常用
        B+树
            与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找
            有序数组链表+平衡多叉树
            文件系统和数据库系统常用

哈希表(Hash)

堆(Heap)

 栈(Stock)

图(Graph)

 ​​​​​​​

二,算法


​​​​​​​

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fjza1168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值