常考的数据结构

常考的数据结构

基础学科内容: 网络知识, 数据机构算法, 编程思想

  1. 时间复杂度: 通常使用最差的时间复杂度来衡量一个算法的好坏。
    O(1) 表示时间复杂度是常数时间, 即这个操作和数据量没关系,是一个固定时间的操作,比如说四则运算。
    当两个算法都是 O(N) 的时间复杂度,那么对比两个算法的好坏就要通过对比低阶项和常数项了。
  2. 栈是一个线性结构,是相当常见的数据结构
    栈的特点是: 只能在某一端添加或删除数据, 遵循先进后出的原则.
    实现方式:可以把栈看成是数组的一个子集,所以使用数组来实现。class Stack { constructor() { this.stack = [] } push(item) { this.stack.push(item) } pop() { this.stack.pop() } peek() { return this.stack[this.getCount() - 1] } getCount() { return this.stack.length } isEmpty() { return this.getCount() === 0 } }
    匹配括号,可以通过栈的特性来实现.
  3. 队列: 是一个线性结构, 特点是在一端添加数据, 另一端删除数据, 遵循先进先出的原则。
    实现队列:两种方式:单链队列O(n)和循环队列O(1)。
  4. 链表:是一个线性结构,也是天然的递归结构。
    链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
    实现方式:单向链表。
  5. 树:有很多种结构, 二叉树是最常见的
    (1) 二叉树: 是一个天然的递归结构.
    二叉树拥有一个根节点,每个节点至多拥有两个子节点,分别为:左节点和右节点。树的最底部节点称之为叶节点,当一颗树的叶数量数量为满时,该树可以称之为满二叉树。
    二叉树
    (2) 二分搜索树: 也是二叉树, 拥有二叉树的特性, 但是区别在于二分搜索树每个节点的值都比他的左子树的值大,比右子树的值小。
    当需要查找 6 的时候,因为需要查找的值比根节点的值大,所以只需要在根节点的右子树上寻找,大大提高了搜索效率。
    当需要查找 6 的时候,因为需要查找的值比根节点的值大,所以只需要在根节点的右子树上寻找,大大提高了搜索效率。
  6. 树的遍历:有三种遍历方式,分别是先序遍历,中序遍历,后序遍历。三种遍历的区别在于何时访问节点。也是深度遍历
    在遍历树的过程中,每个节点都会遍历三次,分别是遍历到自己,遍历左子树和遍历右子树。如果需要实现先序遍历,那么只需要第一次遍历到节点时进行操作即可。
    还有种遍历叫做广度遍历,也就是一层层地遍历树,需要利用队列结构来完成。
    向下取整向上取整。这两个操作是相反的,代码也是相似的。
    排名: 用于获取给定值的排名或者排名第几的节点的值,这两个操作也是相反的,代码类似。
  7. 删除节点:二分搜索树最难实现的删除节点。
    删除节点存在以下情况:
  • 需要删除的节点没有子树
  • 需要删除的节点只有一条子树
  • 需要删除的节点有左右两条树
    对于前两种情况很好解决,但是第三种情况就有难度了,所以先来实现相对简单的操作:删除最小节点,对于删除最小节点来说,是不存在第三种情况的,删除最大节点操作是和删除最小节点相反的,所以这里也就不再赘述。
    如何删除任意节点: 当遇到这种情况时,需要取出当前节点的后继节点(也就是当前节点右子树的最小节点)来替换需要删除的节点。然后将需要删除节点的左子树赋值给后继结点,右子树删除后继结点后赋值给他。
  1. AVL树:二分搜索树实际在业务中是受到限制的,因为并不是严格的 O(logN),在极端情况下会退化成链表,比如加入一组升序的数字就会造成这种情况。
    AVL 树改进了二分搜索树,在 AVL 树中任意节点的左右子树的高度差都不大于 1,这样保证了时间复杂度是严格的 O(logN)。基于此,对 AVL 树增加或删除节点时可能需要旋转树来达到高度的平衡。
    必须遵循根节点比左节点大,比右节点小
  2. Trie: 在计算机科学,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。
    主要的作用是:方便搜索字符串,特点如下:
  • 根节点代表空字符串,每个节点都有 N(假如搜索英文字符,就有 26 条) 条链接,每条链接代表一个字符
  • 节点不存储字符,只有路径才存储,这点和其他的树结构不同
  • 从根节点开始到任意一个节点,将沿途经过的字符连接起来就是该节点对应的字符串
  1. 并查集:并查集是一种特殊的树结构,用于处理一些不交集的合并及查询问题。该结构中每个节点都有一个父节点,如果只有当前一个节点,那么该节点的父节点指向自己。
    这个结构中有两个重要的操作,分别是:

Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
Union:将两个子集合并成同一个集合。
在这里插入图片描述
11. 堆: 通常是一个可以被看做一棵树的数组对象
堆的实现通过构造二叉堆,实为二叉树的一种。这种数据结构具有以下性质。

  • 任意节点小于(或大于)它的所有子节点
  • 堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层从左到右填入。
  • 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
  • 优先队列也完全可以用堆来实现,操作是一模一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值