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

数据结构单链表

在这里插入图片描述

单链表
1 链表的概念及结构
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链
接次序实现的 。

在我们开始讲链表之前,我们是写了顺序表,顺序表就是类似一个数组的东西,它的存放是连续的,优点有很多,比如支持我们随机访问,连续存放,命中率高,区别于单链表我们可以用类似数组的下标进行访问,这大大的提高我们的效率,但是也有缺点,空间不够就要需要扩容,扩容存在消耗的,头部或者中间位置的插入删除,需要挪动,挪动数据也是存在消耗的。避免频繁扩容,一次一般都是按倍数扩容,可能存在空间扩容。

链表的优点:
按需申请空间,不用释放空间。
头部或者中间位置的插入和删除,不需要挪动数据。
不存在空间浪费。

链表的缺陷:
每一个数据,都要存放一个指针去链表后面节点的地址。
不支持随机访问。

链表的结构

typedef int SLNodedataType;
typedef struct SList
{SLNodedataType data;struct SList* next;}SLNode;

这个就是我们单链表的基本代码,我们来用图更加清清楚的表示一下它完整的样子。
在这里插入图片描述
这就我们基本的逻辑结构,它前一个的next是存放后面的地址的,这样就能找到我们下一个节点。

单链表使用的时候相比和顺序表比较的话,它的使用不会浪费空间,我们需要一个节点就可以开辟一个节点出来供我们使用。但是它存储就不是连续的了。

那我们现在开始写代码来实现单链表。
单链表
首先我们要创建一个结构体。

typedef int SLNodedataType;
typedef struct SList
{SLNodedataType data;struct SList* next;}SLNode;

接下来我们首先要打印我们的单链表
在这之前我们应该创建节点,创捷节点很简单,就是按照我们上面的图的前一个存放后面的地址。

//创建节点SLNode* n1 = (SLNode*)malloc(sizeof(SLNode));assert(n1);SLNode* n2 = (SLNode*)malloc(sizeof(SLNode));assert(n2);SLNode* n3 = (SLNode*)malloc(sizeof(SLNode));assert(n3);SLNode* n4 = (SLNode*)malloc(sizeof(SLNode));assert(n4);n1->data = 1;n2->data = 2;n3->data = 3;n4->data = 4;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;

那下面就是我们的打印单链表。

void SListPrint(SLNode* plist)
{SLNode* cur = plist;while (cur != NULL){printf("%d->", cur->data);cur = cur->next;}printf("NULL");printf("\n");}

我们来测试一下看看效果。

在这里插入图片描述
可以看到我们的单链表也是成功的打印,那接下来就是要写出我们的尾插函数。
写之前我们先来分析分析,首先尾插一个节点进去,那我们是不是要有一个这样的节点,竟然这样就可以写一个创造节点的函数。就叫他CreateSListNode

SLNode* CreateSListNode(SLNodedataType x)
{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;return newnode;
}

写完这个那我们写一个尾插函数,尾插的时候我们要想一想要传什么地址过去,如果是有数据的话其实我们传一级地址就行,但是如果是空的话,就得传二级,因为我们要改变plist的位置。但是也其实是相当于头插,没节点的时候,总不能在空指针后面插入。那我们写一个 吧。

void SListPushBcak(SLNode** plist, SLNodedataType x)
{SLNode*newnode=CreateSListNode(x);assert(plist);if (*plist == NULL){plist = newnode;}else{SLNode* tail = *plist;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}}

看一下我们编译的结果

在这里插入图片描述
最后也是成功的尾插进去,那尾插之后就应该要写一个尾删。
写尾删的时候,我们要先考虑怎么找到最后,这和尾插一样,遍历一遍找到最后一个,然后free掉就行了。

在这里插入图片描述
代码

void SListPopBack(SLNode** plist)
{SLNode* tail = *plist;SLNode* prev = NULL;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);prev->next = NULL;
}

这其实就是用了一个双指针的方法找最后一个的前一个,但是我们还需要注意链表不能为空,空了怎么删除啊。所以改进一下。

void SListPopBack(SLNode** plist)
{assert(plist);assert(*plist);SLNode* tail = *plist;SLNode* prev = NULL;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);prev->next = NULL;
}
void test1()
{//创建节点SLNode* n1 = (SLNode*)malloc(sizeof(SLNode));assert(n1);SLNode* n2 = (SLNode*)malloc(sizeof(SLNode));assert(n2);SLNode* n3 = (SLNode*)malloc(sizeof(SLNode));assert(n3);SLNode* n4 = (SLNode*)malloc(sizeof(SLNode));assert(n4);n1->data = 1;n2->data = 2;n3->data = 3;n4->data = 4;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;SListPrint(n1);SListPushBcak(&n1, 5);SListPushBcak(&n1, 6);SListPushBcak(&n1, 7);SListPushBcak(&n1, 8);SListPrint(n1);SListPopBack(&n1);SListPopBack(&n1);SListPrint(n1);
}

不过其实我们也可以不用双指针的办法。
那也整一个玩玩吧


void SListPopBack(SLNode** plist)
{assert(plist);assert(*plist);SLNode* tail = *plist;while (tail->next->next != NULL){tail = tail->next;}free(tail->next);tail->next = NULL;

其实道理是一样的,就是找下下一个的节点是不是为空。
尾插写好就是头插,来吧展示。

void SListPushFront(SLNode** plist, SLNodedataType x)
{assert(plist);SLNode* newnode = CreateSListNode(x);if (*plist == NULL){*plist = newnode;}else{newnode->next = *plist;*plist = newnode;}}

其实想明白也不难,接下来就是头删。

void test1()
{//创建节点SLNode* n1 = (SLNode*)malloc(sizeof(SLNode));assert(n1);SLNode* n2 = (SLNode*)malloc(sizeof(SLNode));assert(n2);SLNode* n3 = (SLNode*)malloc(sizeof(SLNode));assert(n3);SLNode* n4 = (SLNode*)malloc(sizeof(SLNode));assert(n4);n1->data = 1;n2->data = 2;n3->data = 3;n4->data = 4;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;SListPrint(n1);SListPushBcak(&n1, 5);SListPushBcak(&n1, 6);SListPushBcak(&n1, 7);SListPushBcak(&n1, 8);SListPrint(n1);SListPopBack(&n1);SListPopBack(&n1);SListPrint(n1);SListPushFront(&n1, 111);SListPushFront(&n1, 222);SListPrint(n1);SListPopFront(&n1);SListPopFront(&n1);SListPopFront(&n1);SListPrint(n1);}
void SListPopFront(SLNode** plist)
{assert(plist);assert(*plist);SLNode* cur = (*plist)->next;free(*plist);*plist = cur;
}

我们在写一个查找功能的代码

SLNode* SLFind(SLNode* plist, SLNodedataType x);

查找我们可以返回这个节点,这样就能和其他功能一起用,比如修改数据,或者在任意位置插入和删除。

SLNode* SLFind(SLNode* plist, SLNodedataType x)
{SLNode* pos = plist;while (pos->data == x){return pos;pos = pos->next;}
}

这是只考虑找到的情况下,但是难免有时候会出现找不到的情况,让我们来看一下吧,写一个找不到情况下和找到情况下的代码。‘

SLNode* SLFind(SLNode* plist, SLNodedataType x)
{SLNode* pos = plist;while (pos != NULL){if (pos->data == x){return pos;}pos = pos->next;}return NULL;
}

然后我们可以写一个函数来判断有没有找到。

SLNode*pos = SLFind(n1, 111);if (pos != NULL){printf("找到了\n");}else{printf("找不到\n");}

我们看完整代码。

void test1()
{//创建节点SLNode* n1 = (SLNode*)malloc(sizeof(SLNode));assert(n1);SLNode* n2 = (SLNode*)malloc(sizeof(SLNode));assert(n2);SLNode* n3 = (SLNode*)malloc(sizeof(SLNode));assert(n3);SLNode* n4 = (SLNode*)malloc(sizeof(SLNode));assert(n4);n1->data = 1;n2->data = 2;n3->data = 3;n4->data = 4;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;SListPrint(n1);SListPushBcak(&n1, 5);SListPushBcak(&n1, 6);SListPushBcak(&n1, 7);SListPushBcak(&n1, 8);SListPrint(n1);SListPopBack(&n1);SListPopBack(&n1);SListPrint(n1);SListPushFront(&n1, 111);SListPushFront(&n1, 222);SListPrint(n1);SListPopFront(&n1);SListPopFront(&n1);SListPopFront(&n1);SListPrint(n1);SLNode*pos = SLFind(n1, 111);if (pos != NULL){printf("找到了\n");}else{printf("找不到\n");}}

我们如果要找111发现没有找到,因为头删的时候改掉,其实我们竟然这样写了就可以写一个修改的代码,这里就不演示了。
接下来我们要写的是在任意位置删除和插入节点。

void SListPushInsert(SLNode** plist, SLNode* pos, SLNodedataType x)
{assert(plist);assert(pos);SLNode* newnode = CreateSListNode(x);if (pos == *plist){SListPushFront(plist, x);}else{SLNode* prev = *plist;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;}
}

测试代码

void test1()
{//创建节点SLNode* n1 = (SLNode*)malloc(sizeof(SLNode));assert(n1);SLNode* n2 = (SLNode*)malloc(sizeof(SLNode));assert(n2);SLNode* n3 = (SLNode*)malloc(sizeof(SLNode));assert(n3);SLNode* n4 = (SLNode*)malloc(sizeof(SLNode));assert(n4);n1->data = 1;n2->data = 2;n3->data = 3;n4->data = 4;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;SListPrint(n1);SListPushBcak(&n1, 5);SListPushBcak(&n1, 6);SListPushBcak(&n1, 7);SListPushBcak(&n1, 8);SListPrint(n1);SListPopBack(&n1);SListPopBack(&n1);SListPrint(n1);SListPushFront(&n1, 111);SListPushFront(&n1, 222);SListPrint(n1);SListPopFront(&n1);SListPopFront(&n1);SListPopFront(&n1);SListPrint(n1);SLNode*pos = SLFind(n1,3);if (pos != NULL){printf("找到了\n");SListPushInsert(&n1, pos, 10086);}else{printf("找不到\n");}SListPrint(n1);
}

在任意位置删除

void SListPopInsert(SLNode** plist, SLNode* pos)
{assert(plist);assert(*plist);assert(pos);if (*plist == pos){SListPopFront(plist);}else{SLNode* prev = *plist;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}

其实还有可以在任意位置后删除,这样更快,就不用找那个位置前一个位置了,这里就不展示了,
完整代码

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int SLNodedataType;
typedef struct SList
{SLNodedataType data;struct SList* next;}SLNode;void SListPrint(SLNode* plist);SLNode* CreateSListNode(SLNodedataType x);void SListPushBcak(SLNode** plist, SLNodedataType x);void SListPopBack(SLNode** plist);void SListPushFront(SLNode** plist, SLNodedataType x);void SListPopFront(SLNode** plist);SLNode* SLFind(SLNode* plist, SLNodedataType x);void SListPushInsert(SLNode** plist, SLNode* pos, SLNodedataType x);void SListPopInsert(SLNode** plist, SLNode* pos);
#include"SList.h"void SListPrint(SLNode* plist)
{SLNode* cur = plist;while (cur != NULL){printf("%d->", cur->data);cur = cur->next;}printf("NULL");printf("\n");}SLNode* CreateSListNode(SLNodedataType x)
{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;return newnode;
}void SListPushBcak(SLNode** plist, SLNodedataType x)
{SLNode*newnode=CreateSListNode(x);assert(plist);if (*plist == NULL){plist = newnode;}else{SLNode* tail = *plist;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}}void SListPopBack(SLNode** plist)
{assert(plist);assert(*plist);SLNode* tail = *plist;SLNode* prev = NULL;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);prev->next = NULL;
}
//
//void SListPopBack(SLNode** plist)
//{
//	assert(plist);
//	assert(*plist);
//	SLNode* tail = *plist;
//	
//	while (tail->next->next != NULL)
//	{
//		
//		tail = tail->next;
//	}
//	free(tail->next);
//	tail->next = NULL;
//	
//}void SListPushFront(SLNode** plist, SLNodedataType x)
{assert(plist);SLNode* newnode = CreateSListNode(x);if (*plist == NULL){*plist = newnode;}else{newnode->next = *plist;*plist = newnode;}}void SListPopFront(SLNode** plist)
{assert(plist);assert(*plist);SLNode* cur = (*plist)->next;free(*plist);*plist = cur;
}//SLNode* SLFind(SLNode* plist, SLNodedataType x)
//{
//	SLNode* pos = plist;
//	while (pos->data == x)
//	{
//		return pos;
//		pos = pos->next;
//	}
//}SLNode* SLFind(SLNode* plist, SLNodedataType x)
{SLNode* pos = plist;while (pos != NULL){if (pos->data == x){return pos;}pos = pos->next;}return NULL;
}void SListPushInsert(SLNode** plist, SLNode* pos, SLNodedataType x)
{assert(plist);assert(pos);SLNode* newnode = CreateSListNode(x);if (pos == *plist){SListPushFront(plist, x);}else{SLNode* prev = *plist;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;}
}void SListPopInsert(SLNode** plist, SLNode* pos)
{assert(plist);assert(*plist);assert(pos);if (*plist == pos){SListPopFront(plist);}else{SLNode* prev = *plist;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}

测试主函数的也发一下吧,大家可以不用放一起测试,有点看不过来。

#include"SList.h"void test1()
{//创建节点SLNode* n1 = (SLNode*)malloc(sizeof(SLNode));assert(n1);SLNode* n2 = (SLNode*)malloc(sizeof(SLNode));assert(n2);SLNode* n3 = (SLNode*)malloc(sizeof(SLNode));assert(n3);SLNode* n4 = (SLNode*)malloc(sizeof(SLNode));assert(n4);n1->data = 1;n2->data = 2;n3->data = 3;n4->data = 4;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;SListPrint(n1);SListPushBcak(&n1, 5);SListPushBcak(&n1, 6);SListPushBcak(&n1, 7);SListPushBcak(&n1, 8);SListPrint(n1);SListPopBack(&n1);SListPopBack(&n1);SListPrint(n1);SListPushFront(&n1, 111);SListPushFront(&n1, 222);SListPrint(n1);SListPopFront(&n1);SListPopFront(&n1);SListPopFront(&n1);SListPrint(n1);SLNode*pos = SLFind(n1,3);if (pos != NULL){printf("找到了\n");SListPushInsert(&n1, pos, 10086);}else{printf("找不到\n");}SListPrint(n1);
}
int main()
{test1();return 0;
}

今天的分享就到这里,我们下次再见。

相关文章:

数据结构单链表

单链表 1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。 在我们开始讲链表之前&#xff0c;我们是写了顺序表&#xff0c;顺序表就是类似一个数组的东西&#xff0…...

自定义WEB框架结合Jenkins实现全自动测试

自定义WEB框架结合Jenkins实现全自动测试 allure生成 allure生成 1.allure–纯命令运行 -固定的–稍微记住对应的单词即可。2 安装&#xff0c;2个步骤: 1.下载allure包&#xff0c;然后配置环境变量。 https://github.com/allure-framework/allure2/releases/tag/2.22.4 2.在…...

PHP加密与安全的最佳实践

PHP加密与安全的最佳实践 概述 在当今信息时代&#xff0c;数据安全是非常重要的。对于开发人员而言&#xff0c;掌握加密和安全的最佳实践是必不可少的。PHP作为一种常用的后端开发语言&#xff0c;提供了许多功能强大且易于使用的加密和安全性相关函数和类。本文将介绍一些P…...

SQL Server数据库无法连接

问题如下&#xff1a; 原因&#xff1a;sql server服务器未开启 解决方法&#xff1a;以管理员身份打开cmd&#xff0c;输入&#xff1a;net start mssqlserver。...

videojs 播放视频

背景&#xff1a;在项目中使用第三方插件videojs进行播放视频&#xff0c;点击事件更改播放的数据源。 一、视频相关理论 (一)、背景 网络流媒体的呈现形式分为两种&#xff1a;直播点播 (二)、流媒体的3种协议 分类&#xff1a;HTTPHLSRTMP定义&#xff1a;基于HTTP的流媒体…...

vue强制刷新变量

在前端开发中&#xff0c;我们经常需要变量的值实时响应到界面上。Vue就是一个非常强大的前端框架&#xff0c;它的数据绑定能够非常好地实现变量与界面的同步更新。但是有时候&#xff0c;我们需要强制刷新某个变量的值&#xff0c;以便界面能及时地反映出它的变化。本文将介绍…...

[QCA6174]QCA6174 5G WiFi DFS处理逻辑分析及雷达误检率高优化规避

DFS认证信息 WIFI DFS测试要求 Master设备需要测试的项目 4.6.2.1 Channel Availability Check 信道可用性检查 定义其作为雷达脉冲检测机制,当雷达脉冲出现时所占用的信道需要能被设备检测到已经被占用。当相关信道未被占用时,这些信道被称为Avaliable Channel可用信道 …...

预防SQL漏洞注入和规避网络攻击

前言: 虽然近些年SQL注入已经被各类的安全开发框架规避了绝大部分&#xff0c;但SQL注入作为一种最原始的攻击手段之一&#xff0c;破坏力仍然十分强大&#xff0c;因为它直捣黄龙数据中心。所以未雨绸缪&#xff0c;各位不可不重视。 预防SQL注入方法措施&#xff1a; 服务器…...

《Go 语言第一课》课程学习笔记(一)

配好环境&#xff1a;选择一种最适合你的 Go 安装方法 选择 Go 版本 一般情况下&#xff0c;建议采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的&#xff0c;少有影响使用的重大 bug。可以根据不同实际项目需要或开源社区的情况使用不同的版本。 有…...

网络安全 Day29-运维安全项目-iptables防火墙

iptables防火墙 1. 防火墙概述2. 防火墙2.1 防火墙种类及使用说明2.2 必须熟悉的名词2.3 iptables 执行过程※※※※※2.4 表与链※※※※※2.4.1 简介2.4.2 每个表说明2.4.2.1 filter表 :star::star::star::star::star:2.4.2.2 nat表 2.5 环境准备及命令2.6 案例01&#xff1a…...

SQL 复习 03

函数与关键字 用法说明round(x, n)四舍五入&#xff0c;x为浮点数&#xff0c;n为保留的位数ceil(x)向上取整floor(x)向下取整truncate(x, n)截断x&#xff0c;n为保留的位&#xff0c;该位之后的数值置零&#xff0c;位数表示示例&#xff1a;321.123&#xff0c;其中小数点前…...

出现 sudo: docker: command not found 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 未成功安装引起3.2 环境变量引起1. 问题所示 安装了docker,但是执行docker命令的时候,提示该问题: ubuntu@10-41-104-1:~$ sudo docker ps -a sudo: docker: command not foundubuntu@10-41-104-1:~$ sudo apt-get install doc…...

FastApi-1-结合sql 增/查demo

目录 FastAPI学习记录项目结构部分接口/代码展示感受全部代码 FastAPI学习记录 fastapi已经学习有一段时间&#xff0c;今天抽时间简单整理下。 官网介绍&#xff1a; FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Py…...

Spring学习笔记3

使用注解开发&#xff1a; Component 组件开发相当于 Value(“xxx”)可以对属性进行赋值 package pojo;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //等价于<bean id"user" class"po…...

springboot艰难版本升级之路!! springboot 2.3.x版本升级到2.7.x版本

文章目录 1.缘起1.1 升级到版本2.7.12启动失败,而且没有报错信息1.2 application-dev.yml 配置加载问题1.3 openfeign依赖问题汇总1.4 datasource报错1.5 MySQL驱动升级1.6 循环依赖报错1.7 跨域错误临时总结1.缘起 由于服务需要搭建链路追踪, 需要把springboot版本升级到2.7.1…...

Codeforces 1856E2 复杂度分析 + DP

题意 传送门 Codeforces 1856E2 PermuTree (hard version) 题解 可以独立考虑每一个固定的 p l c a ( u , v ) plca(u,v) plca(u,v) 对答案的贡献。可以观察到&#xff0c;对于 p p p 的每一棵子树&#xff0c;其所有节点在最优情况下仅有 a p < a v a_p < a_v ap…...

Windows - UWP - 为UWP应用创建桌面快捷方式

Windows - UWP - 为UWP应用创建桌面快捷方式 前言 这是一个较为简单的方式&#xff0c;不需要过多的命令行。 How 首先Win R -> shell:AppsFolder -> 回车&#xff0c; 这将显示电脑上的已安装应用&#xff08;Win32 & UWP&#xff09;&#xff1a; 找到想要创建…...

了解Web DDoS海啸攻击的4个维度

我们都知道近年来网络攻击的数量和频率急剧上升&#xff0c;针对Web应用程序的DDoS海啸攻击就是其中增长非常迅速的一个种类。过去常见的HTTP/S洪水攻击正在大范围的转变为更难对付的Web DDoS海啸攻击&#xff0c;每个人都应该提前做好被攻击的准备并采取适当的保护措施。 哪些…...

【数学建模】逻辑回归算法(Logistic Resgression)

逻辑回归算法 简介逻辑回归与条件概率绘制sigmoid函数 简介 逻辑回归算法是一种简单但功能强大的二元线性分类算法。需要注意的是&#xff0c;尽管"逻辑回归"名字带有“回归”二字&#xff0c;但逻辑回归是一个分类算法&#xff0c;而不是回归算法。 我认为&#xff…...

Hadoop HA集群两个NameNode都是standby或者主NameNode是standby,从NameNode是active的情况集锦

文章目录 背景架构HDFS HA配置错误原因解决方案方案一方案二方案三&#xff08;首先查看自己各参数文件是否配置出错&#xff09; 后记补充failovertransitionToActive 常用端口号及配置文件常用端口号hadoop3.xhadoop2.x 常用配置文件 这里说一下配置Hadoop HA集群可能出现的两…...

DAMOYOLO-S在复杂遮挡下的实例分割效果展示:精准勾勒物体轮廓

DAMOYOLO-S在复杂遮挡下的实例分割效果展示&#xff1a;精准勾勒物体轮廓 最近在测试各种目标检测和分割模型时&#xff0c;我遇到了一个挺头疼的问题&#xff1a;当画面里的物体挤在一起、相互遮挡&#xff0c;或者只露出一小部分时&#xff0c;很多模型就“犯迷糊”了。检测…...

SDMatte模型推理性能剖析:使用Profiling工具定位计算瓶颈

SDMatte模型推理性能剖析&#xff1a;使用Profiling工具定位计算瓶颈 1. 为什么需要性能剖析 做AI模型推理优化就像修车一样&#xff0c;你得先知道哪里出了问题才能对症下药。SDMatte作为一款专业的图像抠图模型&#xff0c;在实际部署中经常会遇到推理速度慢、资源占用高等…...

孟德尔随机化实战(五)—— 告别报错!Error in if (out == “[]“) 深度解析与TwoSampleMR参数调优全攻略

1. 报错现象深度解析&#xff1a;为什么会出现"参数长度为零"&#xff1f; 最近在孟德尔随机化分析交流群里&#xff0c;这个报错出现的频率简直高得离谱&#xff1a;"Error in if (out "[]") { : argument is of length zero"或者它的中文版&q…...

别再被Kettle的流程线骗了!详解‘阻塞数据直到步骤都完成’控件的正确用法与避坑指南

Kettle并行执行模型深度解析&#xff1a;如何正确使用"阻塞数据直到步骤都完成"控件 在ETL工具Kettle的使用过程中&#xff0c;许多开发者都会遇到一个令人困惑的现象&#xff1a;明明在转换中画了流程线&#xff0c;步骤却没有按照预期的顺序执行。这种认知偏差往往…...

从零开始:在VMware虚拟机中部署Janus-Pro-7B进行开发测试

从零开始&#xff1a;在VMware虚拟机中部署Janus-Pro-7B进行开发测试 想试试最新的AI大模型&#xff0c;但手头没有昂贵的独立GPU服务器&#xff1f;别担心&#xff0c;今天我们就来聊聊一个非常接地气的方案&#xff1a;用你手边的普通电脑&#xff0c;通过VMware虚拟机&…...

如何通过Superalgos教育模块快速掌握算法交易:新手入门完整指南

如何通过Superalgos教育模块快速掌握算法交易&#xff1a;新手入门完整指南 【免费下载链接】Superalgos Superalgos/Superalgos: 是一个开源的分布式社交网络分析和数据挖掘平台。适合对大数据分析、机器学习、区块链以及分布式系统有兴趣的开发者。 项目地址: https://gitc…...

保姆级教程:在Windows 11上完美运行STM32CubeMX 6.9.0(附旧版本资源整理)

在Windows 11上完美运行STM32CubeMX历史版本的终极指南 最近升级到Windows 11后&#xff0c;我发现手头几个老项目使用的STM32CubeMX 6.9.0版本完全无法正常运行。每次启动不是闪退就是卡在初始化界面&#xff0c;而项目又必须使用这个特定版本才能保证代码兼容性。经过一周的…...

SystemVerilog进阶:深入探索随机化约束的高级应用

1. 从基础到进阶&#xff1a;SystemVerilog随机化约束的核心价值 在芯片验证领域&#xff0c;随机化验证已经成为提高验证效率的黄金标准。SystemVerilog的随机化约束机制&#xff0c;就像给验证工程师配备了一个智能数据生成器&#xff0c;可以自动产生符合设计规范的测试场景…...

Kimi,Minimax教你的客服怎么做客服

Kimi&#xff0c;教你怎么做客服。下面是Kimi根据我提供的图片写的文章。不是说minimax全面领先kimi&#xff0c;至少我在不断的提高自己的kimi会员等级。但是有时候&#xff0c;这是被迫的消耗积分和额度。199的套餐也快消耗完了。消耗积分是应该的&#xff0c;关键是要用在刀…...

【硬核】让所有AI Agent自动进化!港大开源OpenSpace,一个命令让你的Claude Code/Cursor/OpenClaw秒变超级智能体

最近刷 GitHub&#xff0c;发现了一个让我眼前一亮的项目——OpenSpace。 它解决了一个超级痛点&#xff1a;现在的 AI Agent&#xff08;比如 Claude Code、OpenClaw、Cursor&#xff09;都很强大&#xff0c;但它们从不学习、永不进化——每次任务都是从头开始&#xff0c;浪…...