leetcode之hot100---148排序链表(C++)
题目要求将一个无序的链表按照升序返回,涉及排序算法,下面对每个排序算法进行回顾
一、交换排序
1.冒泡排序
算法思想:反复比较相邻的两个元素,将它们中较大的(或较小的)元素逐步“冒泡”到数组的末尾。整个过程会多次遍历数组,直到数组完全有序。
以该题中示例一为例(升序排列):
假设我们要对链表4 - > 2 - > 1 - > 3进行排序。
步骤:
第一轮
- 比较 4 和 2,发现 4
> 2
,交换,链表变为2 - > 4 - > 1 - > 3。- 比较 4 和 1,发现 4
> 1
,交换,链表变为2 - > 1 - > 4 - > 3。- 比较 4 和 3,发现 4
> 3
,交换,数组变为2 - > 1 - > 3 - > 4。第二轮
- 比较 2 和 1,发现 2
> 1
,交换,链表变为1 - > 2 - > 3 - > 4。- 比较 2 和 3,不交换。
- 比较 3 和 4,不交换。
经过多轮操作,最终数组变为 1 - > 2 - > 3 - > 4。
复杂度:
- 时间复杂度:当表完全逆序时,需进行n - 1轮比较,每一轮需要处理 n - 1 个节点,因此时间复杂度为O(n²);当表完全正序时,只需要一轮比较,无需交换节点,就可以完成排序, 因此时间复杂度为O(n)
- 空间复杂度:O(1)
代码如下:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {//冒泡排序//链表为空,返回空值if(head == nullptr){return nullptr;}//链表中只有一个节点,就返回头节点if(head->next == nullptr){return head;}//设置一个哨兵节点,用于返回排序后的链表ListNode* sentry = new ListNode(0, head);//从头节点开始开始冒泡排序//由于一次冒泡排序可能无法让所有节点回到正确的位置//因此可能需要进行多次冒泡,//每轮冒泡后,如果没有发生交换(swapped == false),则退出循环bool swapped;do{//标记是否进行交换swapped = false;ListNode* pre = sentry;ListNode* cur = sentry->next;//一轮循环while(cur->next){ListNode* nxt = cur->next;//只有前一节点的值比下一临近节点的值大才会产生交换节点的操作//交换完节点后需要修改前驱节点的后继指针//由于已经发生交换,cur不需要更新if(cur->val > nxt->val){cur->next = nxt->next;nxt->next = cur;pre->next = nxt;swapped = true;}//如果两节点未进行交换,那么需更新curelse{cur = cur->next;}//修改前驱节点pre = pre->next;}}while(swapped == true);return sentry->next;}
};
2.快速排序
算法思想:
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
以该题中示例一为例(升序排列):
假设我们要对链表4 - > 2 - > 1 - > 3进行排序(挖空法)。
步骤:
第1轮交换:
选择基准节点(pivot)——节点4
将基准值提取,位置留空
比较 4 和 3 , 3 < 4, 交换位置
比较 4 和 2 , 2 < 4, left指针向后移动
比较 4 和 2 , 2 < 4, left指针向后移动
left, right指针重合,将pivot归位
第2轮交换:
选择基准节点(pivot)——节点3
后续步骤和第一轮交换类似,因此下述只展示过程,不做具体描述
继续从头遍历链表,发现没有发生交换的节点,上述结果就是链表排序的最终结果
复杂度:
- 时间复杂度:最好情况: O(n log n),选择的基准值使分区基本平衡
最坏情况: O(n²),选择的基准值使分区完全不平衡
- 空间复杂度:O(logn)
基于链表的快排算法写了很久也没写出可以完美满足快排思想的,关键是涉及头尾交换,在单链表的限制下,需要考虑很多细节,实在是写不出了,暂且告一段落把!
但是在写的过程中了解到了快排的三种思想(之前只了解挖坑法),以下三种方法的详细解释可以参考快排的三种思路:
1.挖坑法:
- 选取起始位置的元素作为基准值(pivot),将该位置视为第一个"坑"
- 从右向左遍历:
- 寻找小于基准值的元素
- 找到后填入左边的"坑"中
- 此时右边的位置变成新的"坑"
- 从左向右遍历:
- 寻找大于基准值的元素
- 找到后填入右边的"坑"中
- 此时左边的位置变成新的"坑"
- 重复上述遍历的步骤,直到左右指针相遇
- 将基准值填入最后的"坑"位置
- 此时基准值左边都是小于它的元素
- 基准值右边都是大于它的元素
2.首尾指针法:
- 选择最左边的元素作为基准值
- 维护两个指针分别从两端向中间移动
- 位于尾部的指针从右向左找第一个小于基准值的数
- 位于头部的指针从左向右找第一个大于基准值的数
- 记录基准值的位置,不断交换直到两个指针交错
- 递归处理左右两个子区间
3.单向遍历双指针指针法:
- 选择第一个元素作为基准值(mid)
- 使用slow(遍历链表)和fast(寻找交换节点)两个指针标记区间
- 使用slow遍历数组时:
- 如果当前元素大于基准值,fast从slow的下一位置继续遍历,寻找第一个小于基准值的节点,与slow交换
- 如果当前元素小于等于基准值,slow右移
- 如果slow找不到对应的fast与之交换,那么最后基准值放到slow位置
- 递归处理左右两部分
二、选择排序
1.简单选择排序
算法思想:先在数据中找出最大或最小的元素,放到序列的起始;然后再从余下的数据中继续寻找最大或最小的元素,依次放到排序序列中,直到所有数据样本排序完成。
以该题中示例一为例(升序排列):
假设我们要对链表4 - > 2 - > 1 - > 3进行排序。
步骤:
第一次遍历链表
最小节点为1,插入链表头部,链表变为 1 - > 4 - > 2 - > 3。
其中,已排序:1 ;待排序: 4 - > 2 - > 3
第二次遍历链表
最小节点为2,插入链表头部,链表变为 1 - > 2 - > 4 - > 3。
其中,已排序:1- > 4 ;待排序: 2 - > 3
第三次遍历链表
最小节点为1,插入链表头部,链表变为 1 - > 2 - > 3 - > 4。
其中,已排序:1 - > 2 - > 3 ;待排序:3
第四次遍历链表
最小节点为4,插入链表头部,链表变为 1 - > 2 - > 3 - > 4。
其中,已排序: 1 - > 2 - > 3 - > 4
复杂度:
- 时间复杂度:O(n²)(最坏和平均情况下)
- 空间复杂度:O(1)
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {//选择排序//链表为空或者只有一个节点,返回空值if(head == nullptr || head->next == nullptr){return head;}//设置一个哨兵节点,用于返回排序后的链表ListNode* sentry = new ListNode(0, head);//已排序部分的尾节点,方便插入ListNode* tail = sentry;//多轮遍历,tail左侧为排好序的链表,右侧为待排序的链表while(tail->next){ListNode* minPre = tail;//指向最小节点前驱的指针,初始时指向已排序部分的尾节点ListNode* curPre = tail;//指向正在遍历节点的前驱,初始时指向已排序部分的尾节点ListNode* cur = tail->next;//指向当前正在遍历的节点,初始时指向为已排序部分尾节点的后继ListNode* min = cur;//指向当前正在遍历的节点,初始时指向当前正在遍历的节点while(cur){/*如果当前遍历到的节点的值小于之前保存的节点的值,就更新对应指针*/if(cur->val <= min->val){min = cur;minPre = curPre;}/*移动遍历的指针和其前驱*/curPre = curPre->next;cur = cur->next;}/*如果遍历到待排序部分的最小节点,就将其插入已排序部分的尾部*/if(minPre != tail){minPre->next = min->next;//将原节点从原来位置删除/*将最小节点插入已排序链表的尾部*/min->next = tail->next;tail->next = min;}//修改已排序部分的尾节点tail = tail->next; }//返回排序后的链表return sentry->next;}
};
PS:这段代码废了我好大的牛劲,因为题目要求是链表,在写代码的时候要注意很多细节的地方
比如:
1.为了安全断开链表,防止形成环结构 (遍历链表时cur指针)
- 在链表分区的过程中,我们将节点从原链表中移动到
headLow
或headHigh
链表中。如果直接操作指针而不断开当前节点的next
指针,可能会导致链表中的某些部分形成 环。- 环的形成会导致后续的递归调用和遍历无法结束(例如,遍历时会陷入死循环),从而引发 堆栈溢出 或 无限循环。
2.确保正确分区,避免递归出错(pivot后继)
- 在递归中,
pivot
是基准节点,不属于左右两部分。- 如果
pivot->next
未设置为nullptr
,基准节点可能会错误地连接到右部分链表(headHigh
),导致后续递归时pivot
被错误地再次分区。- 这会导致递归无法正确终止,从而引发 堆栈溢出。
2.选择排序之堆排序
算法思想:从最后一个非叶子节点开始 建堆 ,自下而上进行堆调整 , 确保父节点大于子节点。 将堆顶元素与末尾元素交换,提取堆顶元素,堆的大小减1,对新的堆顶进行调整,重复上述步骤直到堆空
以该题中示例一为例(升序排列):
假设我们要对链表4 - > 2 - > 1 - > 3进行排序。
初始节点形成的完全二叉树:
从最后一个非叶子节点(2)开始建立大顶堆,根节点与叶子节点进行比较(3>2,交换),调整大顶堆
继续处理下一个非叶子节点(4),4>3,不用交换
交换最后一个叶子节点(2)和根节点(4),同时根据上述方法调整大顶堆
交换最后一个叶子节点(1)和根节点(3),调整大顶堆,提取根节点,使用尾插法与排好序的数字进行排序
重复上述步骤,最终获得排好序的链表:
复杂度:
- 时间复杂度:建堆:对于高度为 i 的节点,向下调整的代价是 O(i)在高度为 i 的层次上,节点数最多为 n/2^(i+1),总代价 = ∑(i=0 到 h) (节点数 × 调整代价) = ∑(i=0 到 h) (n/2^(i+1)) × i;取出堆顶并调整:需要进行 n-1 次操作,每次取出堆顶后,需要从根节点开始向下调整,调整过程是和左右子节点比较,选择较大(大顶堆)或较小(小顶堆)的交换,最坏情况下要调整到叶子节点,树的高度是 logn,所以每次调整是 O(logn),n-1 次调整总共是 O(nlogn),总体时间复杂度:T(n) = O(n) + O(nlogn),取较大的量级,最终复杂度是 O(nlogn)
- 空间复杂度:O(logn)
代码待更新
三、插入排序
1. 直接插入排序
算法思想:
- 将数组分为已排序和未排序两部分
- 从未排序部分取一个元素,插入到已排序部分的合适位置
以该题中示例一为例:
假设我们要对链表4 - > 2 - > 1 - > 3进行排序。(升序)
复杂度:
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
代码如下:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {if(head == nullptr || head->next == nullptr){return head;}ListNode* sentry = new ListNode(-9999, head);//设置哨兵节点,后继指向头节点ListNode* tail = head;//确定已排序界限,默认第一个节点时已经排好序的ListNode* cur = head->next;//遍历待排序序列的指针while(cur){//保存下一个待处理节点的位置ListNode* nxt = cur->next;//如果待排序节点的值大于已排序链表中所有节点的值,直接插在已排序链表的尾部if(cur->val >= tail->val){tail = cur;}//否则就遍历已排序链表,寻找可以插入的位置else{ListNode* pre = sentry;ListNode* target = sentry->next;//从已排序好的子链表中进行遍历,寻找可以插入的位置while(target != cur && target->val <= cur->val){pre = target;target = target->next;}//执行插入操作cur->next = target;pre->next = cur;tail->next = nxt;}cur = nxt;}ListNode* ans = sentry->next;delete sentry;//释放哨兵节点return ans;}
};
2.希尔排序
算法思想:
- 将待排序序列分成若干子序列(按间隔分组)
- 对每个子序列进行直接插入排序
- 逐步缩小间隔直到为1
对链表进行希尔排序比较复杂,因为链表不能像数组那样直接通过索引访问元素。
假设要对数组 [8, 9, 1, 7, 2, 3, 5, 4, 6] 进行排序:
1.初始化间隔序列(gap):
n = 9 gap = n/2 = 4 (向下取整)
2.第一轮排序 (gap = 4):
将数组分成若干组,每组间隔为4:组1: [8, 2] 位置 0,4
组2: [9, 3] 位置 1,5
组3: [1, 5] 位置 2,6
组4: [7, 4, 6] 位置 3,7,8
对每组进行插入排序:
组1: [8, 2] -> [2, 8]
组2: [9, 3] -> [3, 9]
组3: [1, 5] -> [1, 5]
组4:[7, 4, 6] -> [4, 6, 7]
排序后数组变为:[2, 3, 1, 4, 8, 9, 5, 6, 7](同组数字用同一颜色标注)
3.第二轮排序 (gap = 2):
组1: [2, 1, 8, 5] 位置 0,2,4,6
组2: [3, 4, 9, 6, 7] 位置 1,3,5,7,8
对每组进行插入排序:
组1: [2,1,8,5]-> 1,2,5,8
组2: [3,4,9,6,7] -> 3,4,6,7,9
排序后数组变为:[1, 3, 2, 4, 5, 6, 8, 7, 9]
4.最后一轮排序 (gap = 1):
此时就是普通的插入排序,比较相邻元素
[1, 3, 2, 4, 5, 6, 8, 7, 9]
处理2: 1,2,3,4,5,6,8,7,9
处理7: 1,2,3,4,5,6,7,8,9
最终得到有序数组:[1, 2, 3, 4, 5, 6, 7, 8, 9]
复杂度:
- 时间复杂度:最坏情况(完全逆序):O(n²)
最好情况(近似有序):O(nlogn)
- 空间复杂度:O(1)
代码待更新
四、归并排序
算法思想:
- 分解:将数组递归拆分成两半
- 解决:递归排序两个子数组
- 合并:将已排序的子数组合并成一个有序数组
以数组[38, 27, 43, 3, 9, 82, 10]为例
第一步:分解过程
第二步:合并过程
复杂度
- 时间复杂度:O(nlogn)
- 空间复杂度:O(n)
代码如下:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public://公共接口ListNode* sortList(ListNode* head) {return sortList(head, nullptr);}//函数的重载ListNode* sortList(ListNode* head, ListNode* tail){//如果递归到链表为空,就返回头指针if(head == nullptr){return head;}//如果链表中只有一个节点,就要将这个节点作为一个独立的子链表返回。if(head->next == tail){head->next = nullptr;return head;}//使用快慢指针寻找链表中点ListNode* slow = head;ListNode* fast = head;while(fast != tail){slow = slow->next;fast = fast->next;//为了防止fast指针处理链表长度为偶数的情况时访问空指针if(fast != tail){fast = fast->next;}}ListNode* mid = slow;//mid所指向节点作为第二部分的头结点return merge(sortList(head, mid), sortList(mid, tail));}//边排序边合并ListNode* merge(ListNode* head1, ListNode* head2){//哨兵节点,方便返回链表ListNode* dummyHead = new ListNode(0);ListNode* temp = dummyHead, *temp1 = head1, *temp2 = head2;//合并两个有序链表while(temp1 && temp2){if(temp1->val <= temp2->val){temp->next = temp1;temp1 = temp1->next;}else{temp->next = temp2;temp2 = temp2->next;}temp = temp->next;}//处理剩余节点if(temp1){temp->next = temp1;}if(temp2){temp->next = temp2;}ListNode* ans = dummyHead->next;delete dummyHead;return ans;}
};
五、基数排序
算法思想:
- 将整数按位数切割,从最低位开始排序
- 每一位采用计数排序的思想进行处理
- 每一轮排序都基于上一轮的结果
- 直到所有位数都排序完成
六、计数排序
算法思想:
- 找出数组的最大值和最小值
- 创建计数数组,统计每个元素出现的次数
- 根据计数数组构建结果数组
假设数组为 [4, 2, 2, 8, 3, 3, 1]:
第一步:找出最大值和最小值
min = 1 max = 8 需要大小为 8-1+1 = 8 的计数数组
第二步:统计每个数字出现次数
数字 1 2 3 4 5 6 7 8
次数 1 2 2 1 0 0 0 1
索引 0 1 2 3 4 5 6 7
第三步:重构数组
原始数组:[4, 2, 2, 8, 3, 3, 1]
排序后: [1, 2, 2, 3, 3, 4, 8]
七、桶排序
- 创建一定数量的桶(通常是数组或链表)
- 将数据分散到各个桶中
- 对每个桶内部进行排序
- 将所有桶中的数据按顺序合并
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n²) | O(n²) | O(n) | O(1) | 稳定 |
快速排序 | O(nlogn) | O(n²) | O(nlogn) | O(logn) | 不稳定 |
简单选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1)原地 O(log n)栈 | 不稳定 |
插入排序 | O(n²) | O(n²) | O(n) | O(1) | 稳定 |
希尔排序 | O(nlogn) | O(n²) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
基数排序 | O(n*k) | O(n*k) | O(n*k) | O(n+k) | 稳定 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(n+k) | 稳定 |
桶排序 | O(n+k) | O(n²) | O(n) | O(n+k) | 稳定 |
相关文章:
leetcode之hot100---148排序链表(C++)
题目要求将一个无序的链表按照升序返回,涉及排序算法,下面对每个排序算法进行回顾 一、交换排序 1.冒泡排序 算法思想:反复比较相邻的两个元素,将它们中较大的(或较小的)元素逐步“冒泡”到数组的末尾。…...
Redis下载与安装
Redis下载与安装 注意:官网没有提供Windows版本,只有Linux版本。 GitHub下载地址: https://github.com/microsoftarchive/redis/releases 这里演示解压版的” Redis-x64-3.2.100.zip”,下载完毕后解压即可。 目录解析: 以管理员…...
TF-IDF(Term Frequency-Inverse Document Frequency)详解:原理和python实现(中英双语)
中文版 TF-IDF算法详解:理解与应用 TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索与文本挖掘中常用的算法,广泛应用于搜索引擎、推荐系统以及各种文本分析领域。TF-IDF的核心思想是通过计算一个词在文档中的重要…...
论文研读:Text2Video-Zero 无需微调,仅改动<文生图模型>推理函数实现文生视频(Arxiv 2023-03-23)
论文名:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators 1. 摘要 1.1 方法总结 通过潜空间插值, 实现动作连续帧。 以第一帧为锚定,替换原模型的self-attention,改为cross-attention 实现 保证图片整体场…...
.Net Core配置系统
目录 Json文件配置 读取配置原始方法 绑定读取配置 用法 传统Web.config配置的缺点为了兼容,仍然可以使用Web.config和ConifgurationManager类,但不推荐.NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等ÿ…...
互联网直播点播平台EasyDSS无人机视频推拉流技术实现工地远程监控巡检直播
在建筑行业,施工现场的安全管理和实时监控一直是项目管理中的重点。随着技术的进步,无人机工地直播技术成为了一种新兴的解决方案,它不仅能够提高施工透明度,还能够加强现场安全管理。EasyDSS作为一种先进的流媒体技术平台&#x…...
VirtualBox新版本报错 Invalid installation directory解决方案
最近需要使用到VirtualBox,但是下载最新的安装时发现如下Invalid installation directory,经过多番查找终于找到了解决问题方法,并进行了测试,现将解决办法附上 步骤一、将需要安装VirtualBox的目录下创建个目录 步骤二、使用cmd&…...
PY_11_01
前言 PY_11_01 抄就行了👻 一、代码步骤 抄就行了👻 def fact(n):if n1:return 1else:return n*fact(n-1)while True:minput(请输入一个正整数m:)if not m.isdigit() or int(m)0:print(输入错误,请重新输入!)else:mint(m)brea…...
golang syscall 三种加载DLL方式
1. syscall.MustLoadDLL() MustLoadDLL 是一种加载 DLL 的函数,它会在加载 DLL 时,如果发生错误,直接 panic。 错误处理:如果 DLL 加载失败,它会调用 panic,导致程序崩溃。dll : syscall.MustLoadDLL(&qu…...
Zabbix企业级分布式监控系统
第一章:监控概念及Zabbix部署 监控概述 对于监控系统在企业架构中不是新的技术,但却是必不可少的重要组成部分,所谓无监控,不运维! 监控系统可以帮助运维、开发、测试等人员及时的发现服务器出现的故障,…...
JetPack——Lifecycle
Lifecycle是什么? Lifecycle 是一个类,用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态 Lifeclcle解决什么问题? class GPS(private val context: Context,pr…...
本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家
文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好!今天我要向大家展示如何将一台迷你的香橙派Z…...
大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!
大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!DeepSeek-V3上线即开源;OpenAI 发布高级推理模型 o3https://mp.weixin.qq.com/s/9qU_zzIv9ibFdJZ5cTocOw?token47960959&langzh_CN 「青稞大模型Weekly」,持…...
【0379】Postgres内核 Walreceiver (libpqwalreceiver API)分析
文章目录 1. libpqwalreceiver API1.1 四个函数2. Walreceiver IPC3. Walsender IPC4. Walsender - walreceiver protocol1. libpqwalreceiver API walreceiver 中与传输相关的部分,其负责连接主服务器、接收 WAL 文件以及发送消息,是动态加载的,以避免主服务器的二进制文件…...
easybox
title: 解锁 EasyBox:智能运维的便捷之选 date: ‘2024-12-31’ category: blog tags: EasyBox智能运维效率提升自动化运维 sig: memsafety archives: ‘2024-12’ author:way_back summary: EasyBox 作为一款智能运维工具,以其简洁高效的特性ÿ…...
Prompt工程--AI开发--可置顶粘贴小工具
PROMPT 1.背景要求:我需要开发一个简单的粘贴小工具,用于方便地粘贴和管理文本内容。该工具需要具备以下功能:粘贴功能:提供一个文本框,用户可以粘贴内容。窗口置顶:支持窗口置顶功能,确保窗口…...
【AI日记】24.12.31 kaggle 比赛 2-19
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset时间:9 小时 读书 书名:论婚姻与道德时间:1.5 小时 律己 工作时间:良作息&#x…...
jenkins集成工具(一)部署php项目
目录 什么是CI 、CD Jenkins集成工具 一、Jenkins介绍 二、jenkins的安装和部署 环境部署 安装jenkins 安装gitlab 配置镜像源进行安装 修改密码 安装git工具 上传测试代码 Jenkins部署php项目wordpress 发布php代码 安装插件 测试代码发布 实现发布成功发送邮件…...
ubuntu 使用samba与windows共享文件[注意权限配置]
在Ubuntu上使用Samba服务与Windows系统共享文件,需要正确配置Samba服务以及相应的权限。以下是详细的步骤: 安装Samba 首先,确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后,…...
【GridView渐进全解】第四部分GridView分页进阶
目录 一、启用分页 二、修改GridView分页模板 1.进入控件模板修改视图: 2.进入页码模板(PagerTemplate)视图 3.添加导航按钮控件 4.修改导航控件属性 三、输入页号跳转 1.进入页码模板视图 2.添加文本框及按钮控件 3.编写代码 【接…...
K8s集群平滑升级(Smooth Upgrade of K8S Cluster)
简介: Kubernetes (简称K8s)是一个开源的容器编排和管理平台,由Google开发并维护。它最初是为了解决谷歌内部大规模容器管理的问题而设计的,后来在2014年开源,成为云原生技术的核心组成部分。1 K8…...
HarmonyOS-面试整理
目录 为什么选择HarmonyOS/ 优点/特点鸿蒙系统的权限有哪些说一说鸿蒙系统的安全机制说一说鸿蒙系统的微内核与安卓的内核区别鸿蒙操作系统的微内核架构有哪些优势分布式能力在鸿蒙系统中如何实现请解释一下鸿蒙系统中的分布式软总线技术如何在鸿蒙操作系统中进行多设备协同开发…...
基于编程语言的知识图谱表示增强大模型推理能力研究,一种提升LLM推理准确率达91.5%的结构化数据方法
基于编程语言的知识图谱表示增强大模型推理能力研究,一种提升LLM推理准确率达91.5%的结构化数据方法 理解数据分析全流程提问问题:知识的表示方式如何影响模型的推理能力?问题:为什么编程语言会是一个更好的知识表示选择ÿ…...
【北京迅为】iTOP-4412全能版使用手册-第七十章 Linux内核移植
iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...
使用 ASP.NET Core wwwroot 上传和存储文件
在 ASP.NET Core 应用程序中上传和存储文件是用户个人资料、产品目录等功能的常见要求。本指南将解释使用wwwroot存储图像(可用于文件)的过程以及如何在应用程序中处理图像上传。 步骤 1:设置项目环境 确保您的 ASP.NET 项目中具有必要的依…...
什么是 Azure OpenAI ?了解微软 Azure OpenAI 和 OpenAI 的关系
一、什么是Azure OpenAI ? 微软已与 OpenAI 合作以实现三个主要目标: ⦿利用 Azure 的基础结构(包括安全性、合规性和区域可用性),帮助用户构建企业级应用程序。 ⦿在微软产品(包括 Azure AI 产品以及以外…...
Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案
Flink CDC 自定义函数处理 SQLServer XML类型数据方案 1. 背景 因业务使用SQLServer数据库,CDC同步到doris 数仓。对于SQLServer xml类型,doris没有相应的字段对应, 可以使用json来存储xml数据。需要进行一步转换。从 flink 自定义函数入手…...
导致启动nacos报错Caused by: java.lang.IllegalStateException: No DataSource set 的两种原因
Java资深小白,不足之处,或者有任何错误欢迎指出。 --蓝紫报错代码如下: C:\Windows\System32>cd D:\nacos-server-2.2.3\nacos\binC:\Windows\System32>d:D:\nacos-server-2.2.3\nacos\bin>startup.cmd -m standalone "nacos is starting…...
mysql乱码、mysql数据中文问号
网上排出此错误方法的很多,但是 都不简洁,找不到根本原因 主要排查两点: 1.代码中jdbc链接的编码规则 urljdbc:mysql://localhost:3306/title?useUnicodetrue&characterEncodingutf8 将characterEncoding设置为utf8 2.设置mysq…...
python RAG 管道
RAG(RetrievalAugmented Generation)管道是一种结合了信息检索(Retrieval)和文本生成(Generation)的技术框架,主要用于生成高质量、基于事实的文本。它通过从外部知识源(如文档、数据…...
018-spring-基于aop的事务控制
1 先配置平台事务管理器 2 在配置 spring提供的advice 3 事务增强的aop 总结: 事务就是要做2个配置: <!-- 1 开启事务管理器 不同的框架对应不同的事务管理器 --> <bean id"transactionManager" class"org.springframework.j…...
HTML 轮播图(Carousel)详细讲解
HTML 轮播图(Carousel)详细讲解 轮播图(Carousel)是一种常见的用户界面组件,用于在同一位置展示多个图像或内容,允许用户通过滑动或自动播放的方式查看不同的内容。它通常用于展示产品、图片、广告等。 1…...
计算机网络-数据链路层(ppp协议)
2.2 ppp协议 点对点协议ppp是目前使用最广泛的点对点数据链路层协议。 2.3 媒体接入控制基本概念 共享信道要着重考虑的一个问题就是如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制MAC。 2.3.1 静态划分信道 频分复用 时分复用 波分复用 码分复…...
如何优化Python网络爬虫的数据清洗流程,以提升数据质量并有效应对网站反爬虫机制?
优化爬虫数据清洗流程,应对反爬虫机制 一、数据清洗的重要性 在网络爬虫中,数据清洗是关键环节。打个比方,我们从网页抓取到的原始数据就像一堆杂乱的杂物,里面有各种格式、错误和重复信息。比如抓取到的文本可能包含HTML标签、…...
QSharedMemory 实现数据exe间共享
定义共享数据结构 首先,需要定义一个结构体来包含要共享的数据。这个结构体应该包含所有需要在多个类的实例之间共享的成员变量 struct SharedData {int intValue;QString stringValue;// 可以添加更多需要共享的成员变量}; 使用 QSharedMemory 进行数据共享 在写…...
强化学习(1)
Reinforcement Learning Goal-directed learing from ineraction with the environment. 1. Basic Element 基本元素 1.1 Agent 玩家 1.2 Environment 1.3 Goal 2. Main Element 主要元素 2.1 State 2.2 Action 状态与行为往复 2.3 Reward 目标:最大化总…...
Spring Boot 嵌套事务详解及失效解决方案
在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性。然而,在 Spring Boot 中,如果嵌套事务的配置不当,可能会导致事务不生效的问题,尤其是在同一个类中进行方法调用时。 本文将详细介绍嵌套事务的原…...
IDEA 社区版 SpringBoot不能启动
报错原因,Failed to load class [javax.servlet.Filter] <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope> </dependency>…...
【SQL server】教材数据库(4)
学生(学号,年龄,性别,系名) 教材(编号,书名,出版社编号,价格) 订购(学号,书号,数量) 出版社(编…...
px、em、rem,vw区别介绍
在网页设计中,px、em、rem 和 vw 都是常用的 CSS 单位,它们各自有不同的用途和特性。下面是这些单位的详细介绍及其区别: 1. px(像素) 定义: px 是最常用的绝对单位,表示屏幕上的一个物理像素…...
pip安装paddle失败
一、pip安装paddle失败,报错如下 Preparing metadata (setup.py) ... error error: subprocess-exited-with-error import common, dual, tight, data, prox ModuleNotFoundError: No module named common [end of output] 二、解决方法: 按照提示安装对…...
QWT 之 QwtPlotDirectPainter直接绘制
QwtPlotDirectPainter 是 Qwt 库中用于直接在 QwtPlot 的画布上绘制图形的一个类。它提供了一种高效的方法来实时更新图表,特别适合需要频繁更新的数据可视化应用,例如实时数据流的显示。 使用 QwtPlotDirectPainter 的主要优势在于它可以绕过 QwtPlot 的…...
编辑音频的基本属性
导入音频 “文件-导入-选择音频”拖到音频轨道创建序列。选择音频,在效果空间可以看到音频的基本属性。 音量的设置 “效果工作区-效果控件-音量”在这里可以控制所有引导的混合音量 静音 静止所有声音 音频仪表 一般位于时间轴的后面,找不到可以…...
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-44
文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么ÿ…...
格式化输出年月日
直接上图 结论:老老实实用yyyy,得到的年月日是我们口头上说的时间,而YYYY有点反人类.... 对于一年的最后一周的一些日子,会统计成下一年; 对于下一年的第一周的一些日子,会统计成上一年; 你猜…...
解决Spring boot集成quartz时service注入失败为null的问题
解决Spring boot集成quartz时service注入失败为null的问题 一、报错信息二、代码任务类源代码配置类原代码 三、注入失败原因四、解决的思路11、任务类修改2、配置类修改 五、 解决的思路2 一、报错信息 java.lang.NullPointerException: null at farbun.server.scheduledTask…...
Python 青铜宝剑十六维,破医疗数智化难关(下)
九、模型可靠性的验证秘籍 在医疗数智化进程中,模型可靠性宛如一座灯塔,为精准医疗决策指引方向。以疾病诊断模型为例,一旦模型可靠性存疑,在癌症早期筛查场景下,可能将良性病变误判为恶性,让患者承受不必要的痛苦与恐慌,又或是遗漏细微癌变迹象,延误最佳治疗时机;在…...
初识具身智能
具身智能是智能科学的一个基础问题,在过去的5.4亿年以来,地球上所有生物都是通过身体和环境交互、进化逐步产生的。通俗地讲,具身智能体以第一人称视角身临其境地从环境交互中理解外部世界的本质概念,被认为是通向通用人工智能的重…...
Node 使用pkg打包部署
一、安装pkg(不太好装,需要借助国内镜像) npm install -g pkg --registryhttps://registry.npm.taobao.org 二、配置package.jsonsan // package.json ,配置专门制定pkg的执行入口 { ... "bin": "main.js", "pkg":{"assets&q…...
计算机网络-L2TP Over IPSec基础实验
一、概述 上次我们进行了标准L2TP的配置,但是在最后我们在进行业务流量访问时看到流量是没有进行加密的,这就导致可能得安全风险,所以这里其实可以退像GRE那样调用IPSec框架来进行加密保护。 拓扑 数据不加密 现在需要配置IPSec,然…...