数据结构之搜索二叉树与关联性容器初接触
一、搜索二叉树
1>、前言
1. map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构
2. 二叉搜索树的特性了解,有助于更好的理解map和set的特性。
2>、概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
它的左右子树也分别为二叉搜索树
3>、代码实现
#pragma once
#include <iostream>
using namespace std;template<class K>
struct BSTreeNode
{BSTreeNode<K>* _left;BSTreeNode<K>* _right;K _key;BSTreeNode(const K& key = 0): _left(nullptr), _right(nullptr), _key(key){}
};template<class K> //K --- keywords关键字
class BSTree
{typedef BSTreeNode<K> Node;
public:/*BSTree(Node* root = nullptr):_root(root){}*///关键字defaultBSTree() = default; //特定强制生成默认构造//拷贝构造BSTree(const BSTree<K>& t){_root = _CopyR(t);}BSTree<K>& operator=(BSTree<K> t){swap(_root, t->_root);return *this;}~BSTree(){_destoryR(_root);}//插入bool insert(const K& key){if (_root == nullptr)_root = new Node(key);else{Node* cur = _root;Node* prev = nullptr;while (cur){prev = cur;if (cur->_key > key)cur = cur->_left;else if (cur->_key < key)cur = cur->_right;elsereturn false;}cur = new Node(key);if (prev->_key > key)prev->_left = cur;elseprev->_right = cur;}return true;}//查找bool find(const K& key){Node* cur = _root;while (cur){if (cur->_key > key)cur = cur->_left;else if (cur->_key < key)cur = cur->_right;elsereturn true;}return false;}//删除bool erase(const K& key){Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key > key){parent = cur;cur = cur->_left;}else if (cur->_key < key){parent = cur;cur = cur->_right;}else{//1.处理叶子节点//2.处理只有一个孩子的结点//二者可以合在一起处理//左为空if (cur->_left == nullptr){if (cur == _root)_root = cur->_right;else{if (parent->_left == cur)parent->_left = cur->_right;elseparent->_right = cur->_right;}delete cur;}//右为空else if (cur->_right == nullptr){if (cur == _root)_root = cur->_left;else{if (parent->_left == cur)parent->_left = cur->_left;elseparent->_right = cur->_left;}delete cur;}//3.处理子树的根节点//用左子树的最大的结点 或者 右子树最小的结点来跟这个子树的根节点替换else{Node* pminRight = cur;Node* minright = cur->_right;while (minright->_left){pminRight = minright;minright = minright->_left;}cur->_key = minright->_key;if (pminRight->_left == minright){pminRight->_left = minright->_right;}else{pminRight->_right = minright->_right;}delete minright;}return true;}}return false;}//递归方法实现函数//中序遍历//为了在外部可以使用中序遍历,可以返回头节点到类外,但是有一个更好的方法/*Node* GetRoot(){return _root;}*///为了使之递归,可以嵌套一层void InOrder(){_InOrder(_root);cout << endl;}bool findR(const K& key){return _findR(_root, key);}bool insertR(const K& key){return _insertR(_root, key);}//删除bool eraseR(const K& key){return _eraseR(_root, key);}protected:Node* _CopyR(Node*& root){if (root == nullptr)return nullptr;Node* newRoot = new Node(root->_key);newRoot->_left = _Copy(root->_left);newRoot->_right = _Copy(root->_right);return newRoot;}void _destoryR(Node*& root){if (root == nullptr)return;_destoryR(root->_left);_destoryR(root->_right);delete root;root = nullptr;}void _InOrder(Node* root){if (root == nullptr)return;_InOrder(root->_left);cout << root->_key << " ";_InOrder(root->_right);}bool _findR(Node* root, const K& key){if (root == nullptr)return false;if (root->_key == key)return true;if (root->_key > key)return _findR(root->_left, key);if (root->_key < key)return _findR(root->_right, key);}bool _insertR(Node*& root, const K& key){if (root == nullptr){root = new Node(key);return true;}if (root->_key > key) return _insertR(_root->_left, key);else if (root->_key < key) return _insertR(root->_right, key);else return false;}bool _eraseR(Node*& root, const K& key){if (root == NULL)return false;if (root->_key > key)return _eraseR(_root->_left, key);else if (root->_key < key)return _eraseR(root->_right, key);else{Node* del = root;//左为空if (root->_left == nullptr)root = root->_right;//右为空else if (root->_right == nullptr)root = root->_left;//都不为空else{Node* maxLeft = root->_left;while (maxLeft->_right)maxLeft = maxLeft->_right;swap(root->_key, maxLeft->_key);return _eraseR(root->_left, key);}delete del;return true;}}
private:Node* _root = nullptr; //缺省值
};
搜索二叉树的实现方式有两种,一种是if else控制循环,第二种是递归。其中关于节点与其其它结点的联系的构思很奇妙,举个栗子:
其形参是Node*& root,这个引用在其中的作用如上图所示。
4>、时间复杂度
如果按理想的想法来看这个二叉树,我们想当然的认为它的时间复杂度是O(logN)如下图左.但是它还有极端情况。比如
我们来看上图右的这个二叉树,它的时间复杂度却是O(N).所以搜索二叉树下限很不稳定。这时我们要引入一个平衡搜索二叉树,什么是平衡呢,我们后面来看。
5>、搜索二叉树的搜索应用场景
1、key模型(解决在不在?的问题)
举个栗子:车库系统,门禁系统,检查一篇文章单词是否拼写正确
相关容器:set
2、key/value模型(解决用一个值查找另一个值)
举个栗子:中英文互译字典,电话号码查询快递信息。
相关容器:map
要实现key/value模型,可以如下改造:
1.实现
template<class K, class V>struct BSTreeNode{BSTreeNode<K, V>* _left;BSTreeNode<K, V>* _right;K _key;V _value;BSTreeNode(const K& key = K(), const V& value = V()): _left(nullptr), _right(nullptr), _key(key),_value(value){}};template<class K, class V> //K --- keywords关键字class BSTree{typedef BSTreeNode<K, V> Node;public:/*BSTree(Node* root = nullptr):_root(root){}*///关键字defaultBSTree() = default; //特定强制生成默认构造//拷贝构造BSTree(const BSTree<K, V>& t){_root = _CopyR(t);}BSTree<K, V>& operator=(BSTree<K, V> t){swap(_root, t->_root);return *this;}~BSTree(){_destoryR(_root);}//插入bool insert(const K& key, const V& value){if (_root == nullptr)_root = new Node(key, value);else{Node* cur = _root;Node* prev = nullptr;while (cur){prev = cur;if (cur->_key > key)cur = cur->_left;else if (cur->_key < key)cur = cur->_right;elsereturn false;}cur = new Node(key, value);if (prev->_key > key)prev->_left = cur;elseprev->_right = cur;}return true;}//查找Node* find(const K& key){Node* cur = _root;while (cur){if (cur->_key > key)cur = cur->_left;else if (cur->_key < key)cur = cur->_right;elsereturn cur;}return nullptr;}//删除bool erase(const K& key){Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key > key){parent = cur;cur = cur->_left;}else if (cur->_key < key){parent = cur;cur = cur->_right;}else{//1.处理叶子节点//2.处理只有一个孩子的结点//二者可以合在一起处理//左为空if (cur->_left == nullptr){if (cur == _root)_root = cur->_right;else{if (parent->_left == cur)parent->_left = cur->_right;elseparent->_right = cur->_right;}delete cur;}//右为空else if (cur->_right == nullptr){if (cur == _root)_root = cur->_left;else{if (parent->_left == cur)parent->_left = cur->_left;elseparent->_right = cur->_left;}delete cur;}//3.处理子树的根节点//用左子树的最大的结点 或者 右子树最小的结点来跟这个子树的根节点替换else{Node* pminRight = cur;Node* minright = cur->_right;while (minright->_left){pminRight = minright;minright = minright->_left;}cur->_key = minright->_key;if (pminRight->_left == minright){pminRight->_left = minright->_right;}else{pminRight->_right = minright->_right;}delete minright;}return true;}}return false;}//递归方法实现函数//中序遍历//为了在外部可以使用中序遍历,可以返回头节点到类外,但是有一个更好的方法/*Node* GetRoot(){return _root;}*///为了使之递归,可以嵌套一层void InOrder(){_InOrder(_root);cout << endl;}void _destoryR(Node*& root){if (root == nullptr)return;_destoryR(root->_left);_destoryR(root->_right);delete root;root = nullptr;}void _InOrder(Node* root){if (root == nullptr)return;_InOrder(root->_left);cout << root->_key << " ";_InOrder(root->_right);}private:Node* _root = nullptr; //缺省值};
}
void test_BST_keyValue()
{keyValue::BSTree<string, string> b1;b1.insert("bei", "北");b1.insert("jing", "京");b1.insert("huan", "欢");b1.insert("ying", "迎");b1.insert("nin", "您");string str;while (cin>>str){auto ret = b1.find(str);cout << ret->_value << endl;}
}
按ctrl+z空格结束。
二、树形结构的关联式容器(使用)
根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结 构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使 用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列.
1.set
1.介绍
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- set在底层是用二叉搜索树(红黑树)实现的。
2. set的使用
1.set的模板参数列表
2.set的构造
函数声明 | 功能介绍 |
set (const Compare& comp = Compare(), const Allocator& = Allocator() ); | 构造空的set |
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator() ); | 用[first, last)区 间中的元素构造 set |
set ( const set& x); | set的拷贝构造 |
3. set的迭代器
函数声明 | 功能介绍 |
iterator begin() | 返回set中起始位置元素的迭代器 |
iterator end() | 返回set中最后一个元素后面的迭代器 |
const_iterator cbegin() const | 返回set中起始位置元素的const迭代器 |
const_iterator cend() const | 返回set中最后一个元素后面的const迭代器 |
reverse_iterator rbegin() | 返回set第一个元素的反向迭代器,即end |
reverse_iterator rend() | 返回set最后一个元素下一个位置的反向迭代器, 即rbegin |
const_reverse_iterator crbegin() const | 返回set第一个元素的反向const迭代器,即cend |
const_reverse_iterator crend() const | 返回set最后一个元素下一个位置的反向const迭代器,即crbegin |
4. set的容量
函数声明 | 功能介绍 |
bool empty ( ) const | 检测set是否为空,空返回true,否则返回false |
size_type size() const | 返回set中有效元素的个数 |
5.set修改操作
函数声明 | 功能介绍 |
pair<iterator,bool> insert ( const value_type& x ) | 在set中插入元素x,实际插入的是构成的键值对,如果插入成功,返回<该元素在set中的位置,true>如果插入失败,说明x在set中已经存在,返回<x在set中的位置,false> |
void erase (iterator position) | 删除set中position位置上的元素 |
size_type erase ( const key_type& x ) | 删除set中值为x的元素,返回删除的元素的个数 |
void erase ( iterator first, iterator last ) | 删除set中[first, last)区间中的元素 |
void swap ( set<Key,Compare,Allocator>& st ) | 交换set中的元素 |
void clear ( ) | 将set中的元素清空 |
iterator find ( const key_type& x ) const | 返回set中值为x的元素的位置 |
size_type count ( const key_type& x ) const | 返回set中值为x的元素的个数,否则返回0 |
void test_set1()
{set<int> s1;s1.insert(3);s1.insert(4);s1.insert(1);s1.insert(3);s1.insert(2);//迭代器set<int>::iterator it = s1.begin();while(it != s1.end()){//搜索树不允许随便修改key,可能会破坏搜索树的规则cout << *it << " ";++it;}cout << endl;//范围forfor(auto i : s1){cout << i << " ";}cout << endl;
}void test_set2()
{set<int> s1;s1.insert(3);s1.insert(4);s1.insert(1);s1.insert(3);s1.insert(2);int x;while(cin >> x){//排序 + 去重//set<int>::iterator ret = s1.find(x);// if(ret != s1.end())// cout << "在" << endl;// else// cout << "不在" << endl;//count可以用来查找set里的key是否存在,如果是,返回个数;否,返回0if(s1.count(x))cout << "在" << endl;elsecout << "不在" << endl;}
}
2.multiset
1.介绍
- multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
- 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。
- 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则 进行排序。
- multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列。
- multiset底层结构为二叉搜索树(红黑树)。
2.multiset的使用
1.count()
void test_set3()
{multiset<int> s1;s1.insert(3);s1.insert(4);s1.insert(1);s1.insert(3);s1.insert(2);int x;while(cin >> x){//排序 + 去重//set<int>::iterator ret = s1.find(x);// if(ret != s1.end())// cout << "在" << endl;// else// cout << "不在" << endl;//count可以用来查找set里的key是否存在,如果是,返回个数;否,返回0cout << "数量:" << s1.count(x) << endl; if(s1.count(x))cout << "在" << endl;elsecout << "不在" << endl;}
}
2.find
void test_set3()
{multiset<int> s1;s1.insert(3);s1.insert(4);s1.insert(1);s1.insert(3);s1.insert(2);s1.insert(3);s1.insert(3);s1.insert(3);for(auto i : s1){cout << i << " ";}cout << endl;//多个key,找中序的第一个keyauto ret = s1.find(3);while(ret != s1.end() && *ret == 3){cout << *ret << " ";++ret;}cout << endl;
}
3.map
1.介绍
- map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。
- 在map中,键值key通常用于排序和唯一地标识元素,而值value中存储与此键值key关联的 内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型 value_type绑定在一起,为其取别名称为pair: typedef pair value_type;
- 在内部,map中的元素总是按照键值key进行比较排序的。
- map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
- map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
- map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
2.map的使用
1.map的迭代器
函数声明 | 功能介绍 |
begin()和end() | begin:首元素的位置,end:最后一个元素的下一个位置 |
cbegin()和cend() | 与begin和end意义相同,但cbegin和cend所指向的元素不能修改 |
rbegin()和rend() | 反向迭代器,rbegin在end位置,rend在begin位置,其 ++和--操作与begin和end操作移动相反 |
crbegin()和crend() | 与rbegin和rend位置相同,操作相同,但crbegin和crend所 指向的元素不能修改 |
2.map的容量与元素访问
函数声明 | 功能简介 |
bool empty ( ) const | 检测map中的元素是否为空,是返回 true,否则返回false |
size_type size() const | 返回map中有效元素的个数 |
mapped_type& operator[] (const key_type& k) | 返回去key对应的value |
eg.统计水果出现的次数
//统计水果出现的次数
void test_map1()
{string arr[] = {"西瓜","西瓜","苹果","西瓜","苹果","苹果","西瓜","苹果","苹果","西瓜","苹果","香蕉","李子"};map<string,int> mp;//[]功能,1.插入key,value 2.修改value 3.插入+修改 4.查找for(auto& str : arr)++mp[str];mp["left"]; //1.插入mp["李子"] = 2; //2.修改mp["梨"] = 10; //3.插入 + 修改 cout << "西瓜:" << mp["西瓜"] << endl; //4.查找(在是查找,不在是插入)map<string,int>::iterator it = mp.begin();while(it != mp.end()){cout << it->first << ":" << it->second <<endl;++it;}
}
4.multimap
-
Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对,其中多个键值对之间的key是可以重复的。
-
在multimap中,通常按照key排序和唯一地标识元素,而映射的value存储与key关联的内 容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起, value_type是组合key和value的键值对: typedef pair value_type;
-
在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对 key进行排序的。
-
multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代器直接遍历multimap中的元素可以得到关于key有序的序列。
-
multimap在底层用二叉搜索树(红黑树)来实现。
注:
1.multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以重复的。
2.multimap中没有重载operator[]操作
相关文章:

数据结构之搜索二叉树与关联性容器初接触
一、搜索二叉树 1>、前言 1. map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构 2. 二叉搜索树的特性了解,有助于更好的理解map和set的特性。 2>、概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者…...

C语言整数和小数的存储
1.整数在内存中的存储 计算机使用二进制进行存储、运算,整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种,即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”&am…...

Games101Homework【6】Acceleration structure(Including framework analysis)
Code Analysis: friend: C中友元(友元函数和友元类)的用法和功能_friend class a<b>-CSDN博客 [C:不如Coding](11):友元函数与友元类_哔哩哔哩_bilibili Here is a simple…...

应用运维文档1
统一nginx接入配置指南 Nginx配置规范 1:不带微服务编码上下文至后端,以metadata-ui为例 location段配置信息,location配置中维护微服务编码上下文信息 # app_code: metadata-ui 流水线名称: metadata-ui location ~ ^/metadata-ui/(?P.*) {set $app_code metadata-ui;p…...

手机如何在线制作gif?轻松一键在线操作
现在大家都喜欢使用手机来拍摄记录有趣的事物,但是时间长了手机里的视频越来越多导致手机存储空间不够了,这些视频又不想删除时应该怎么办呢?这个很简单,下面就给大家分享一款不用下载手机就能操作的视频转gif网站-GIF中文网&…...

ChatGPT 在做什么,为什么有效?
原文:What Is ChatGPT Doing … and Why Does It Work? 译者:飞龙 协议:CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上,这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…...

Linux实验2 初步使用shell
一:实验目的 学习Linux下的文件系统结构,了解最基本的Linux下的shell命令操作,例如ls, cd, cat等各种指令操作。 学习vim编辑器的使用方式,学习如何使用ssh连接远程服务器。 二:实验内容 1.请指出下面每…...

甘特图/横道图制作技巧 - 任务组
在甘特图中通过合理的任务分组可以让项目更加清晰,修改也更方便。 列如下面的甘特图一眼不太容易看清楚整体的进度。或者需要把所有的任务整体的延迟或者提前只能这样一个一个的任务调整,就比较麻烦。 通过给任务分组,看这上面整体的进度就…...

Web题记
反序列化补充知识: private变量会被序列化为:\x00类名\x00变量名 protected变量会被序列化为: \x00\*\x00变量名 public变量会被序列化为:变量名web254 这个逻辑不难,自己刚看的时候还奇怪是不是自己哪里想错了,因为…...

学习java第三十六天
Spring 官网列出的 Spring 的 6 个特征: 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。 测试 :模拟对象,…...

0205矩阵分块法-矩阵及其运算-线性代数
文章目录 1 分块矩阵的定义2 分块矩阵的运算(性质)3 按列分块与按行分块 结语 1 分块矩阵的定义 将矩阵A用若干条纵线和横线分成许多个小矩阵,每一个小矩阵称为A的子快,以子块为元素的形式上的矩阵称为分块矩阵。 2 分块矩阵的运算…...

1、java语法入门(找工作版)
文章目录 一、Java简介二、Java常量与变量1、标识符2、关键字3、变量4、类的命名规则5、数据类型6、基本数据类型字面值7、变量的定义与初始化8、ASCII码和Unicode编码9、转义字符10、类型转换11、常量 三、Java运算符1、算术运算符2、赋值运算符3、关系运算符4、逻辑运算符5、…...

arm的状态寄存器
目录 一、arm 的 PSRs二、CPSR2.1 CPSR_cxsf 三、SPSR四、APSR 一、arm 的 PSRs arm 中有很多程序状态寄存器(Program Status Registers,PSRs)用于存储处理器的状态信息,包括 CPSR\SPSR\FPSR\APSR 等: CPSRÿ…...

2024 蓝桥打卡Day34
20240406蓝桥杯备赛 1、学习蓝桥云课省赛冲刺课 【1-手写与思维】【2-递归与递推】2、学习蓝桥云课Java省赛无忧班 【1-语言基础】3、代码练习字符串排序大小写转换 (ccfcsp之前要是学了我就能上200了 啊啊啊啊 错过啊)斐波那契数列 递归解法纸张尺寸问题…...

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第九套
华为海思校园招聘-芯片-数字 IC 方向 题目分享(有参考答案)——第九套 部分题目分享,完整版获取(WX:didadidadidida313,加我备注:CSDN huawei数字芯片题目,谢绝白嫖哈) 单选 1&…...

如何创建虚拟环境打包py文件
Python 项目通常依赖于特定的库和版本。不同的项目可能依赖于相同库的不同版本,这可能导致冲突。使用虚拟环境,你可以为每个项目创建一个独立的 Python 环境,每个环境都有自己的库和版本,从而避免了依赖冲突。 采用虚拟环境打包P…...

CSS 学习笔记 总结
CSS 布局方式 • 表格布局 • 元素定位 • 浮动布局(注意浮动的负效应) • flex布局 • grid布局(感兴趣的可以看下菜鸟教程) 居中设置 元素水平居中 • 设置宽度后,margin设置为auto • 父容器设置text-alig…...
基于Swin Transformers的乳腺癌组织病理学图像多分类
乳腺癌的非侵入性诊断程序涉及体检和成像技术,如乳房X光检查、超声检查和磁共振成像。成像程序对于更全面地评估癌症区域和识别癌症亚型的敏感性较低。 CNN表现出固有的归纳偏差,并且对于图像中感兴趣对象的平移、旋转和位置有所不同。因此,…...

MySQL主从的介绍与应用
mysql主从 文章目录 mysql主从1. 主从简介1.1 主从作用1.2 主从形式 2. 主从复制原理3. 主从复制配置3.1 mysql安装(两台主机安装一致,下面只演示一台主机操作)3.2 mysql主从配置3.2.1 确保从数据库与主数据库里的数据一样3.2.2 在主数据库里…...

pytest中文使用文档----12缓存:记录执行的状态
1. cacheprovider插件 1.1. --lf, --last-failed:只执行上一轮失败的用例1.2. --ff, --failed-first:先执行上一轮失败的用例,再执行其它的1.3. --nf, --new-first:先执行新加的或修改的用例,再执行其它的1.4. --cache…...

【代码随想录】哈希表
文章目录 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和454. 四数相加 II383. 赎金信15. 三数之和18. 四数之和 242.有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {if(snull || tnull || s.length()!t.length()){return …...

绘图工具 draw.io / diagrams.net 免费在线图表编辑器
拓展阅读 常见免费开源绘图工具 OmniGraffle 创建精确、美观图形的工具 UML-架构图入门介绍 starUML UML 绘制工具 starUML 入门介绍 PlantUML 是绘制 uml 的一个开源项目 UML 等常见图绘制工具 绘图工具 draw.io / diagrams.net 免费在线图表编辑器 绘图工具 excalidr…...

【Vue】 Vue项目中的跨域配置指南
她坐红帐 面带浓妆 唢呐一声唱 明月光 这女子泪眼拜高堂 一拜天地日月 二拜就遗忘这一生 跪三拜红尘凉 庭院 大门锁上 杂乱的眼光 多喧嚷 这女子笑颜几惆怅 余生喜乐悲欢都无关 她眼中已无光 🎵 倪莫问《三拜红尘凉》 在前后端分离的项目开发中…...

跨站脚本攻击XSS
漏洞产生原因: XSS攻击本质上是一种注入攻击,产生原因是Web应用对外部输入参数处理不当,攻击者将恶意代码注入当前Web界面,在用户访问时执行 漏洞攻击手段: 反射型(非持久型)XSS-将payload包…...

C++中的vector与C语言中的数组的区别
C中的vector和C语言中的数组在很多方面都有所不同,以下是它们之间的一些主要区别: 大小可变性: vector是C标准模板库(STL)提供的动态数组容器,它的大小可以动态增长或减少。这意味着你可以在运行时添加或删…...

drawio画图编辑图形颜色
drawio画图编辑图形颜色 团队的安全第一图表。将您的存储空间带到我们的在线工具中,或使用桌面应用程序进行本地保存。 1.安装准备 1.1安装平台 多平台 1.2在线使用 浏览器打开网页使用 1.3软件下载 drawio官网github仓库下载 2.在浏览器的网页中使用drawio…...

uniapp中uni.navigateTo传递变量
效果展示: 核心代码: uniapp中uni.navigateTo传递变量 methods: {changePages(item) {setDatas("maintenanceFunName", JSON.stringify(item)).then((res) > {uni.navigateTo({url: /pages/PMS/maintenance/maintenanceTypes/maintenanceT…...

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务
Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务 1. 问题2. 分析3. 解决方案参考 1. 问题 使用Nacos作为注册中心的Spring Boot项目,以war包形式部署到服务器上,启动项目发现该服务无法在Nacos中注册。 2. 分析 SpringCloud 项目打 war 包部…...

(2024,Attention-Mamba,MoE 替换 MLP)Jamba:混合 Transformer-Mamba 语言模型
Jamba: A Hybrid Transformer-Mamba Language Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 2. 模型架构 3. 收获的好处 3.1 单个 80GB GPU 的 Jamba 实现 …...

“Java泛型” 得所憩,落日美酒聊共挥
本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…...