【交通网络拓扑图实现原理深度解析】
交通网络拓扑图实现原理深度解析
简易demo地址
背景故事:交通网络调度可视化的演进
1. 项目背景
在现代城市轨道交通系统中,交通网络线路的可视化展示一直是一个重要而复杂的问题。传统的交通网络线路图往往采用静态图片方式展示,这种方式存在诸多限制:
- 无法实时反映运营状态
- 缺乏交互能力
- 难以进行动态更新
- 无法与调度系统集成
2. 业务需求
2.1 核心诉求
2.2 具体场景
-
调度中心
- 需要实时监控线路运营状态
- 快速定位故障位置
- 支持线路编辑和更新
-
乘客服务
- 提供清晰的线路展示
- 支持站点查询和路线规划
- 展示实时运营信息
-
运维管理
- 便于维护和更新线路信息
- 支持多人协作编辑
- 提供版本控制能力
3. 技术选型考虑
在选择技术方案时,我们考虑了多种可能:
-
Canvas方案
- 优点:性能好,适合大量动画
- 缺点:交互处理复杂,开发效率低
-
图片+HTML方案
- 优点:实现简单,开发快
- 缺点:缺乏灵活性,性能受限
-
SVG方案(最终选择)
- 优点:
- 矢量图形,缩放无损
- 支持复杂交互
- 可编程性强
- 缺点:
- 数据量较大
- 需要预处理坐标
- 优点:
技术解析部分
1. 整体架构
2. 数据结构解析
就像搭建乐高一样,我们有三种基本"积木":
2.1 线路信息(相当于乐高底板)
{"lineCode": 1,"lineName": "交通网络1号线"
}
2.2 站点信息(相当于乐高积木块)
{"stop_id": 268036,"stop_name": "机场东","cx": "519.999023", // SVG中的X位置"cy": "428", // SVG中的Y位置"transfer": true // 是否是换乘站
}
2.3 连接信息(相当于乐高积木之间的连接)
{"link_id": 451,"from_stop_id": 268036,"end_stop_id": 268035,"path": "M521.75563 431.974152 L 521.75563 475.457352"
}
3. 渲染实现(就像画画一样)
从 index.vue 中可以看到三层渲染:
<SvgPanZoom><svg><!-- 第一层:画线 --><!-- 第二层:画站点 --><g v-for="item in stations"><!-- 普通站点:小圆点 --><circle :cx="item.cx" :cy="item.cy":r="item.station_id == overId ? 8 : 5"/><!-- 换乘站:大圆点 --><template v-if="item.transfer"><!-- 特殊处理 --></template></g><!-- 第三层:写站名 --><text :x="item.nameCx" :y="item.nameCy">{{ item.stop_name }}</text></svg>
</SvgPanZoom>
4. 数据转换过程(就像制作蛋糕的步骤)
5. 关键实现细节
5.1 站点定位(就像在地图上插旗子)
// 从JSON中读取预设的SVG坐标
const station = {cx: "519.999023", // X位置cy: "428", // Y位置nameCx: "538.999023", // 站名X位置nameCy: "433" // 站名Y位置
};
5.2 线路连接(就像画连线游戏)
// SVG路径语法
// M = 移动画笔到起点
// L = 画直线到终点
const path = "M521.75563 431.974152 L 521.75563 475.457352";
6. 优缺点分析
优点:
-
性能好
- 使用预计算的SVG坐标,像使用导航一样,路线已经规划好
- 不需要实时计算位置
-
精确控制
- 站点位置精确,像在图纸上画图一样
- 线路走向可以完全控制
-
交互丰富
- 支持缩放平移,像电子地图一样
- 支持站点高亮、悬停效果
缺点:
-
维护成本高
- 坐标需要手动计算,像手工绘图一样费时
- 修改线路需要重新计算坐标
-
缺乏灵活性
- 布局固定,不能自适应,像贴画一样位置固定
- 难以动态添加新线路
-
数据量大
- 每个站点都需要存储多个坐标
- 路径数据很长
7. 实际应用场景
就像实际交通网络运营一样:
- 站点管理:像管理交通网络站一样管理节点
- 线路规划:像规划交通网络线路一样连接站点
- 换乘处理:像处理换乘站一样特殊标记
8. 改进建议
-
自动布局
- 添加自动计算坐标的能力
- 类似自动规划交通网络线路
-
响应式设计
- 添加缩放适配
- 像电子地图一样自适应屏幕
-
数据优化
- 压缩路径数据
- 使用相对坐标减少数据量
这种实现方式就像搭建一个微型交通网络沙盘,每个站点、每条线路都需要精确定位,虽然前期工作量大,但运行效果好,交互体验佳。
附录A:连线机制
重点分析站点ID系统和连线机制。
交通网络拓扑图连线机制深度解析
1. Station ID 系统设计
从数据中可以看到ID的编码规则:
{"stop_id": 268036, // 基础站点ID"station_id": 1268036000, // 完整站点ID = 线路号(1) + 站点ID(268036) + 后缀(000)"line_id": 1 // 所属线路
}
2. 连线机制
2.1 连线数据结构
{"front": [ // 正向连接{"link_id": 451,"from_stop_id": 268036, // 起始站"end_stop_id": 268035, // 终点站"path": "M521.75563 431.974152 L 521.75563 475.457352" // SVG路径}],"reverse": [ // 反向连接// 相反方向的连接]
}
2.2 连线过程
2.3 路径命令解析
// 示例路径
"M521.75563 431.974152 L 521.75563 475.457352"// 分解说明
M521.75563 431.974152 // 移动到起点坐标(521.75563, 431.974152)
L 521.75563 475.457352 // 画直线到终点坐标(521.75563, 475.457352)// 曲线示例
"C523.571213,616.015938 527.16276,622.202176 532.530273,627.462563"
// C命令后跟6个数字,表示两个控制点和终点坐标
3. 连线类型
3.1 直线连接
{"path": "M521.75563 431.974152 L 521.75563 475.457352"
}
适用场景:南北方向或东西方向的简单连接
3.2 曲线连接
{"path": "M543.431694,638.108799 C545.167145,639.498135 548.75563,641.76009 548.75563,646.456066"
}
适用场景:转弯处或需要平滑过渡的地方
4. 连线实现细节
4.1 基础连线逻辑
// 伪代码展示连线过程
function connectStations(stations, links) {links.forEach(link => {const fromStation = stations.find(s => s.stop_id === link.from_stop_id);const toStation = stations.find(s => s.stop_id === link.end_stop_id);// 使用SVG path连接两站return `M${fromStation.cx},${fromStation.cy} L${toStation.cx},${toStation.cy}`;});
}
4.2 复杂路径处理
// 处理包含多个控制点的复杂路径
function createComplexPath(link) {const { path } = link;// path可能包含多段命令:// M(起点) + L/C(直线/曲线) + L/C(直线/曲线) ...return path;
}
5. 连线优化
5.1 性能优化
5.2 视觉优化
/* 线路样式优化 */
.metro-line {stroke-width: 4; /* 线条粗细 */stroke-linecap: round; /* 线条端点圆润 */fill: none; /* 不填充 */
}
6. 实际应用示例
6.1 基本连线
<template><svg><!-- 渲染所有连线 --><path v-for="link in links":d="link.path":class="['metro-line', `line-${link.line_id}`]"/><!-- 渲染站点 --><circle v-for="station in stations":cx="station.cx":cy="station.cy"/></svg>
</template>
6.2 动态连线效果
// 添加动画效果
const pathLength = path.getTotalLength();
path.style.strokeDasharray = pathLength;
path.style.strokeDashoffset = pathLength;
7. 连线系统的优缺点
优点:
-
精确控制
- 通过预设路径实现精确的线路走向
- 支持复杂的曲线和转角
-
双向支持
- front/reverse 结构支持双向交通网络线路
- 便于处理不同方向的视觉效果
-
灵活性
- 支持直线、曲线、折线等多种连接方式
- 可以处理复杂的交通网络线路布局
缺点:
-
数据冗余
- 正反向路径都需要存储
- 路径数据量大
-
维护难度
- 手动编辑路径数据困难
- 修改线路需要重新计算路径
-
缺乏自动化
- 无法自动生成合适的连接路径
- 依赖预设的路径数据
这种连线机制虽然实现较为复杂,但能够精确控制交通网络线路的视觉效果,适合实际交通网络线路图的展示需求。
附录B:SVG连线实现深度分析
1. SVG标签层级结构
<SvgPanZoom><svg><g> <!-- 最外层g: 用于整体分组和变换 --><g> <!-- 线路层g: 用于管理线路 --><path /> <!-- 线路路径 --></g><g> <!-- 站点层g: 用于管理站点 --><!-- 站点渲染 --></g></g></svg>
</SvgPanZoom>
1.1 为什么使用g标签?
- 分组管理
<g> <!-- 站点组 --><text :class="['cls-station-name', clsTextScale]" /> <!-- 站名 --><circle class="cls-station" /> <!-- 站点圆点 -->
</g>
- g标签作为容器,可以统一管理站点及其文字
- 可以统一应用变换(transform)
- 便于整体控制显示/隐藏
- 层级管理
<g> <!-- 最外层容器 --><g v-for="item in ..."> <!-- 遍历渲染 --><!-- 内容 --></g>
</g>
- 便于管理渲染层级
- 避免z-index混乱
- 方便整体操作
2. 线路渲染实现
2.1 路径渲染
<path:d="link.path":class="['cls-line',{ 'highlighted': isHighlightedLine(link) }]":style="{stroke: getLineColor(link),strokeWidth: getLineWidth(link)}"
/>
2.2 动态样式处理
// 线路颜色处理
function getLineColor(link) {// 根据线路ID获取颜色return MetroLineList[link.line_id]?.color || '#000';
}// 高亮状态判断
function isHighlightedLine(link) {return props.highlightedLines.includes(link.line_id);
}
2.3 CSS样式定义
.cls-line {fill: none; /* 路径不填充 */stroke-linecap: round; /* 线段端点圆润 */transition: all 0.3s; /* 平滑过渡效果 */
}.cls-line.highlighted {stroke-width: 6; /* 高亮时线条加粗 */filter: brightness(1.2); /* 高亮时增加亮度 */
}
3. 动态效果实现
3.1 高亮效果
<path:class="{'highlighted': isHighlightedLine(link),'dimmed': isDimmedLine(link)}"
/>
3.2 动画效果
@keyframes dashAnimation {from {stroke-dashoffset: 1000;}to {stroke-dashoffset: 0;}
}.animated-line {stroke-dasharray: 5,5; /* 虚线效果 */animation: dashAnimation 20s linear infinite;
}
4. 交互处理
4.1 鼠标事件
<g@mouseover="handleStationOver(item)"@mouseout="handleStationOut"@click="handleStationClick(item)"
><!-- 站点内容 -->
</g>
4.2 状态联动
// 站点悬停处理
function handleStationOver(station) {overId.value = station.station_id;// 更新相关线路状态updateConnectedLines(station);
}
5. 连线数据处理
5.1 路径数据结构
interface PathData {link_id: number;from_stop_id: number;end_stop_id: number;path: string; // SVG路径line_id: number;
}
5.2 路径生成示例
// 实际数据示例
const path = "M521.75563 431.974152 L 521.75563 475.457352";// 分解说明
// M: 移动到起点 (521.75563, 431.974152)
// L: 画直线到 (521.75563, 475.457352)
6. 性能优化
6.1 计算缓存
// 使用computed缓存计算结果
const visibleStations = computed(() => {return stations.value.filter(station => isInViewport(station));
});
7. 实际应用示例
7.1 基础线路渲染
<template><g class="metro-lines"><pathv-for="link in lineLinks":key="link.link_id":d="link.path":style="{stroke: getLineColor(link),strokeWidth: getLineWidth(link)}"/></g>
</template>
7.2 高亮效果
// 高亮相关线路
function highlightConnectedLines(station) {const connectedLines = station.lines || [];return {'highlighted': connectedLines.includes(currentLine.value),'dimmed': !connectedLines.includes(currentLine.value)};
}
这种实现方式的优点:
- 结构清晰,使用g标签进行合理分组
- 支持复杂的动态效果
- 性能优化合理
- 交互体验流畅
缺点:
- SVG路径数据庞大
- 动态效果依赖CSS动画
- 需要手动维护路径数据
通过这种方式,可以实现一个高性能、交互丰富的交通网络线路图展示系统。
附录C:交通网络拓扑图的双向线路
双向线路是交通网络拓扑图中的重要特性。接下来分析一下双向线路的实现原理和考虑因素。
1. 双向线路数据结构
从原始 index.vue 中可以看到,数据结构中有 front 和 reverse:
{"front": [ // 正向路径{"link_id": 451,"from_stop_id": 268036,"from_stop_name": "机场东","end_stop_id": 268035,"end_stop_name": "后瑞","line_id": 1,"path": "M521.75563 431.974152 L 521.75563 475.457352"}],"reverse": [ // 反向路径{"link_id": 313,"from_stop_id": 268035,"from_stop_name": "后瑞","end_stop_id": 268036,"end_stop_name": "机场东","line_id": 1,"path": "M525.911789 475.457352 L 525.911789 431.974152"}]
}
2. 实现原理
2.1 双向路径实现
<template><g class="metro-lines"><!-- 正向路径 --><pathv-for="link in frontLinks":d="link.path":class="['metro-line', 'front-line']":style="getLineStyle(link)"/><!-- 反向路径 --><pathv-for="link in reverseLinks":d="link.path":class="['metro-line', 'reverse-line']":style="getLineStyle(link)"/></g>
</template>
2.2 样式处理
.metro-line {fill: none;stroke-width: 4;stroke-linecap: round;
}.front-line {stroke-dasharray: none; /* 实线 */
}.reverse-line {stroke-dasharray: none; /* 实线 *//* 或使用虚线区分方向 *//* stroke-dasharray: 4,4; */
}
3. 设计考虑因素
3.1 为什么需要双向路径?
-
运营需求
- 展示列车双向运行
- 区分上下行方向
- 显示不同方向的运营状态
-
可视化需求
- 避免路径重叠
- 清晰展示运行方向
- 支持方向性动画
-
交互需求
- 分别高亮不同方向
- 独立控制各方向状态
- 支持方向性查询
3.2 实现方案对比
- 单路径+方向标记
{path: "M520 430 L 520 480",direction: "both"
}
优点:
- 数据量小
- 实现简单
缺点:
- 无法展示复杂运营状态
- 动画效果受限
- 双独立路径(当前方案)
{front: { path: "M520 430 L 520 480" },reverse: { path: "M525 480 L 525 430" }
}
优点:
- 完全独立控制
- 支持复杂状态
- 动画效果丰富
缺点:
- 数据量较大
- 维护成本高
- 动态计算路径
function generatePath(start, end, direction) {// 根据方向动态计算路径
}
优点:
- 数据量小
- 灵活性高
缺点:
- 计算复杂
- 性能开销大
4. 应用场景
4.1 运营监控
// 不同方向独立状态
const lineStatus = {front: {status: 'normal',speed: 'normal'},reverse: {status: 'delayed',speed: 'slow'}
}
4.2 列车动画
// 双向动画效果
.train-animation-forward {animation: moveForward 20s linear infinite;
}.train-animation-reverse {animation: moveReverse 20s linear infinite;
}
4.3 路况展示
// 不同方向路况
const trafficStatus = {front: {congestion: 'heavy',delay: '10min'},reverse: {congestion: 'light',delay: '0min'}
}
5. 优化建议
- 数据优化
// 使用相对坐标减少数据量
const pathOffset = 4; // 双向偏移量
const reversePath = generateReversePath(frontPath, pathOffset);
- 渲染优化
// 按需渲染
const visiblePaths = computed(() => {return paths.filter(path => isInViewport(path));
});
- 交互优化
// 智能方向判断
function determineDirection(from, to) {return calculateOptimalDirection(from, to);
}
这种双向实现方式虽然数据量较大,但提供了最大的灵活性和控制力,适合复杂的交通网络线路展示系统。特别是在需要展示实时运营状态、支持动画效果、处理复杂交互时,这种方案的优势就很明显。
附录D:在双线线路中如何根据两个stopId(站点)查找对应的线段及区间
分析一下根据 stopId 查找和匹配线段的实现逻辑。
1. 线段查找机制
2. 代码实现分析
2.1 基础数据结构
interface Link {link_id: number;from_stop_id: number;end_stop_id: number;path: string;line_id: number;
}interface Station {stop_id: number;station_id: number;// ...其他属性
}
2.2 查找逻辑实现
// 根据起终点站查找连接线段
function findLinksByStops(fromStopId: number, toStopId: number) {// 1. 在正向连接中查找const frontLinks = metroData.front.filter(link => (link.from_stop_id === fromStopId && link.end_stop_id === toStopId) ||(link.from_stop_id === toStopId && link.end_stop_id === fromStopId));// 2. 在反向连接中查找const reverseLinks = metroData.reverse.filter(link => (link.from_stop_id === fromStopId && link.end_stop_id === toStopId) ||(link.from_stop_id === toStopId && link.end_stop_id === fromStopId));return {frontLinks,reverseLinks};
}
2.3 高亮实现
<template><g class="metro-lines"><pathv-for="link in links":key="link.link_id":d="link.path":class="['metro-line',{'highlighted': isHighlightedLink(link),'dimmed': isDimmedLink(link)}]"/></g>
</template><script setup>
const props = defineProps({highlightedStops: {type: Array,default: () => []}
});// 判断线段是否需要高亮
const isHighlightedLink = (link) => {if (props.highlightedStops.length !== 2) return false;const [fromStopId, toStopId] = props.highlightedStops;return ((link.from_stop_id === fromStopId && link.end_stop_id === toStopId) ||(link.from_stop_id === toStopId && link.end_stop_id === fromStopId));
};
</script>
3. 实际应用场景
3.1 路径查询
// 查询两站点间的路径
function findPath(fromStopId: number, toStopId: number) {const links = findLinksByStops(fromStopId, toStopId);return {links,distance: calculateDistance(links),estimatedTime: calculateTime(links)};
}
3.2 实时监控
// 监控特定线段状态
function monitorLinkStatus(fromStopId: number, toStopId: number) {const links = findLinksByStops(fromStopId, toStopId);return {status: getLinkStatus(links),traffic: getTrafficInfo(links),trains: getRunningTrains(links)};
}
4. 优化实现
4.1 缓存优化
// 使用 Map 缓存查询结果
const linkCache = new Map();function getCachedLinks(fromStopId: number, toStopId: number) {const key = `${fromStopId}-${toStopId}`;if (!linkCache.has(key)) {linkCache.set(key, findLinksByStops(fromStopId, toStopId));}return linkCache.get(key);
}
4.2 索引优化
// 建立站点-线段索引
const stationLinkIndex = new Map();function buildStationLinkIndex(links) {links.forEach(link => {// 正向索引if (!stationLinkIndex.has(link.from_stop_id)) {stationLinkIndex.set(link.from_stop_id, new Set());}stationLinkIndex.get(link.from_stop_id).add(link);// 反向索引if (!stationLinkIndex.has(link.end_stop_id)) {stationLinkIndex.set(link.end_stop_id, new Set());}stationLinkIndex.get(link.end_stop_id).add(link);});
}
4.3 性能优化
// 快速查找实现
function findLinksOptimized(fromStopId: number, toStopId: number) {const fromLinks = stationLinkIndex.get(fromStopId) || new Set();return Array.from(fromLinks).filter(link => link.end_stop_id === toStopId || link.from_stop_id === toStopId);
}
5. 实际使用示例
<!-- 父组件 -->
<template><metro-map:highlighted-stops="[selectedFromStop, selectedToStop]"@path-found="handlePathFound"/>
</template><script setup>
const selectedFromStop = ref(null);
const selectedToStop = ref(null);// 处理路径查找结果
const handlePathFound = (pathInfo) => {const { links, distance, time } = pathInfo;// 更新UI显示
};// 选择站点
const selectStation = (stopId) => {if (!selectedFromStop.value) {selectedFromStop.value = stopId;} else if (!selectedToStop.value) {selectedToStop.value = stopId;// 触发路径查找findPath(selectedFromStop.value, selectedToStop.value);}
};
</script>
6. 错误处理
function findLinksWithError(fromStopId: number, toStopId: number) {try {const links = findLinksByStops(fromStopId, toStopId);if (!links || links.length === 0) {throw new Error('No direct connection found');}return links;} catch (error) {console.error('Error finding links:', error);// 处理错误情况return null;}
}
这种实现方式的优点:
- 支持双向查找
- 性能优化(通过索引和缓存)
- 灵活的匹配机制
- 错误处理完善
- 可扩展性好
缺点:
- 初始化索引需要额外开销
- 缓存需要管理内存
- 复杂路径可能需要递归查找
这个实现适合交通网络线路这种相对固定的拓扑结构,能够快速响应路径查询和状态更新的需求。
相关文章:

【交通网络拓扑图实现原理深度解析】
交通网络拓扑图实现原理深度解析 简易demo地址 背景故事:交通网络调度可视化的演进 1. 项目背景 在现代城市轨道交通系统中,交通网络线路的可视化展示一直是一个重要而复杂的问题。传统的交通网络线路图往往采用静态图片方式展示,这种方式…...

【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
https://time.geekbang.org/column/article/118826 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的? 2.5介绍了渲染流水线中的 DOM 生成、样式计算和布局三个阶段,2.6讲解渲染流水线后面的阶段…...

NO2.C++语言基础|C++和Java|常量|重载重写重定义|构造函数|强制转换|指针和引用|野指针和悬空指针|const修饰指针|函数指针(C++)
6. C 和 Java 区别(语⾔特性,垃圾回收,应⽤场景等) 指针: Java 语⾔让程序员没法找到指针来直接访问内存,没有指针的概念,并有内存的⾃动管理功能,从⽽有效的防⽌了 C 语⾔中的指针…...

【CSS】---- 纯 CSS 实现无限滚动轮播
1. 前言 仅使用 CSS 创建一个具有无限滚动轮播的动画,无需 JavaScript。首先是无限滚动轮播动画效果在我们常见的开发中都是借用 JavaScript 实现,如果纯粹使用 CSS,我觉得还是一个比较有趣的。 2. 效果预览 3. 效果分析 一屏展示了三个图片元素;动画依次向左移动;三个图…...

软考架构师笔记-计算机网络
1.9 计算机网络 OSI/RM 七层模型 物理层 二进制传输(中继器、集线器) (typedef) 数据链路层 传送以帧为单位的信息(网桥、交换机、网卡) 网络层 分组传输和路由选择(三层交换机、路由器)ARP/RARP/IGMP/ICMP/IP 传输层 端到端的连接(TCP/UDP)在前向纠错系统中,当接…...

Spring MVC 页面重定向返回后通过nginx代理 丢失端口号问题处理
Spring MVC页面重定向通过Nginx代理后出现端口丢失问题,通常由以下原因及解决方案构成: ## 一、Nginx配置问题(核心原因) 1. Host头传递不完整 Nginx默认未将原始请求的端口信息传递给后端,导致应用生成重定向…...

道可云人工智能每日资讯|亚马逊云业务部门成立智能体人工智能团队
道可云元宇宙每日简报(2025年3月6日)讯,今日元宇宙新鲜事有: 《杭州市富阳区未来产业培育行动计划(2025-2026年)》发布 3月3日,杭州市富阳区经信局正式发布了《杭州市富阳区未来产业培育行动计划(2025-2026年)》&…...

算力100问☞第72问:算力与算法、数据的关系是什么?
目录 1、数据是基础 2、算法是核心 3、算力是保障 4、三者的关系 5、实际应用中的体现 算力、算法和数据是人工智能和计算机科学领域的三个核心要素,它们之间相互依赖、相互促进,共同构成了现代计算系统的基础。以下是它们之间的关系: 1、数据是基础 定义:数据是信息…...
AI-Ollama本地大语言模型运行框架与Ollama javascript接入
1.Ollama Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等多种…...

Java开发的AI应用框架简述——LangChain4j、Spring AI、Agent-Flex
LangChain4j LangChain4j官网 star很多,文档齐全,在AI服务中,提供了丰富的功能,示例代码丰富。 简介 是一个功能丰富、易于使用的Java AI开发框架,特别适合需要快速集成和使用大型语言模型的Java开发者。 项目特点 …...

【算法day2】无重复字符的最长子串 两数之和
无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 https://leetcode.cn/problems/longest-substring-without-repeating-characters/ class Solution { public:int lengthOfLongestSubstring(string s) {int sub_length …...

HarmonyOS:基于hmrouter实现Page的生命周期监听
前言:在使用ArkTs语言写鸿蒙的App中,我们发现Page的生命周期函数,如下: 页面的生命周期(32) onPageShow:页面显示触发(页面特有) onPageHide:页面隐藏触发(页面特有) onBackPress:当用户点击返回按钮时…...

DeepSeek + 飞书多维表格搭建你的高效工作流
众所周知,大模型DeepSeek擅长于处理大规模语言模型推理任务,特别是在成本降低和思维链推理方面表现出色,我们一般把大模型必做我们的大脑,但是一个人不能只有大脑,还需要其他输入输出以及操作支配的眼耳鼻嘴手足等。…...

uniapp+<script setup lang=“ts“>使用 uni.$emit和uni.$on全局传递数据
注意: 在A页面直接使用 uni.$emit(changeCategoryKey, childCategory)传递,在B页面使用 uni.$on(changeCategoryKey, (val) > {console.log(val, 取值);});只在组件传递有效,页面跳转后是无效的 跳转页面使用的传递数据的方法如下&…...

综合使用pandas、numpy、matplotlib、seaborn库做数据分析、挖掘、可视化项目
目录 1.结构化数据挖掘 1.1依赖库导入和数据读取 1.2各品牌机型及售价统计 1.3视频录制规格与价格关联性分析 2.结构化数据预处理 2.1筛选特征 2.2特征标签归一化及编码 1.结构化数据挖掘 1.1依赖库导入和数据读取 导入必要的依赖库,读取 csv 格式数据集转化为 Data…...

docker中kibana启动后,通过浏览器访问,出现server is not ready yet
问题:当我在浏览器访问kibana时,浏览器给我报了server is not ready yet. 在网上试了很多方法,都未能解决,下面是我的方法: 查看kibana日志: docker logs -f kibana从控制台打印的日志可以发现ÿ…...

十、Redis 主从复制:原理解析、配置实践与优化策略
Redis 主从复制:原理解析、配置实践与优化策略 Redis 作为高性能的 NoSQL 数据库,主从复制(Master-Slave Replication) 是其核心特性之一。主从复制用于数据冗余、读负载分担、故障恢复,是 Redis 构建高可用架构的基础。本文将深入解析 Redis 主从复制的配置方法、复制机…...

使用JMeter(组件详细介绍+使用方式及步骤)
JSON操作符 在我们使用请求时,经常会遇到JSON格式的请求体,所以在介绍组件之前我会将介绍部分操作符,在进行操作时是很重要的 Operator Description $ 表示根元素 当前元素 * 通配符,所有节点 .. 选择所有符合条件的节点 .name 子元素,name是子元素名称 [start:e…...

lamp平台的应用
一.lamp介绍 网站: 静态网站 动态网站 【php语言 .php结尾的文件】 作用:运行php语言编写的动态网站应用 lamp LinuxApache【负责解析静态资源】MySQL【负责存储网站产生的数据】PHP【负责解析动态资源】 如上图所示,是lamp平台中三…...

蓝桥杯4T平台(串口打印电压值)
知识点:串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…...

使用ASIWebPageRequest库编写Objective-C下载器程序
使用 ASIWebPageRequest 库编写 Objective-C 下载器程序是一个简单且高效的方式来处理 HTTP 请求。在 ASIHTTPRequest 和 ASIWebPageRequest 中,ASIWebPageRequest 是专门用于下载网页及其资源的库。 1. 安装 ASIWebPageRequest 首先,你需要安装 ASIHT…...

代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛
101. 孤岛的总面积//思路大概是先计算面积,然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。 #include<bits/stdc.h> using namespace std; void sum(vector<vector<bool>>& finded,const vector<vector<int>>&a…...

迷你世界脚本出生点接口:Spawnport
出生点接口:Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...

双链路提升网络传输的可靠性扩展可用带宽
为了提升网络传输的可靠性或增加网络可用带宽, 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口:通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…...

Pytest测试用例执行跳过的3种方式
文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中,我们可能某条测试用例没写完,代码执行时会报错,或者是在一些条件下不让某些…...

【蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐数】
闲话系列:每日一题,秃头有我,Hello!!!!!,我是IF‘Maxue,欢迎大佬们来参观我写的蓝桥杯系列,我好久没有更新博客了,因为up猪我寒假用自己的劳动换了…...

深度学习Save Best、Early Stop
一、Save Best 今天的大模型,在训练过程中可能会终止,但是模型其实是可以接着练的,假设GPU挂了,可以接着训练,在原有的权重上,训练其实就是更新w,如果前面对w进行了存档,那么可以从…...

数据库与存储优化
一、MySQL深度优化 索引优化 B树索引结构 结构特点: 平衡多路搜索树,所有数据存储在叶子节点,非叶子节点仅存键值和指针。叶子节点通过双向链表连接,支持范围查询高效遍历。 优势: 减少磁盘IO(高扇出&#…...

Android15请求动态申请存储权限完整示例
效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm...

C/C++蓝桥杯算法真题打卡(Day3)
一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...