算法基础08 tire树
1.tire树「tire数定义:」
什么是Trie树Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树 或 键树,是一种多叉树结构。如下图:
上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质:
根节点不包含字符,除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符互不相同。通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字)。
可以看出,Trie树的关键字一般都是字符串,而且Trie树把每个关键字保存在一条路径上,而不是一个结点中。另外,两个有公共前缀的关键字,在Trie树中前缀部分的路径相同,所以Trie树又叫做前缀树(Prefix Tree)。
「变量介绍:」
123C++int arr[N][30], cnt[N], idx; // 二维数组 N 对应字符串最大长度,30对应 26个字的26种状态,这里稍微增大 ...
算法基础07 字符串比较大小问题
C++ string字符串比较方法详解字符串可以和类型相同的字符串相比较,也可以和具有同样字符类型的数组比较。
Basic_string 类模板既提供了 >、<、==、>=、<=、!= 等比较运算符,还提供了 compare() 函数,其中 compare() 函数支持多参数处理,支持用索引值和长度定位子串进行比较。该函数返回一个整数来表示比较结果。如果相比较的两个子串相同,compare() 函数返回 0,否则返回非零值。
compare()函数类 basic_string 的成员函数 compare() 的原型如下:
123456PLAINTEXTint compare (const basic_string& s) const;int compare (const Ch* p) const;int compare (size_type pos, size_type n, const basic_string& s) const;int compare (size_type pos, size ...
算法基础06 kmp字符串匹配算法
1.kmp 字符串匹配「kmp算法介绍:」
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) [1]。
字符串的模式匹配是一种常用的运算。所谓模式匹配,可以简单地理解为在目标(字符串)中寻找一个给定的模式(也是字符串),返回目标和模式匹配的第一个子串的首字符位置。通常目标串比较大,而模式串则比较短小。
简洁来说,就是在较长的字符串S中寻找子串P是否存在以及多少个的问题。
「实现思路:」
朴素做法:可以使用暴力枚举,但是时间复杂度高,耗时。
优化做法:使用ne[]数组存储子串P最大匹配后缀与最匹配大前缀的下标。
如果遇到不匹配,则跳到P子串与当前位置元素匹配的最大前缀位置。
这么说可能很抽象,画图表示。
假如以上 S (长传)与 P(子串)
先让P匹配自己,让每一 ...
算法基础05 单调队列--滑动窗口
1.滑动窗口「实现思路:」
滑动窗口可以用对列实现,k 就对应队列的长度,最朴素的方式是使用暴力枚举,但是时间复杂度较高。
降低时间复杂度则可以使用单调队列,那么什么是单调队列呢?
单调队列:假设我们要求的一块区域为3的最小值,那么我们在数组循环的时候,让队头默认最小值,而且对列里的数必须是单调递增,因为只有这样,才能保证队头最小,每次不用循环枚举浪费多余时间,直接输出区域内最小值。
「变量介绍:」
123const int N = 1e6 + 10; int arr[N]; // 这是存储所有元素的数组集合int k_arr[N]; // 这是单调对列,存储的是元素的下标值,要获取值 则 通过 arr[k_arr[x]] 获取对应值。
「具体做法:」
每次循环,先判断当前队列是否超出 k 的长度,超出则让单调对列的头指针后移一位。
然后再判断当前元素 x 与单调队列的尾元素的大小关系。
x > 单调队列[end] :就让x 的下标添加进队尾。
x > 单调队列[end]:就让单调对列的队尾弹出,在循环进行判断大小关系,直到队尾 < x元素或者队为 ...
算法基础04 数据结构:单链表+双链表
1.单链表「常见实现方式」:
STL vector :直接使用库函数,方便。
结构体: 最常规的数据结构,按部就班的来。
静态数组:数组模拟在算法题中提高运行速度。
「采用静态数组」:
「变量介绍」:
e[N]: 存储每一个插入的元素的值。
ne[N]: 存储每一个元素的下一个元素对应的的数组下标。
head: 存储 头节点的下标。
idx: 是计量数,可以理解为每插入一个元素都会追加在e[N]数组里,而idx表示当前到第几个该插入了,插入后idx++。
1int e[N], ne[N], head, idx;
「实现思路:」
初始化 head 为 -1,首先head指向空。初始化 idx 为0,从下标0开始记录。
指令为 ‘H’,表示在链表最头部插入,也就是头节点,对应代码
123456789// 在链表头插入void into_head(int x){ e[idx] = x; // 先存下当前要插入元素 ne[idx] = head; // 让 当前点的指向的下一个元素的下标 为 head的下一个, //因为头结点之前可能指向 a,你要在头结点插 ...
NodeJs学习记录
1.node简介
Node是一个基于Chrome V8引擎的JavaScript代码运行环境。
2.Node运行环境安装3.快速入门
在控制台 进入当前目录
123// 语法 node ***.js
npm切换源
获取原本镜像地址
设为淘宝镜像
获取原本镜像地址12npm get registry 1
https://registry.npmjs.org/
设为淘宝镜像123npm config set registry http://registry.npm.taobao.org/yarn config set registry http://registry.npm.taobao.org/
2.global
4.模块化开发概述
JavaScript在使用时存在两大问题,文件依赖和命名冲突。
开发规范
导出方式1
方式2
但是
// 当exports 对象 和 moudle.exports 对象指向的不是同一个对象时 以module.exports为准
123456789101112const greeting = name =&g ...
jquery+nodejs-博客项目
1.初始化123外链css等写绝对路径 (浏览器解析 相对于 浏览器地址)模板位置写 绝对路径 调取公共部分 不许要写绝对路径 (模板引擎解析 写相对)
1234567891011121314151. 建立项目所需文件夹public 静态资源model 数据库操作route 路由views 模板2. 初始化项目描述文件npm init -y3. 下载项目所需第三方模块npm install express mongoose art-template express-art-template4. 创建网站服务器5. 构建模块化路由6. 构建博客管理页面模板npm install express mongoose art-template express-art-template
1.1 路由模块化新建文件夹 route 里面新建 admin.js 与 home.js
之后 设置请求方式 和做出响应 admin页面同理
12345678910// 引入 expressconst express = require('express');const ho ...
网站搭建——腾讯云SSL证书认证及部署
1.申请腾讯云SSL证书
https://console.cloud.tencent.com/ssl/dsc/apply
在上述链接填写相应信息,之后提交
之后在我的证书列表下载证书
2.在linux上部署nginx证书腾讯云有一键部署,但是我的服务器不支持,这里提供 nginx SSL证书的手动部署。
证书安装
请在 SSL 证书控制台 中选择您需要安装的证书并单击下载。
cloud.tencent.com 代指你的域名文件。
在弹出的 “证书下载” 窗口中,服务器类型选择 Nginx,单击下载并解压缩 cloud.tencent.com 证书文件包到本地目录。 解压缩后,可获得相关类型的证书文件。其中包含 cloud.tencent.com_nginx 文件夹:
文件夹名称:cloud.tencent.com_nginx
文件夹内容:
cloud.tencent.com_bundle.crt 证书文件
cloud.tencent.com_bundle.pem 证书文件
cloud.tencent.com.key 私钥文件
cloud.tencent.com.csr CSR ...
算法基础03 位运算+离散化+区间合并
1.双指针2.位运算3.离散化1.区间和「题解:」
把所有坐标存到坐标数组 index_arr 中,并排序,去重。
之后在一个全为0 的数组 a 中,根据 find 函数寻找 x 在index_arr的下标值,然后根据下标值在a中进行加减操作。
之后 进行前缀和,根据a中的数据进行前缀和。
之后处理询问。
「注意事项:」
在进行询问查找时,x对应的下标值必定存在数据不为0,因为明确对x进行的操作,但是 l,r不一定有值,但是一定存在 index_arr 数组里面占据一个位置。
因为占据位置,所以 a 里面如果有 l,r对应,一定存在空缺 0,所以可以安心进行前缀和操作。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081#include <bits/stdc++.h>using namespace std;c ...
算法基础02 高精度运算+前缀和+差分
1.高精度运算1.高精度加法「题解:」
对输入的两个 整数字符串进行倒序添加进数组,以方便从低位到高位的加法运算,这样如果最后有进位,直接在数组末尾进行push_back就行。
然后判断一下那个数大,默认A最大,加法只用考虑长度即可,长度相同加法无所谓。
之后进行按位相加,0~9相加不会超过 20,进位 t 只用考虑 1 or 0。
每次需要加的位需要进行对10取余,即 (ai + bi) % 10,因为加法、只会把个位的数加上去,十位则为进位。
然后判断 t ,看是否 进位即可。
「注意:」
这里 一开始 t为0,t 直接加a[i],之后看是否在 B的长度内,在就再加上bi,t 再除以10判断是否有进位。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include <bits/stdc++.h>using namespace std;const int N = 100000 + 10;vector<int> ...