首页 > 编程语言 >基础算法串讲

基础算法串讲

时间:2023-08-01 20:56:08浏览次数:43  
标签:结点 遍历 递归 串讲 基础 链表 算法 二叉树 序列

线性数据结构

链表

  • std::list 是 STL 中的链表
  • 特点:是一条链,空间复杂度 \(O(n)\)
    • 插入与删除十分方便,时间复杂度 \(O(1)\)
    • 寻找与查询数据比较麻烦,时间复杂度 \(O(n)\)
  • 数组大小固定,链表大小可动态调整
    • 注意:std::vector 不算数组,是数据结构
  • 链表的分类
    • 单向链表:每一个结点只存储下一个结点的指针
    • (单/双向)循环链表:尾结点的指针指向首结点
    • 双向链表:一个结点存储上下结点的指针(prevnext
  • 判断插入元素指令是否正确:判断是否会有数据覆盖(模拟)

栈(stack, vector)

  • 开一个口,先进后出
  • 常用函数
    • push() 压栈
    • pop() 如果非空则弹栈
    • top() 栈顶元素
  • 可以用两个栈实现一个队列
  • 给定入栈序列,判断出栈序列是否合法
    • 草稿纸模拟一个栈,右边写进出栈序列
    • 验证出栈队列中的元素是否能顺利弹出(如果能出立刻出)
  • 给定出栈序列,判断入栈序列是否合法

队列(queue, deque)

  • 开两个口,先进先出
  • 常用函数
    • push() 进队列
    • pop() 出队列
    • front() 首元素
  • 双向队列 deque 可以实现栈

递推,递归

递归

  • 在函数定义中使用函数本身的方法
  • 思想是直接或间接地调用函数自身
  • 递归利用堆栈解题
  • 从未知信息一步步推向已知信息

递推

  • 从已知信息一步步推向未知信息,找的是前后关系(递推式)
    • 如斐波那契数列:\(f_n=f_{n-1}+f_{n-2}\)

简单图论

  • 一些点用边连起来(可能是抽象概念)
  • 边的方向
    • 有向边:代表方向性
    • 无向边:无方向性,相当于两条有向边
  • 边的权值
    • 带权图:边上带有边权
    • 正权图:边权都为正数
  • 图的分类
    • 有向图
    • 无向图
    • 混合图
  • 结点度数(无向图入度=出度)
    • 入度:有向图有多少条边指向这一个结点
    • 出度:有向图有
  • 特殊情况
    • 自环:结点的边指向自己
    • 重边:两条相同的边
    • 简单图:无重边、自环
    • 连通图:无向图任意两点之间都相互可达
    • 有向图强连通:无向图任意两点之间都相互可达,\(n\) 个结点,至少有 \(n\) 条边(一个环)
    • 无向连通图如果 \(n\) 个结点,必须有 \(n-1\) 条边(一条链)
    • 稠密图:一张图的边数接近点数的平方
    • 稀疏图:边数远小于点数的平方,没有严格定义
    • 完全图:任意不同两点间均有边(无向)/两条方向不同的边(有向)
  • 图的存储
    • 邻接矩阵:二维数组存边 e[u][v]:u 连 v
      • 不带权:0/1
      • 带权图:0/边权
    • 邻接表
      • 使用一个支持动态添加元素的数据结构构成的数组来存边,如 vector

简单树

  • 树:图里面没有环,并且是联通
  • 一般情况下,有环的图一定不是
  • 无根树制定一个结点为根,则为有根树
  • 性质
    • 边数 = 点数 - 1
    • 任意两点之间仅有一条简单路径
    • 任意不同两点间加边可以得到图中唯一一个环
  • 概念及定义
    • 父亲:从该结点到根结点的简单路径上的第二个结点
    • 祖先:从该结点到根结点的简单路径上除它本身结点
    • 子结点/后代:父亲结点反过来
    • 结点深度:结点到根结点简单路径上的边数
    • 高度:所有结点深度的最大值
    • 子树:某个结点和它所有的后代和边组成的树
  • 常见特殊树
    • 链:与任意结点相连的边不超过两条的树
    • 菊花:结点 u 与其他所有结点均相连(必须直接连)
    • 二叉树:每个结点最多有两个子结点

二叉树

  • 二叉树:每个节点最多只有两个儿子的有根树
  • 完整二叉树:每个结点的子结点树一定为 0 或 2
  • 完全二叉树:只有最下面两层节点度数可以小于 2,且最下面一层结点都集中在该层最左边的连续位置上
  • 满二叉树/完美二叉树:所有叶节点深度相同的二叉树
  • 前中后序遍历:根左右,左根右,左右根
  • 序列反推:根据中序遍历序列和另外一个序列可以得出第三个序列(根据前序/有序遍历获得某子树的根节点,采用分治思想)
  • 前序遍历伪代码
void 前序遍历(int x) {
    输出:print 当前点编号
    递归:前序遍历(左结点)
    递归:前序遍历(右结点)
}
  • 中序遍历伪代码
void 中序遍历(int x) {
    递归:中序遍历(左结点)
    输出:print 当前点编号
    递归:中序遍历(右结点)
}
  • 后序遍历伪代码
void 后序遍历(int x) {
    递归:后序遍历(左结点)
    递归:后序遍历(右结点)
    输出:print 当前点编号
}

搜索

  • 深度优先搜索用栈
  • 广度优先搜索用队列

排序

算法名称 最好时间复杂度 最坏时间复杂度 平均时间复杂度 是否稳定
冒泡排序 \(O(n)\) \(O(n^2)\) \(O(n^2)\)
选择排序 \(O(n^2)\) \(O(n^2)\) \(O(n^2)\)
插入排序 \(O(n)\) \(O(n^2)\) \(O(n^2)\)
计数排序(设值域为 w) \(O(n+w)\) \(O(n+w)\) \(O(n+w)\)
归并排序 \(O(nlogn)\) \(O(nlogn)\) \(O(nlogn)\)
快速排序 \(O(nlogn)\) \(O(n^2)\) \(O(nlogn)\)

杂项

  • 前后缀表式转中缀表达式:栈

标签:结点,遍历,递归,串讲,基础,链表,算法,二叉树,序列
From: https://www.cnblogs.com/winter-tide/p/17599066.html

相关文章

  • Java基础数据类型
    基础数据类型基础数据类型:byte(字节型),short(短整型),int(整型),long(长整型),float(单精度浮点型),double(双精度浮点型),char(字符型)  1.byte字节型占1个字节,范围-128到127bytea=5;byteb=6;//bytec=200;//编译错误,超出范围2.short短整型占2个字节,范围-32768......
  • 20230801 数论基础学习笔记
    理论基础中国剩余定理及拓展已知\(x\equiva_i(\bmodp_i\)\),求\(x\bmod\operatorname{lcm}\{p_i\}\)的值。若\(p_i\)互质,那么我们只需要计算\(c_i\)使得\[\prod\limits_{j\nei}\cdotc_i\bmodp_i=1\]然后有\[x=\sum\limits_{i}c_ia_i\prod\limits......
  • Python基础day56 Django视图层相关
    视图层三板斧问题在视图函数中写函数跟普通函数不太一样,Django中使用的是局部的request所有的视图函数不能够没有返回值,并且返回值还必须是HttpResponse对象#错误代码Theviewapp01.views.indexdidn'treturnanHttpResponseobject.ItreturnedNoneinstead.其实我......
  • bm25算法与tf-idf比较,区别,已经使用长江
    bm25算法与tf-idf算法比较一、tf-idf算法介绍词频(TF)=某篇文章中某个关键词出现的次数/文章总字数,逆文档频率(IDF)=log(语料库文章总数/包含该关键词的文章总数+1),tfidf=tf*idf,下面给大家举个实例,你大概就明白了,例如语料库中有以下三篇文章:第一篇:张一山与杨紫疑似相恋;第二篇:C罗又......
  • javaScript基础(3)
    string字符串1.字符串必须用‘’或者“”,引起来的一段字符内容,在表示字符串的时候,不能在双引号表示的字符串中使用双引号2.字符串可以是空的字符串3.字符串双引号或者单引号里可以嵌套另一种字符串的引号4.空格在字符串里是占位的varsty1=“123123”5.获取字符串......
  • 白话解析:一致性哈希算法 consistent hashing
    在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台......
  • Redis基础
    1.Redis入门1.1Redis简介Redis是一个基于内存的key-value结构数据库。Redis是互联网技术领域使用最为广泛的存储中间件。官网:https://redis.io中文网:https://www.redis.net.cn/key-value结构存储:主要特点:基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻......
  • 负载均衡算法: 简单轮询算法, 平滑加权轮询, 一致性hash算法, 随机轮询, 加权随机轮询
    直接上干活/***@version1.0.0*@@menu<p>*@date2020/11/1716:28*/publicclassLoadBlance{staticMap<String,Integer>serverWeightMap=newHashMap<>();static{serverWeig......
  • 算法题目
    第一章动态规划数字三角形模型[线性DP]摘花生最低通行费数字三角形方格取数最长上升子序列模型[线性DP]最长上升子序列怪盗基德的滑翔翼登山合唱队形友好城市最大上升子序列和导弹拦截[贪心]导弹防御系统[dfs+贪心]背包问题[组合类]......
  • 拼多多店铺订单API接口(pdd.order.basic.list.get订单基础信息列表查询接口)代码对接教
    拼多多店铺订单API接口(pdd.order.basic.list.get订单基础信息列表查询接口)代码对接教程如下:1.公共请求参数参数名称参数类型是否必填参数描述(接口代码教程wx19970108018)typeString必填API接口名称(点击获取请求key和secret)client_idString必填POP分配给应用的client_idaccess_tok......