数据结构--【顺序表与链表】笔记
顺序表
template <class T>
class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类
//公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员,受保护成员在 arrList 类中仍然是受保护成员。
{
private:T* aList; //存储顺序表的实例,以后可以直接拿aList[]当数组用int maxSize;int curLen; //顺序表的当前长度int position; //当前处理位置
public:arrList(const int size){maxSize = size;aList = new T[maxSize];curlen = position = 0;}~arrList(){delete[] aList;}void clear(){delete[] aList;curLen = position = 0;aList = new T[maxSize];}//查找操作bool arrList<T>::getPos(int& p, const T value){for (int i = 0; i <= curLen; i++){if (aList[i] == value){p = i;return true;}}return false;}//插入操作bool arrList <T> ::insert(const int p, const T value){if (curLen >= maxSize) //检测当前数组是否越界{ cout << "overflow"; return false;}if (p<0 || p>curLen) //检测插入位置是否合法{cout << "illegal";return false;}for (int i = curLen; i > p; i--){aList[i] = aList[i = 1];}aList[p] = value;curLen++;return true;}//删除操作bool arrList<T> ::delete(const int p){if (curLen <= 0) //判断元素是否为空,空表不能删除{cout << "no element to delete \n"<<endl;return false;}if (p<0 || p>curLen-1) //注意这里是p>curLen-1不是curLen{cout << "illegal";return false;}for (int i = p; i < curLen-1; i++){aList[i] = aList[i + 1];}curLen--;//这里不需要再对aList[curLen-1]进行清零,因为curLen长度已经减小了//最后一个元素不在操作范围内return false;}
};
链表
单链表
head 是指向单链表开始结点的指针,tail 是指向单链表尾结点的指针,对链表的访问只能通过头尾指针进行操作
头结点:虚拟结点,值被忽略,不被看做表中的实际元素,避免对空表的处理
操作分别有:
- 结点的定义
- 单链表的类型定义
- 定义链表的构造函数和析构函数
- 链表的检索
- 链表的插入操作
- 链表的删除操作
说明:Link是模板类,代表着结点
lnkList是单链表类,里面存储着管理链表的方法以及首尾指针
template <class T> class Link //代表链表中的一个结点
{
public:T data; //保存结点的内容Link<T>* next; //指向后继结点的指针(指向Link类的指针)//函数重载,一个是有一个参数的,另一个是有两个参数的Link(const T info, const Link<T>* nextValue = NULL)//既有下一个结点的地址,又有data//这里是默认值为NULL,即当只传入data时,默认为最后一个结点{data = info;next = nextValue;}Link(const Link<T>* nextValue)//只指向下一个结点的指针,但是并没有值{next = nextValue;}
};
//单链表的类型定义
//在定义模板类时,必须在类名之前加上模板参数声明template <class T>
template <class T> class lnkList:public List<T>
{
private:Link<T>* head, * tail;Link<T>* setPos(const int p); //返回线性表指向第p个元素的指针值
public:lnkList(int s);~lnkList();bool isEmpty();...bool getPos(int& p, const T value);
};
//带有头结点的单链表的构造函数和析构函数
template<class T> lnkList<T>::lnkList(int defSize)
//在类外定义函数的时候要把模板类写完整了,加上<T>
{head = tail = new Link<T>;
}
template <class T> lnkList<T>::~lnkList()
{Link<T>* tmp;while (head != NULL){tmp = head;head = head->next;delete tmp;
//要先将head值给tmp(注意这里是指针的关系),然后再让head等于下一个指针
//删除了tmp也就相当于删除了第一个head
//如果直接delete head就会丧失对下一个结点的访问权}
}
//链表的检索
template <class T> Link<T>* lnkList<T>::setPos(int i)
{int count = 0;if (i == -1) return head;Link<T>* p = head->next; //创建一个新结点,p指针是一个指向Link类型变量的指针,//在这个Link类型变量中是while (p != NULL && count < i){p = p->next;count++;}return p;
}
//链表的插入
template <class T> bool lnkList<T> ::insert(const int i, const T value)
{Link<T>* p,*q;//调用 setPos 函数找到插入位置的前一个节点if ((p = setPos(i - 1)) == NULL){cout << "非法插入点";return false;}q = new Link<T>(value, p->next); //q是新构建的结点p->next = q; //将新的q结点插入至p结点之后,也就是说p是q的上一个结点if (p == tail)tail = q;return true;
}
//链表的删除
template <class T> bool lnkList<T>::delete(const int i)
{Link<T>* p, * q;if ((p = setPos(i - 1)) == NULL || p == tail){cout << "非法删除点";return false;}q = p->next;//q是真正的待删结点if (q == tail){tail = p;p->next = NULL;delete q;}else if (q != NULL){p->next = q->next;delete q;}return true;
}
链表实验题
顺序表做法
偶遇顺序表难题,用指针+结构体做拼尽全力无法战胜,用数组做十分钟轻松战胜(但是sstream学了一阵子)
#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
int a[10000], b[10000];
int main()
{string line1, line2;getline(cin, line1);getline(cin, line2);stringstream ss1(line1);stringstream ss2(line2);int m, n;//m是系数,n是指数while (ss1 >> m >> n){a[n] = m;}while (ss2 >> m >> n){b[n] = m;}int len = max(sizeof(a) / 4, sizeof(b) / 4);for (int i = 0; i < len; i++){a[i] += b[i];}for (int i = len - 1; i >= 0; i--){if (a[i] == 0) continue;cout << a[i] << " " << i << " ";}return 0;
}
链表做法
#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
class node
{int data;node* next;node(const int info,node* nextnode){data = info;next = nextnode;}node(node* nextnode){next = nextnode;}
};
class list {};
int main()
{}
#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
struct node //创建新结点
{int m;//系数int n;//指数node* next;node(int a, int b){m = a;n = b;next = nullptr;}
};
node* creat()//创建多项式列表
{node* head = nullptr; //表示指向第一个结点的指针node* tail = nullptr; //表示当前最新结点的指针,等全部录入完毕就是指向最后一个结点string ss1;getline(cin, ss1);stringstream sss(ss1);int a, b;while (sss >> a >> b){
//每次新建一个结点,给它一个新的指针node* newnode = new node(a, b); //返回内存地址if (!head) head = tail = newnode;else{
//假设原来链表为A-->B-->C,此时tail指向C,当执行ail->next = newnode时候将C和新结点D连接在一起,
// 链表变成A-->B-->C-->D,然后再把tail更新成最新的D tail->next = newnode; tail = newnode;}}return head; //返回头指针就是返回整条链表
}
node* add(node* f1, node* f2) {node index(0, 0);node* tail = &index;while (f1 && f2) {if (f1->n > f2->n) {
//经典操作,同创建链表里头的tail->next = f1;tail = tail->next;f1 = f1->next;}else if (f1->n < f2->n) {tail->next = f2;tail = tail->next;f2 = f2->next;}else {
//如果相等的话就复杂了int sum = f1->m + f2->m;node* tmp1 = f1;node* tmp2 = f2;
//先都往后移动一个结点f1 = f1->next;f2 = f2->next;if (sum != 0) {tmp1->m = sum;
//经典操作,连接新结点tmp1并更新tailtail->next = tmp1;tail = tail->next;tail->next = nullptr; // 防止遗留指针,相当于切断了和原来链的联系
//假设 f1 链表为 A(系数 3, 指数 2) -> B(系数 1, 指数 1),f2 链表为 C(系数 2, 指数 2) -> D(系数 4, 指数 1)。
// 当处理到指数为 2 的节点 A 和 C 时,系数相加结果为 3 + 2 = 5,将 A 的系数更新为 5 并连接到新链表尾部。
// 如果不将 tail->next 置为 nullptr,A 原本的 next 指针仍然指向 B,这会导致新链表中在 A 后面错误地连接了 B,
// 而后续可能会继续错误地处理这些遗留节点。}else {delete tmp1;}
//tmp2总是要删的delete tmp2;}}
//其实后面 f1?f1:f2 才是一个整体,如果f1存在,那么就接上f1的值tail->next = f1 ? f1 : f2;
//返回首结点的地址return index.next;
};void print(node* f1)
{node* cur = f1;bool first = true;while (cur){if (!first){cout << " ";}cout << cur->m << " " << cur->n;first = false;cur = cur->next;}
}
void free(node* f)
{while (f){node* tmp = f;f = f->next;delete tmp;}
}
int main()
{node* f1 = creat();node* f2 = creat();node* summ = add(f1, f2);print(summ);free(summ); free(f1);free(f2);return 0;
}
链表实验选做题
照葫芦画瓢总算出来一个,但是需要逆序输出,但是爷爷懒得写直接存个数组里头逆序输出了hhh
#include<iostream>
#include<sstream>
using namespace std;struct node
{int data;node* next;node(int a){data = a;next = nullptr;}
};
node* creat()
{node* head=nullptr;node* tail=nullptr;string s;getline(cin, s);stringstream ss(s);int a;while (ss >> a){node* newnode = new node(a);if (!head) head = tail = newnode;else {tail->next = newnode;tail = newnode;}}return head;
}
node* order(node* f1, node* f2)
{node index(0);node* tail = &index;while (f1 && f2){if (f1->data < f2->data){tail->next = f1;tail = tail->next;f1 = f1->next;}else if (f1->data > f2->data){tail->next = f2;tail = tail->next;f2 = f2->next;}else{f1 = f1->next;f2 = f2->next;tail->next = f1;tail = tail->next;tail->next = f2;tail = tail->next;}}tail->next= f1 ? f1 : f2;return index.next;
}
void print(node* head)
{int count = 0;int a[100000] = { 0 };node* tail = head;while (tail){count++;a[count] = tail->data;tail = tail->next;}for (int i = count; i >= 1; i--) cout << a[i] << " ";
}
void free(node* f)
{while (f){node* cur = f;f = f->next;delete cur;}
}
int main()
{node* f1 = creat();node* f2 = creat();node* result = order(f1, f2);print(result);free(result);return 0;
}
洛谷 单向链表
题目描述
实现一个数据结构,维护一张表(最初只有一个元素 1)。需要支持下面的操作,其中 x 和 y 都是 1 到 106 范围内的正整数,且保证任何时间表中所有数字均不相同,操作数量不多于 105:
1 x y
:将元素 y 插入到 x 后面;2 x
:询问 x 后面的元素是什么。如果 x 是最后一个元素,则输出 0;3 x
:从表中删除元素 x 后面的那个元素,不改变其他元素的先后顺序。
输入格式
第一行一个整数 q 表示操作次数。
接下来 q 行,每行表示一次操作,操作具体见题目描述。
输出格式
对于每个操作 2,输出一个数字,用换行隔开。
输入输出样例
输入
6 1 1 99 1 99 50 1 99 75 2 99 3 75 2 1
输出
75 99
一开始写的完美无瑕的代码结果T了两个点
#include<iostream>
#include<sstream>
using namespace std;
struct node
{int data;node* next;node(int n){data = n;next = nullptr;}
};
node* setpos(node* head,int x)
{node* cur = head;while (cur->data != x){cur = cur->next;}return cur;
}
node* insert(node* head,int x,int y)
{node* cur = setpos(head, x);node* cur2 = cur->next;node* newnode=new node(y);newnode->next = cur2;cur->next = newnode;return head;
}
node* remove(node* head,int x)
{node* cur = setpos(head, x);node* cur1 = cur->next; cur->next=cur1->next;delete cur1;return head;
}
void print(node* curnode)
{cout <<curnode->data<<endl;
}
void free(node* head)
{while (head){node* tmp = head;head = head->next;delete tmp;}
}
int main()
{int n,k,x,y;cin >> n;node* index = new node(1);node* cur = nullptr;for (int i = 0; i < n; i++){cin >> k;if (k == 1){cin >> x >> y;index = insert(index, x, y);}else if (k == 2){cin >> x;cur= setpos(index, x);cur = cur->next;if (!cur) {cout << 0<< endl; continue;}print(cur);}else if (k == 3){cin >> x;index = remove(index, x);}}free(index);return 0;
}
那应该是还得优化,但是怎么优化呢,网上优化代码看不懂思密达,但是我会写数组呀嘻嘻
#include<iostream>
#include<sstream>
using namespace std;
int a[1000000]; //a[i]中i表示data,a[i]表示下一个结点的地址(就是第几位)
void insert()
{int x, y;cin >> x >> y;a[y] = a[x];a[x] = y;
}
void remove()
{int x;cin >> x;a[x] = a[a[x]];
}
int main()
{a[1] = 0;int k,n;cin >> n;for (int i = 0; i < n; i++){cin >> k;if (k == 1) insert();if (k == 2){int x;cin >> x;if (!a[x]){cout << 0 << endl;continue;}else cout << a[x]<<endl;}if (k == 3) remove();}return 0;
}
洛谷 临值查找
题目描述
给定一个长度为 n 的序列 A,A 中的数各不相同。
对于 A 中的每一个数 Ai,求:
min1≤j<i∣Ai−Aj∣
以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 Aj 较小的那个。
输入格式
第一行输入整数 n,代表序列长度。
第二行输入 n 个整数 A1∼An,代表序列的具体数值,数值之间用空格隔开。
输出格式
输出共 n−1 行,每行输出两个整数,数值之间用空格隔开。
分别表示当 i 取 2∼n 时,对应的 min1≤j<i∣Ai−Aj∣ 和 Pi 的值。
输入输出样例
输入
3 1 5 3
输出
4 1 2 1
全WA(笑)后来发现题目理解错了,人家让找最小的data,不是最小的id
修改后还是错
#include<iostream>
#include<sstream>
#include<cmath>
#include<climits> //使用INT_MAX
using namespace std;
struct node
{int data;int id;node* next = NULL;node(int n,int z){data = n;id = z;}
};
void result(node* head, node* cur)
{int min_ans = INT_MAX;int index = -1;int select_val = INT_MAX;while (head != cur){int cur_data = abs(cur->data - head->data);if (cur_data< min_ans||cur_data==min_ans&&head->data<select_val){min_ans = cur_data;select_val = head->data;index = head->id;}head = head->next;}cout << min_ans << " " << index << endl;
}int main()
{int n,k;cin >> n;node* head = NULL;node* tail = NULL;bool flag = true;for (int i = 1; i <= n; i++){cin >> k;node* newnode = new node(k,i);if (!head) { head = tail = newnode; flag = false; }tail->next = newnode;tail = newnode;if(i!=1) result(head, tail);}return 0;
}
这里出现问题的在于
if (!head) { head = tail = newnode; flag = false; }tail->next = newnode;tail = newnode;
这里在首结点吧tail的next赋值newnode,造成循环链表,正确写法应该是:
if (!head) { head = tail = newnode; flag = false; }else {tail->next = newnode;tail = newnode;}
全部改完以后没问题了,但是还是T了四个点
用set优化,快速排序,这样就不用一个一个找了
#include<iostream>
#include<sstream>
#include<cmath>
#include<set>
#include <climits> // 添加头文件以使用INT_MAX
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);int n, val;cin >> n;set<pair<int,int>> nums;for (int i = 1; i <= n; i++){cin >> val;int min_diff = INT_MAX;//记录最小差值int min_val = INT_MAX;//记录最小的Ajint ans_id = -1;if (i == 1){nums.insert({ val,i });continue;}auto it = nums.lower_bound({val,0});//nums.end() 返回的末尾迭代器不指向任何有效元素if (it != nums.end()){if (abs(val - it->first) < min_diff || abs(val - it->first) == min_diff && it->first < min_val){min_diff = abs(val - it->first);min_val = val;ans_id = it->second;}}if (it != nums.begin()) {it--;if (abs(val - it->first) < min_diff || abs(val - it->first) == min_diff && it->first < min_val){min_diff = abs(val - it->first);min_val = val;ans_id = it->second;}}cout << min_diff << " " << ans_id<<'\n';nums.insert({ val,i });}return 0;
}
学到了用set的很多知识,比如:
1.set中每一个元素的键值都唯一,所以在向set中插入相同的数据的时候,会插不进去
2.所有元素都会根据元素的字典序进行排序,先比较第一个,第一个一样大就比较第二个,默认从小到大
3.迭代器声明时用auto it=nums容器中某个元素,表示这个元素的时候就用 it->first 和 it->second 来表示
4.nums.end()返回的末尾迭代器不指向任何有效元素
5.用于解除cin和cout的绑定,加快速度防止TLE
ios::sync_with_stdio(false);
cin.tie(0);
6.set声明:set<pair<int,int>>
用STL写链表(蓝桥杯书上的)
#include<iostream>
#include<list>
using namespace std;
list<int> list1;//创建一个STLlist实例
int main()
{int n, m, x, y, z;cin >> n >> m;for (int i = 1; i <= n; i++)list1.push_back(i); //在链表尾部添加元素while (m --){cin >> x >> y >> z;list1.remove(x);list<int>::iterator it = find(list1.begin(), list1.end(), y);//也可以用auto it定义if (z == 0) list1.insert(++it, x);if (z == 1) list1.insert(it, x);}for (int x : list1){cout << x << " ";}cout << endl;return 0;
}
知识点:
- list1.push_back(x):将x添加至链表的尾部
- pop_back():删除链表尾部元素
- pop_front():删除链表头部元素
- front():读取头部元素
- back():读取尾部元素
- insert(it,x):在it位置插入元素x
- erase(it):在it位置删除元素,也可以用list1.remove(x)删除x元素
- 定义迭代器:
list<int>::iterator it = find(list1.begin(), list1.end(), y);//也可以用auto it定义
相关文章:
数据结构--【顺序表与链表】笔记
顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员,受保护成员在 arrList 类中仍然是受保护成员。 { …...
使用AI一步一步实现若依前端(9)
功能9:退出登录功能 功能8:页面权限控制 功能7:路由全局前置守卫 功能6:动态添加路由记录 功能5:侧边栏菜单动态显示 功能4:首页使用Layout布局 功能3:点击登录按钮实现页面跳转 功能2…...
Excel两列和依次相减
Excel实现左列依次行数的和减去右列依次行数的和: 举例:结余SUM(预付款)-SUM(开支) 公式:SUM($B$2:B2)-SUM($C$2:C2)...
智能合约中权限管理不当
权限管理不当 : 权限管理不当是智能合约中常见的安全问题之一,尤其是在管理员或特定账户被过度赋予权限的情况下。如果合约中的关键功能,如转移资产、修改合约状态或升级合约逻辑,可以被未经授权的实体随意操作,这将构…...
Java糊涂包(Hutool)的安装教程并进行网络爬虫
Hutool的使用教程 1:在官网下载jar模块文件 Central Repository: cn/hutool/hutool-all/5.8.26https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.26/ 下载后缀只用jar的文件 2:复制并到idea当中,右键这个模块点击增加到库 3&…...
ubuntu软件
视频软件,大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…...
python高效试用17---两个字符串组成一个新的字符串和两个字符串组成元组作为key哪个更高效
在 Python 中,使用字符串连接 (str1 str2) 作为 key 和使用元组 ((str1, str2)) 作为 key 的效率差异,主要受以下因素影响: 哈希计算速度: 字符串连接 (str1 str2):会创建一个新的字符串对象,并计算哈希…...
【C++模板】:开启泛型编程之门(函数模版,类模板)
📝前言: 在上一篇文章C内存管理中我们介绍了C的内存管理,重点介绍了与C语言的区别,以及new和delete。这篇文章我们将介绍C的利器——模板。 在C编程世界里,模板是一项强大的特性,它为泛型编程奠定了坚实基础…...
华为eNSP:2.配置OSPF报文分析和验证
一、OSPF的5种数据包 Hello包:用于发现和维护邻居关系。定期发送,确保邻居路由器在线。 数据库描述包(DBD, Database Description Packet):在邻居关系建立后,用于交换链路状态数据库的摘要信息。 链路状…...
一学就会的深度学习基础指令及操作步骤(3)模型训练验证
文章目录 模型训练验证损失函数和优化器模型优化训练函数验证函数模型保存 模型训练验证 损失函数和优化器 loss_function nn.CrossEntropyLoss() # 损失函数 optimizer Adam(model.parameters()) # 优化器,优化参数模型优化 获得模型所有的可训练参数&#x…...
【病毒分析】熊猫烧香病毒分析及其查杀修复
目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …...
K8s 1.27.1 实战系列(九)Volume
一、Volume介绍 Volume 指的是存储卷,包含可被Pod中容器访问的数据目录。容器中的文件在磁盘上是临时存放的,当容器崩溃时文件会丢失,同时无法在多个Pod中共享文件,通过使用存储卷可以解决这两个问题。 1、Volume 的核心作用 数据持久化与生命周期管理 Volume 的核心目标…...
火绒企业版V2.0全面支持Linux与国产化系统!免费试用助力国产化终端安全升级
国产化浪潮下的安全新挑战 随着信创产业的加速推进,国产操作系统(统信UOS、麒麟OS等)和ARM架构服务器逐步成为政企核心业务的基础设施。然而,针对国产化系统的勒索攻击、网页篡改、供应链漏洞等威胁频发,传统安全方案…...
黑色RGB是什么
>好的,用户现在问的是“黑色rgb是什么”。我需要先理解用户的问题。之前用户在使用MATLAB调整网格线颜色时,可能看到了默认颜色是黑色,或者之前我提到过默认颜色是[0.15 0.15 0.15],而用户可能现在想知道黑色的RGB值具体是什么…...
基于springboot+vue的佳途旅行分享预约平台
一、系统架构 前端:vue2 | element-ui | html 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. web端-注册 02. web端-登录 03. web端-系统主页1 04. web端-系统主页2 05. we…...
Nuxt3 ssr build/dev时区分不同的环境
package.json "scripts": {"build": "nuxt build --dotenv .env.prod","build:dev": "nuxt build --dotenv .env.dev","postbuild": "mv -f .output ./dist/.output", //支持自定义文件名"dev&quo…...
利用OpenResty拦截SQL注入
需求 客户的一个老项目被相关部门检测不安全,报告为sql注入。不想改代码,改项目,所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些,都给拦截掉,从而实现拦截sql…...
保姆级别使用Python实现“机器学习“案例
从安装到运行手把手教学,保证不迷路~ 🌈 零基础友好版教程 📦 第一步:安装必备工具包 别慌!这里有两种安装方式,选你顺手的 方式1:用代码自动安装(推荐新手) 直接在你的Python代码最前面加这几行,运行时会自动安装: # 把这坨代码贴在文件最前面! import sys im…...
【最新】DeepSeek 实用集成工具有那些?
deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意:以下内容来自awesome-deepseek-integration DeepSeek 实用集成(awesome-deepseek-integration) 将…...
【前端面试题】Vu3常见的面试题
1.Vue3与 Vue2的核心区别有哪些? 响应式系统 : Vue2:通过Object.defineProperty 实现响应式。这种方式在处理对象属性的添加和删除时存在局限性,且无法直接监控数组的变化 ;Vue3:采用Proxy 实现响应式&…...
论文阅读分享——UMDF(AAAI-24)
概述 题目:A Unified Self-Distillation Framework for Multimodal Sentiment Analysis with Uncertain Missing Modalities 发表:The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24) 年份:2024 Github:暂…...
JavaWeb——Mybatis、JDBC、数据库连接池、lombok
一、Mybatis 目录 一、Mybatis 二、JDBC 三、数据库连接池 1.概述 2.优势 3.标准接口 4.常见产品 四、lombok 1.概述 2.导入依赖 3.注解 创建步骤: 1.准备工作(创建springboot工程、数据库表user、实体类User) 2.引入Mybatis的相关依赖&am…...
【网络安全工程】任务12:网络安全设备
目录 一、防火墙 1、作用 2、配置方式 3、存在的漏洞 二、入侵检测系统(IDS)和入侵防御系统(IPS) 1、作用 2、配置方式 3、存在的漏洞 三、防病毒网关 1、作用 2、配置方式 3、存在的漏洞 …...
【学习笔记】《逆向工程核心原理》02.小段标记法、IA-32寄存器、栈、abex‘crackme、栈帧
文章目录 1. 字节序1.1. 大端序与小端序1.2. 在OllyDbg中查看小端序 2.IA-32寄存器2.1. 什么是CPU寄存器2.2. IA-32寄存器2.2.1. 通用寄存器2.2.2. 段寄存器2.2.3. 程序状态与控制寄存器2.2.4. 指令指针寄存器 3. 栈1.1. 栈的特征3.1.2. 栈操作实例 4. abexcrackme4.1. 开始调试…...
固定表头、首列 —— uniapp、vue 项目
项目实地:也可以在 【微信小程序】搜索体验:xny.handbook 另一个体验项目:官网 一、效果展示 二、代码展示 (1)html 部分 <view class"table"><view class"tr"><view class&quo…...
用友U9二次开发-问题记录
学习资料:链接: https://pan.baidu.com/s/13JbKSSRkSn2V6-dYX5zKFQ 提取码: p9at 页面 &__dmtrue 客开插件 &Admintrue 开发者使用查看代码 插件 UI插件配置项 1.关闭热插拔 2.在configuration节点下加配置,多个在Web…...
python---pickle库
pickle库 pickle 是 Python 标准库中的一个模块,它可以将 Python 对象(如列表、字典、类实例等)转换为字节流,这个过程称为“序列化”;反之,也可以将字节流转换回 Python 对象,这个过程称为“反…...
如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户。 随时近来 AI 大模型的火热,越来越多的客户,问…...
论文阅读 GMM-JCSFE Model(EEG Microstate)
Motor Imagery Recognition Based on GMM-JCSFE Model 1.问题与困境 1.1 微状态 将连续的EEG信号分解为一系列短暂的、稳定的“微状态”,每个微状态代表了大脑在特定时间窗口内的特定功能。微状态模型的核心思想是,大脑的活动可以看作是由一系列离散的…...
[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传
文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点: 面向连接,可靠性高,全双工,面向字节流udp特点:无连接,不…...
Etcd的安装与使用
1.Etcd介绍 Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服 务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接 watch 功能,能够及时收到数据变化通知。 以下 是关于 …...
ROS实践(四)机器人建图及导航
一、概念 机器人导航是指机器人在环境中自主地从一个地点移动到另一个地点的过程。这个过程涉及到多个关键技术,包括定位、路径规划、避障等。机器人导航通常包括以下几个重要部分。 1. 定位 定位是机器人确定自己在环境中的位置的过程。常用的定位方法包括…...
Excel 中如何实现数据透视表?
Excel 中如何实现数据透视表? 数据透视表(PivotTable)是 Excel 中强大的数据分析工具,能够快速汇总、分析和展示大量数据。本文将详细介绍如何在 Excel 中创建和使用数据透视表。 1. 数据透视表的基本概念 数据透视表是一种交互…...
SQLiteStudio:一款免费开源跨平台的SQLite管理工具
目录 1.简介 2.下载与安装 3.实现分析 4.总结 1.简介 SQLiteStudio 是一款专门用于管理 SQLite 数据库的图形化工具,由波兰开发者开发并维护。由于 SQLite 以其轻量级、零配置、嵌入式等特性被广泛应用于各种小型项目、移动应用和桌面应用中,而 SQLi…...
实现Django和Transformers 构建智能客服大模型(模拟订单系统)
一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…...
【沐渥科技】氮气柜日常如何维护?
氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南: 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部,避免灰尘堆积。避免使用腐蚀性清洁剂,防止损伤密封条或传感器。…...
数据安全之策:备份文件的重要性与自动化实践
在信息化高速发展的今天,数据已成为企业运营和个人生活中不可或缺的重要资源。无论是企业的财务报表、客户资料,还是个人的家庭照片、学习笔记,数据的丢失或损坏都可能带来无法挽回的损失。因此,备份文件的重要性日益凸显…...
windows下玩转vllm:vllm简介;Windows下不能直接装vllm;会报错ModuleNotFoundError: No module named ‘vllm._C‘
文章目录 -1. Windows下不能直接装vllm前言ollama vs vllmOllamavLLMvllm简介核心特点PagedAttention内存优化高效推理应用场景安装与使用-1. Windows下不能直接装vllm 我其实很久之前就意识到这个事儿,后来太久没搞就又忘了。 昨天忙活了半宿,得来的确实一个无法解决的报错…...
目录《Vue 3 + TypeScript + DeepSeek 全栈开发实战》
在快速迭代的软件开发世界里,技术的融合与创新始终是推动行业前行的不竭动力。今天,我们站在了前端技术与大数据搜索技术交汇的十字路口,手中的工具不再仅仅是编码的利器,更是解锁未来应用无限可能的钥匙。正是基于这样的时代背景…...
for...of的用法与介绍
一、定义 for...of 是 ES6(ECMAScript 2015)引入的一种用于 遍历可迭代对象(Iterable)的循环语句 二、语法 for (const item of iterable) {// 代码块 }参数: iterable:一个可迭代对象(如数组…...
快速使用PPASR V3版不能语音识别框架
前言 本文章主要介绍如何快速使用PPASR语音识别框架训练和推理,本文将致力于最简单的方式去介绍使用,如果使用更进阶功能,还需要从源码去看文档。仅需三行代码即可实现训练和推理。 源码地址:https://github.com/yeyupiaoling/P…...
Aliyun CTF 2025 web ezoj
文章目录 ezoj ezoj 进来一看是算法题,先做了试试看,gpt写了一个高效代码通过了 通过后没看见啥,根据页面底部提示去/source看到源代码,没啥思路,直接看wp吧,跟算法题没啥关系,关键是去看源码 def audit_checker(even…...
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
引言 随着大型语言模型(LLMs)在技术领域的应用日益广泛,评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力,…...
【H2O2 | 软件开发】事件循环机制
目录 前言 开篇语 准备工作 正文 概念 流程 事件队列类型 示例 结束语 前言 开篇语 本系列为短篇,每次讲述少量知识点,无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的,希望对诸位有所帮…...
LVTTL(Low Voltage Transistor-Transistor Logic)电平详解
一、LVTTL电平的定义与核心特性 LVTTL(低压晶体管-晶体管逻辑)是传统TTL(5V)的低电压版本,工作电压通常为3.3V,旨在降低功耗并适配现代低电压集成电路,同时保持与TTL的逻辑兼容性。其核心特点如…...
Manus:成为AI Agent领域的标杆
一、引言 官网:Manus 随着人工智能技术的飞速发展,AI Agent(智能体)作为人工智能领域的重要分支,正逐渐从概念走向现实,并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中,Manus以其独…...
批量测试IP和域名联通性
最近需要测试IP和域名的联通性,因数量很多,单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境,Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...
网络安全之tcpdump工具
引言 wireshark是一款非常不错的抓包软件,在图形化界面占绝对统治地位;尽管其在字符界面下有些许选项可供使用,但终究不太方便,下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说,当开…...
TMS320F28P550SJ9学习笔记8:I2C通信的结构体寄存器配置的了解
继续学习IIC通信的寄存器配置方式:尝试使用寄存器方式配置了解I2C a 没条件完整测试IIC功能,具体的修改与测试留在下文,这里只贴出全部代码,就不提供工程了 文章提供测试代码讲解、完整工程下载、测试效果图 目录 IIC通信引脚&a…...
TypeScript类:面向对象编程的基石
一、从现实世界到代码世界 想象你要建造一栋房子,首先需要一张设计蓝图——它定义了房屋的结构(几个房间)、功能(卧室/厨房)和特性(材料/颜色)。在TypeScript中,class就是这个设计蓝…...