当前位置: 首页 > news >正文

数据结构----结构--线性结构--链式存储--链表

数据结构----结构–线性结构–链式存储–链表

1.链表的特点

空间可以不连续,长度不固定,相对于数组灵活自由

搜索:

时间复杂度O(n)

增删:

头增头删时间复杂度O(1)

其他时间复杂度为O(n)

扩展:单向循环链表的特性

从任意节点出发皆可遍历整个链表

2.链表的组成

链表由数据域和指针域组成

3.链表及其功能的实现

1.创建一个链表,并查看每一个链表中所存的值

//在Visual Studio 2022编译器下的用c语言的写法
#include <stdio.h>
#include<stdlib.h>typedef struct Node {int nValue;struct Node* pNext;}List;List* list() {List* m_phead = NULL;List* m_tail = NULL;int len;printf("请输入链表长度\n");scanf_s("%d", &len);while (len) {List* PTemp=(List*)malloc(sizeof(List));printf("请输入数据\n");int value;scanf_s("%d", &value);PTemp->nValue = value;PTemp->pNext = NULL;if (m_phead) {//不是空节点m_tail->pNext = PTemp;}else {//是空节点m_phead = PTemp;}m_tail = PTemp;len--;}return m_phead;
}void ShowList(List* m_phead) {while (m_phead) {printf("%d  ", m_phead->nValue);m_phead = m_phead->pNext;}
}int main() {List* list1=list();ShowList(list1);printf("\n");ShowList(list1);return 0;
}

思考如何将链表反向打印,不破环原有链表结构

方法:

1.暴力 时间复杂度O(n的平方) 空间复杂度O(1)

2.交换 时间复杂度O(n的平方) 空间复杂度O(看怎么使用交换来确定)

3.栈 时间复杂度O(n) 空间复杂度O(n)

4.头插法造新链表 时间复杂度O(n) 空间复杂度O(n)

5.数组 时间复杂度O(n) 空间复杂度O(n)

6.递归 时间复杂度O(n) 空间复杂度O(n)

这里用递归进行实现

//此函数的定义及其实现依赖于上面的链表代码
void ReserveList(List* head) {if (head->pNext == NULL) {//如果到了最后一个节点printf("%d  ", head->nValue);//打印该节点return;//返回}ReserveList(head->pNext);//先处理下一个printf("%d  ", head->nValue);//打印当前节点
}

2.将链表进行反转(用不消耗空间的方法)

消耗空间的方法:

1.栈

2.数组

3.递归

4.头插法创建一个新链表

不消耗空间的方法

用三个指针来实现

1.分别记三个指针为头,拿,断

2.处理:(1)插入 :将拿的指针所指的节点的下一个节点改为头指针所指向的节点

​ (2)改变标记:头的指针所指向的节点变为拿的指针所指向的节点

​ 拿的指针所指向的节点变为断的指针所指向的节点

​ 断的指针所指向的节点为断的指针所指向的节点的下一个节点

代码实现
//此函数的定义及其实现依赖于上面的链表代码
List* FanZhuan(List* P_head) {if (P_head == NULL || P_head->pNext == NULL) return P_head;List* NewHead = NULL;List* Na = P_head;List* Duan = P_head->pNext;while (Duan) {Na->pNext = NewHead;NewHead = Na;Na = Duan;Duan = Duan->pNext;}Na->pNext = NewHead;return Na;
}

3.将两个链表进行合并且按照链表中数据的大小进行排序

方法:

1.定义两个指针一个确定新表头之后指向新表头(后续会对这个指针进行操作),一个指向新表头之后进行返回

2.处理:用传入的两个指针比较两链表,之后在新链表进行尾添加,然后相应的指针移到下一个节点,直到两个指针中的其中一个指针指向为空结束循环

3.将有剩余链表与新链表的尾部进行连接

代码实现

//此函数的定义及其实现依赖于上面的链表代码
List* HeBing(List* list1_head, List* list2_head) {if (!list1_head) {return list2_head;}if (!list2_head) {return list1_head;}List* newHead = NULL;List* HEAD = NULL;if (list1_head->nValue < list2_head->nValue) {//确定表头newHead = list1_head;HEAD = newHead;list1_head=list1_head->pNext;}else {newHead = list2_head;HEAD = newHead;list2_head = list2_head->pNext;}while (list1_head && list2_head) {//循环判断拼接链表if (list1_head->nValue < list2_head->nValue) {newHead->pNext = list1_head;newHead = newHead->pNext;list1_head = list1_head->pNext;}else {newHead->pNext = list2_head;newHead = newHead->pNext;list2_head = list2_head->pNext;}}if (list1_head) {newHead->pNext = list1_head;}if (list2_head) {newHead->pNext = list2_head;}return HEAD;
}

4.链表题目的练习

第一题(网址为https://leetcode.cn/problems/LGjMqU/)

题目:

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:

L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

解决:

方法一:

暴力(不用这个)

方法二:

第一步:将这个链表从中间拆成两个链表(如果不是偶数长度,则前一个链表比后一个长一个节点)

第二步:翻转第二个链表

第三步:将两个链表进行合并,合并的方法为先第一个链表的节点,再第二个链表的节点,以此类推

代码如下
//这里的代码是c++语言下的
class Solution {
public:void reorderList(ListNode* head) {if(head->next==nullptr) return;int listsize=0;ListNode* headsize=head;while(headsize){//判断链表长度listsize++;headsize=headsize->next;}if(listsize==2){//如果链表长度为2,结束return;}headsize=nullptr;//将链表分成两个    int listsize2=listsize/2; //链表2长度int listsize1=listsize-listsize2;//链表1长度ListNode* Temp=nullptr;ListNode* head1=head;//链表一头节点ListNode* head2=head;//链表二if(listsize1==1){//将链表一与链表二断开 1Temp=head1;}while(listsize1--){//遍历获得链表二头节点head2=head2->next;if(listsize1==1){Temp=head2;//记录链表一的尾节点   }}Temp->next=nullptr;//将链表一与链表二断开 2Temp=nullptr;ListNode* Temp1=nullptr;ListNode* Temp2=nullptr;//将链表二进行翻转//链表长度大于1进行翻转if(listsize2>1){ListNode*NewlistHead=nullptr;ListNode*Na=head2;ListNode*Duan=head2->next;while(Duan){Na->next=NewlistHead;NewlistHead=Na;Na=Duan;Duan=Duan->next;}Na->next=NewlistHead;//将两链表进行拼接 第一种Temp1=head1;Temp2=Na;}else{//不大于1//将两链表进行拼接 第二种Temp1=head1;Temp2=head2;}while(1){ListNode* Temp3=Temp1->next;Temp1->next=Temp2;Temp1=Temp3;if(Temp2==nullptr||Temp1==nullptr){break;}ListNode* Temp4=Temp2->next;Temp2->next=Temp1;Temp2=Temp4;}}
};

第二题(网址为https://leetcode.cn/problems/3u1WK4/)

题目:

给定两个单链表的头节点 headAheadB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null

解决:

方法一:

暴力(不用这个 用的时间和空间太多了)

方法二:

栈 (两个链表出栈时,进行比较,看是否有相同的)

方法三:

差值法:

​ 第一步:遍历两个链表获得两个链表的长度

​ 第二步:进行相减,获得长度差

​ 第三步:长的那个先走长度差的距离,之后两个指向链表的指针一起走,

​ 如果两个指针指向相同的节点时,结束找到了。

​ 如果两个链表指向空地址了还没找到,结束没找到。

这里用方法三来写,方法三的代码如下
//这里的代码是c++语言下的
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int headAsize=0;int headBsize=0;ListNode*headA1=headA;ListNode*headB1=headB;int x=0;while(headA1){headAsize++;headA1=headA1->next;}while(headB1){headBsize++;headB1=headB1->next;}headA1=headA;headB1=headB;if(headAsize>=headBsize){x=headAsize-headBsize;while(x--){headA1=headA1->next;}}else{x=headBsize-headAsize;while(x--){headB1=headB1->next;}}while(1){if(headA1==headB1) return headA1;if(headA1==nullptr||headB1==nullptr) return 0;headA1=headA1->next;headB1=headB1->next;}}
};

第三题(网址为https://leetcode.cn/problems/c32eOV/)

题目:

给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos-1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

**说明:**不允许修改给定的链表。

解决:
方法一

快慢指针:
第一步:用快慢指针找到交点(如果找不到节点就是无环)

​ 第二步:将交点断开(之后要还原)

​ 第三步:定义从交点和起始点开始的两个指针,遍历获得长度

​ 第四步:进行相减,获得长度差

​ 第五步:长的那个先走长度差的距离,之后两个指向链表的指针一起走,

​ 两个指针指向相同的节点时,返回该节点。

方法二:

将链表进行翻转,将链表每一次要翻转的链表进行一个存储(用指针数组存),之后在存储的这个指针数组中,数组的头和尾一起往中间遍历,当第一次找到不一样的节点时,返回上一次的节点就是入环点

方法三:

数学推导法:

在这里插入图片描述

​ 经过推导得 a=(R-1)(b+c)+c

​ 所以得出只要用两个指针指向A点和C点并且同时同速度出发,最后就会在B点相遇,可得入环点

这里用方法一来写,方法一的代码如下
//这里的代码是c++语言下的
class Solution {
public:ListNode *detectCycle(ListNode *head) {if(head==nullptr){//如果没节点返回空,无环return head;}if(head->next==nullptr){//如果只有一个节点返回空,无环return 0;}//定义快慢指针ListNode *Fast=head;ListNode *Slow=head;//定义一个指针指向交点ListNode *JiaoDian=nullptr;ListNode *JiaoDian2=nullptr;//快慢指针进行遍历找到交点while(1){if(Fast->next==nullptr){//如果快指针会指向为空,无环return Fast->next;}else if(Fast->next->next==nullptr){return Fast->next->next;}Fast=Fast->next->next;Slow=Slow->next;if(Fast==Slow){//找到交点JiaoDian=Fast;JiaoDian2=Slow=Slow->next;//断点的下一个Fast->next=nullptr;//将交点断开,一会要还原break;}}//定义从交点和起始点开始的指针ListNode *StartJiao=Slow;ListNode *Start=head;//遍历两个指针获得长度int StartJiaolen=0;int Startlen=0;while(StartJiao){//起点开始的长度StartJiaolen++;StartJiao=StartJiao->next;}while(Start){//断点开始的长度Startlen++;Start=Start->next;}StartJiao=Slow;//回到起点Start=head;int chalen=0;//相差长度if(StartJiaolen>Startlen){chalen=StartJiaolen-Startlen;while(chalen--){//移动交点指针StartJiao=StartJiao->next;}}else{chalen=Startlen-StartJiaolen;while(chalen--){//移动开始指针Start=Start->next;}}while(1){//移动找到入口点if(Start==StartJiao){JiaoDian->next=JiaoDian2;return Start;}if(Start->next==nullptr||StartJiao->next==nullptr){return 0;}Start=Start->next;StartJiao=StartJiao->next;}}
};

第四题(网址为https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/)

题目:

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null

解决:
方法一:

​ 暴力 时间复杂度为O(n的平方) ,时间太久,不用此方法

方法二:

第一步:创建一个新链表(实现了next指针)

第二步:将两个链表交叉合并

第三步:实现(random指针)

第四步:将两个链表分开还原

第五步:返回新链表

时间复杂度为O(n) 空间复杂度为O(1)

代码如下
//这里的代码是c++语言下的
class Solution {
public:Node* copyRandomList(Node* head) {if(head==nullptr){return head;}Node* BianLi=head;//用于遍历原来链表的指针Node* NewHead=nullptr;//新链表Node* Temp=nullptr;//用来指向新链表的表头//添加完成新链表(random指针还没有实现)NewHead=Temp=NewNode(*BianLi);//表头BianLi=BianLi->next;while(BianLi){Node* Temp2=NewNode(*BianLi);BianLi=BianLi->next;Temp->next=Temp2;Temp=Temp->next;}//将两个链表相交连接Temp=NewHead;//重置  用于遍历新链表的指针BianLi=head;//重置  用于遍历原来链表的指针while(1){Node* LinShi1=BianLi->next;//临时变量BianLi->next=Temp;BianLi=LinShi1;if(BianLi==nullptr){break;}Node* LinShi2=Temp->next;//临时变量Temp->next=BianLi;Temp= LinShi2;}//将random指针实现Node* Temp3=head;//用于遍历合并后两个链表的指针int bool1=1;//判断是不是原有链表的节点while(1){//循环将复制的节点的复杂指针实现if(bool1%2==1){if(Temp3==nullptr){//结束条件break;}if(Temp3->random==nullptr){//如果指向为空,那对应的就给空,这里是因为我合并的那个链表只有一个nullptrTemp3->next->random=nullptr;}else{Temp3->next->random=Temp3->random->next;}}Temp3=Temp3->next;bool1+=1;}//将两个链表进行拆分Temp3=head;//重置 用于遍历合并后两个链表的指针while(1){if(Temp3==nullptr){//终止条件break;}Node* LinShi1=Temp3->next;//临时变量if(Temp3->next==nullptr||Temp3->next->next==nullptr){//最后两个数据的处理Temp3->next=nullptr;}else{Temp3->next=Temp3->next->next;}Temp3=LinShi1;}return NewHead;}//造新节点Node* NewNode(Node node){Node*newnode=(Node*)malloc(sizeof(Node));newnode->val=node.val;newnode->next=nullptr;newnode->random=nullptr;return newnode;}
};

5.如何判断一个数字是不是2的整数次幂(此题与链表无关)

整数为n 用n&(n-1)看是否等于0等于0就是2的整数次幂

6.找到一个数二进制是1的一位(随机的找是1的一位)(此题与链表无关)

整数为n 用n&(-n)就可以找到了

7.跳跃列表:SkipList(并不是一个链表结构)

跳跃列表基于有序链表

1.跳表查找的实现

1.根据链表的长度判断有几层 层数=log2的链表长度

2.每一层有哪些元素是根据概率来定的(每一个元素是否有的概率都是二分之一)

3.然后找数是从高层往低层找 在每一层跟链表中的元素做比较大于就取右边,小于就取左边,等于就是找到了(这一步和二分类似)

4.到最后一层看是否找到

2.跳表添加的实现

1.根据链表的长度判断有几层 层数=log2的链表长度

2.每一层有哪些元素是根据概率来定的(每一个元素是否有的概率都是二分之一)

3.然后从高层往低层 依次找到要添加的元素在每层该插入的地方,并存起来

4.根据概率判断每一层是否都有这个元素(概率是二分之一)

5.进行插入

8.哈希表(散列表):hashTable

1.确定分组

用求整取余法 公式为:P=key%M(M是个数) (会产生哈希冲突问题)

2.定哈希冲突解决方案

1.开放定址法:

​ 1.线性探测

​ 2.二次探测

2.拉链法:

​ 第一步:定义一个链表结构体

​ 第二步:申请指针数组(数组中每个元素初值为空)

​ 第三步:元素入组(头插法)

​ 第四步:查找

用拉链法实现简单哈希表代码如下(此代码是用c语言写的)

#include <stdio.h>
#include<stdlib.h>
#include<windows.h>
typedef struct Node {int nValue;struct Node* pNext;}List;List* list() {List* m_phead = NULL;int len = 1;int date;printf("请输入数据\n");scanf_s("%d", &date);m_phead = (List*)malloc(sizeof(List));m_phead->nValue = date;m_phead->pNext = NULL;return m_phead;
}//申请指针数组
List** Array(int n) {List** array_head = (List**)(malloc(sizeof(List*) * n));memset(array_head, 0, (sizeof(List*) * n));return array_head;
}
//头插法
void pushhead(List* lst, List** arr) {lst->pNext = (*arr);*arr = lst;
}//元素入组
void TianJia(int x,int n, List* lst, List** arr) {int weiyi = x % n;List** temp = arr;while (weiyi--) {temp++;}if (*temp) {pushhead(lst, temp);}else {*temp = lst;}
}void ShowList(List* m_phead, int x) {while (m_phead) {if (m_phead->nValue == x) {printf("找到了");printf("%d", x);return;}m_phead = m_phead->pNext;}printf("没找到");
}
//查找
void find(int x, int n, List** arr) {int y = x % n;arr += y;ShowList(*arr, x);
}int main() {int n = 5;//申请指针数组List** arr=Array(n);List* lsti1 = list();TianJia(lsti1->nValue,n, lsti1, arr);//元素入组,List* lsti2 = list();TianJia(lsti2->nValue, n, lsti2, arr);//元素入组List* lsti3 = list();TianJia(lsti3->nValue, n, lsti3, arr);//元素入组List* lsti4 = list();TianJia(lsti4->nValue, n, lsti4, arr);//元素入组List* lsti5 = list();TianJia(lsti5->nValue, n, lsti5, arr);//元素入组find(2, n, arr);//查找元素return 0;
}

3.线性探测的优化

装载因子 α=元素/表长 <0.8 越趋近于0.8冲突的可能性越高

优化的方法就是申请的空间大些尽量让装载因子小于0.8

4.拉链法与线性探测优化各自的优势

拉链法:

​ 1.处理冲突简单

​ 2.删除数据容易

​ 3.适用于未知元素个数的情况

​ 4.处理元素所占空间大且多的情况,用的空间少

线性探测优化:

​ 处理元素所占空间小且少的情况,用的空间少

相关文章:

数据结构----结构--线性结构--链式存储--链表

数据结构----结构–线性结构–链式存储–链表 1.链表的特点 空间可以不连续&#xff0c;长度不固定&#xff0c;相对于数组灵活自由 搜索&#xff1a; 时间复杂度O(n) 增删: 头增头删时间复杂度O(1) 其他时间复杂度为O(n) 扩展&#xff1a;单向循环链表的特性 从任意节…...

【5G 核心网】5G 多PDU会话锚点技术介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

K8s环境下监控告警平台搭建及配置

Promethues是可以单机搭建的&#xff0c;参考prometheus入门[1] 本文是就PromethuesGrafana在K8s环境下的搭建及配置 Prometheus度量指标监控平台简介 启动minikube minikube start 安装helm 使用Helm Chart 安装 Prometheus Operator: helm install prometheus-operator stabl…...

微信小程序在使用vant组件库时构建npm报错

在跟着vant官方进行使用步骤一步步操作时&#xff0c;由于要构建NPM&#xff0c;但NPM包在App配置文件的外部 所以在做下图这一步时&#xff1a; 接着再进行npm构建时会报错 message:发生错误 Error: F:\前端学习\前端框架\小程序\project\demo\miniprogram解决方法 &#xf…...

Django实现音乐网站 ⑽

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是后台对歌曲类型、歌单功能原有功能进行部分功能实现和显示优化。 目录 歌曲类型功能优化 新增编辑 优化输入项标题显示 父类型显示改为下拉菜单 列表显示 父类型显示名称 过滤器增加父类型 歌单表功能优化…...

SpringMVC的架构有什么优势?——异常处理与文件上传(五)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

【java面向对象中static关键字】

提纲 static修饰成员变量static修饰成员变量的应用场景static修饰成员方法static修饰成员方法的应用场景static的注意事项static的应用知识&#xff1a;代码块static的应用知识&#xff1a;单例设计模式 static静态的意思&#xff0c;可以修饰成员变量&#xff0c;成员方法&a…...

系统学习Linux-Redis集群

目录 一、Redis主从复制 概念 作用 缺点 流程 二、Reids哨兵模式&#xff08;sentinel&#xff09; 概念 作用 缺点 结构 搭建 三、redis集群 概述 原理 架构细节 选举过程 实验环境模拟 一、Redis主从复制 概念 是指将一台Redis服务器的数据&#xff0c;复制…...

【每日随笔】帝王心术 ② ( 如何培养下一代 | 重点培养孩子某一项特长 | 价值观培养 | 独立思考 | 人性和谋略教育 | 资源传承 | 人生指引 )

文章目录 一、重点培养孩子某一项特长二、价值观培养三、独立思考四、人性和谋略教育五、资源传承六、人生指引 一、重点培养孩子某一项特长 很多人 作为 父母 , 教育孩子 , 没有出息的占大多数 ; 父母 教育 孩子 , 给孩子培训 , 一般都给报个兴趣班 , 如果兴趣班的种类超过两…...

Git简介

Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同&#xff0c;它采用了分布式版本库的方式&#x…...

STM32入门学习之定时器输入捕获

1.定时器的输入捕获可以用来测量脉冲宽度或者测量频率。输入捕获的原理图如下&#xff1a; 假设定时器是向上计数。在图中&#xff0c;t1~t2之间的便是我们要测量的高电平的时间(脉冲宽度)。首先&#xff0c;设置定时器为上升沿捕获&#xff0c;如此一来&#xff0c;在t1时刻可…...

贪心算法:基础入门篇

贪心算法&#xff1a;基础入门篇 文章目录&#xff1a; 贪心算法&#xff1a;基础入门篇一、认识贪心算法二、常见贪心问题2.1 纸牌问题2.2 背包问题&#xff08;基础版&#xff09;2.3 简单数学证明问题 三、总结 一、认识贪心算法 在求最优解的问题中&#xff0c;以某种贪心…...

【Windows10下启动RocketMQ报错:找不到或无法加载主类 Files\Java\jdk1.8.0_301\lib\dt.jar】解决方法

Windows10下启动RocketMQ报错&#xff1a;找不到或无法加载主类 一、问题产生二、产生原因三、解决办法 一、问题产生 参考RocketMQ Github官网上的说明&#xff0c;下载rocketmq-all-5.1.3-bin-release.zip&#xff0c;解压配置环境变量后&#xff0c;执行如下命令&#xff1a…...

深入篇【Linux】学习必备:进程理解(从底层探究进程概念/进程创建/进程状态/进程优先级)

深入篇【Linux】学习必备&#xff1a;进程理解(从底层探究进程概念/进程创建/进程状态/进程优先级&#xff09; 一.进程概念(PCB/task_struct)二.查看进程(top/ps)三.创建进程(fork)四.进程状态(僵尸进程/孤儿进程)五.进程优先级(PRI/NI) 一.进程概念(PCB/task_struct) 1.什么…...

Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?

你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。 本周刊精心筛选国内外的 250 信息源&#xff0c;为你挑选最值得分享的文章、教程、开源…...

基于Java+SpringBoot+Vue的网吧管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...

redis设置database 不生效剖析

设置database 不生效剖析 前言配置加载类问题commons-pool 对象池 主页传送门&#xff1a;&#x1f4c0; 传送 前言 事情是这样的 今天在拉取了同事的代码做redis缓存设置的时候&#xff0c;发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库。这引起了我的好…...

汽车及汽车零部件行业云MES解决方案

汽配行业现状&#xff1a; 随着经济全球化进程加快&#xff0c;一直走在智能化改造&#xff0c;数字化转型前沿的汽车行业企业&#xff0c;面临的信息化需求也日益增加&#xff0c;不管德系&#xff0c;美系还是日系供应链的各大厂商&#xff0c;均将企业信息化&#xff0c;数字…...

算法工程师-机器学习面试题总结(4)

深度学习 DNN 描述一下神经网络&#xff1f;推导反向传播公式&#xff1f; 神经网络&#xff08;Neural Network&#xff09;是一种模拟人脑神经系统的计算模型。它由许多节点&#xff08;神经元&#xff09;和连接它们的权重组成&#xff0c;这些节点和权重可以学习和调整&a…...

Linux学习之awk函数

awk里边的函数分为内置函数和自定义函数。 内置函数有下边的几种&#xff1a; 算术函数&#xff08;arithmetic&#xff09; 字符串函数&#xff08;string&#xff09; 输入/输出函数和通用函数&#xff08;input/output, and general&#xff09; 自定义函数格式如下&#xf…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...

代理服务器-LVS的3种模式与调度算法

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器&#xff0c;其中以Nginx为主&#xff0c;本章我们来讲解几个代理软件&#xff1a…...

Angular中Webpack与ngx-build-plus 浅学

Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具&#xff0c;用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中&#xff0c;Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...

【NLP】 38. Agent

什么是 Agent&#xff1f; 一个 Agent 就是能够 理解、思考&#xff0c;并且进行世界交互 的模型系统&#xff0c;并不是纯粹的 prompt 返回器。 它可以&#xff1a; 读取外部数据&#xff08;文件/API&#xff09;使用记忆进行上下文维持用类Chain-of-Thought (CoT)方式进行…...

fast-reid部署

配置设置&#xff1a; 官方库链接&#xff1a; https://github.com/JDAI-CV/fast-reid# git clone https://github.com/JDAI-CV/fast-reid.git 安装依赖&#xff1a; pip install -r docs/requirements.txt 编译&#xff1a;切换到fastreid/evaluation/rank_cylib目录下&a…...

SQL导出Excel支持正则脱敏

SQL to Excel Exporter 源码功能特性核心功能性能优化安全特性 快速开始环境要求安装运行 API 使用说明1. 执行SQL并导出Excel2. 下载导出文件3. 获取统计信息4. 清理过期文件 数据脱敏配置支持的脱敏类型脱敏规则配置示例 配置说明应用配置数据库配置 测试运行单元测试运行集成…...

MySQL 索引优化(Explain执行计划) 详细讲解

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 MySQL 索引优化&#xff08;Explain执行计划…...

Qt Quick Test模块功能及架构

Qt Quick Test 是专门为测试 QML 应用程序设计的模块&#xff0c;在 Qt 6.0 中得到了显著增强。 一、主要功能/使用方法 核心功能概述 QML 单元测试框架 提供完整的 QML 测试环境 支持测试用例组织和执行 包含 QML 断言函数和测试结果收集 测试类型支持 组件功能测试 用…...

Linux安全机制:从SELinux到Intel SGX的堡垒

Linux安全机制&#xff1a;从SELinux到Intel SGX的堡垒 数字世界的钢铁长城 引言&#xff1a;操作系统的"防御工事" 当服务器每天承受数百万次攻击尝试时&#xff0c;Linux内核的安全机制如同精密的防御系统&#xff0c;在纳秒级时间内做出响应。现代Linux安全架构已…...