1-1二分查找
二分查找
- 1 基础版
- 1.1 算法描述
- 1.2 算法流程图
- 1.3 算法实现
- 1.3.1 Java实现
- 2 改动版
- 2.1 算法描述
- 2.2 算法流程图
- 2.3 算法实现
- 2.3.1 Java实现
- 2.4 改进点分析
- 2.4.1 区间定义差异
- 2.4.2 核心改进原理
- 2.4.3 数学等价性证明
- 3 平衡版
- 3.1 算法描述
- 3.2 算法流程图
- 3.3 算法实现
- 3.3.1 Java实现
- 3.4 改进点分析
- 3.4.1 区间定义差异
- 3.4.2 核心改进原理
- 3.4.3 数学等价性证明
- 3.4.4 性能分析
- 4 对比总结
- 4.1 区间定义
- 4.2 中间索引计算
- 4.3 终止条件
- 4.4 改进点
- 4.5 性能分析
二分查找(Binary Search)是一种高效的搜索算法,适用于已经排好序的数组。它通过将待查找的元素与数组中间的元素进行比较,从而每次可以排除掉一半的元素,以此来快速缩小搜索范围,直到找到目标元素或确定其不存在于数组中。该算法的时间复杂度为 O ( l o g n ) O(logn) O(logn),意味着随着输入规模的增长,查找时间增长缓慢
1 基础版
需求:在有序数组 A A A中查找值 t a r g e t target target。
- 如果找到,则返回该值在数组中的索引。
- 如果未找到,则返回 − 1 -1 −1。
1.1 算法描述
- 初始化:给定一个内含 n n n个元素的有序数组 A A A,满足 A 0 ≤ A 1 ≤ A 2 ≤ . . . ≤ A n − 1 A_{0} ≤ A_{1} ≤ A_{2} ≤ ... ≤ A_{n−1} A0≤A1≤A2≤...≤An−1,一个待查值 t a r g e t target target。
- 设置初始索引:设置 i = 0 i = 0 i=0, j = n − 1 j = n − 1 j=n−1。
- 终止条件:如果 i > j i > j i>j,结束查找,找不到需要的值,返回 − 1 −1 −1。
- 计算中间索引:设置 m = ⌊ i + j 2 ⌋ m = \lfloor \frac{i+j}{2} \rfloor m=⌊2i+j⌋, m m m为数组的中间索引, ⌊ ⋅ ⌋ \lfloor ⋅ \rfloor ⌊⋅⌋表示向下取整。
- 比较并调整索引:
- 如果 t a r g e t < A m target < A_{m} target<Am,设置 j = m − 1 j = m − 1 j=m−1,跳转至第2步。
- 如果 A m < t a r g e t A_{m} < target Am<target,设置 i = m + 1 i = m + 1 i=m+1,跳转至第2步。
- 如果 A m = t a r g e t A_{m} = target Am=target,结束查找,并返回所在位置的数组索引 m m m。
1.2 算法流程图
1.3 算法实现
1.3.1 Java实现
这是一种最简单的二分查找算法的实现,从逻辑上没什么问题,但是在实际应用的过程中是可能会出bug的。
/*** 使用二分查找算法在一个有序数组中查找目标值的基本实现** @param arr 一个有序的整数数组* @param target 要查找的目标值* @return 目标值在数组中的索引,如果目标值不在数组中,则返回-1*/
public static int binarySearchBasic(int[] arr, int target) {// TODO 1. 设置初始索引int left = 0; // 左边界int right = arr.length - 1; // 右边界// TODO 2. 循环查找while (left <= right) {// TODO 2.1. 计算中间索引int mid = (right + left) >>> 1;// TODO 2.2. 比较中间索引的值与目标值if (arr[mid] == target) {// TODO 2.3. 如果等于目标值,返回中间索引return mid;} else if (arr[mid] < target) {// TODO 2.4. 如果小于目标值,更新左边界left = mid + 1;} else {// TODO 2.5. 如果大于目标值,更新右边界right = mid - 1;}}// TODO 3. 如果循环结束,没有找到目标值,返回-1return -1;
}
- 循环条件为左边界≤右边界
- 循环条件
left <= right保证了以下两种情况:- 当区间仍有元素时(
left <= right),继续检查。 - 当区间为空时(
left > right),终止循环。
- 当区间仍有元素时(
- 若循环条件为
left < right:- 问题场景:当区间仅剩一个元素时(
left == right),循环条件不成立,直接跳过检查。 - 后果:若该元素恰好是目标值,算法会错误地返回
-1。
- 问题场景:当区间仅剩一个元素时(
- 正确条件
left <= right:- 覆盖所有有效区间:即使只剩一个元素(
left == right),仍会进入循环检查。 - 终止条件正确性:当
left > right时,区间已为空,表明目标值不存在。
- 覆盖所有有效区间:即使只剩一个元素(
- 循环条件
- 中间索引如何求
-
(right + left) / 2这一种是直接计算中间值的方法
计算方式在数学上是正确的,但是这种方法存在一个严重的潜在问题:整数溢出。
- 当
left和right都接近int类型的最大值(Integer.MAX_VALUE,即2^31 - 1)时,left + right可能会超过int类型的最大值,导致溢出。 - 溢出后,计算结果会变成负数,导致
mid的值错误,进而引发索引越界或逻辑错误。
- 当
-
left + (right - left) / 2这一种是通过偏移量计算中间值的方法
- 避免溢出:
right - left的结果一定小于right,不会超过int的范围。 - 逻辑清晰:通过偏移量计算中间值,更直观地表达“从
left开始,加上区间长度的一半”。
- 避免溢出:
-
使用
>>(有符号右移)>>是有符号右移操作符,它会保留符号位(即最高位),并在左侧补上与符号位相同的位。int mid = (left + right) >> 1;- 特点
- 等价于除以 2:
(left + right) >> 1等价于(left + right) / 2。 - 保留符号位:如果
left + right是负数,右移后结果仍然是负数。 - 性能优化:右移操作比除法操作更快,适合对性能要求较高的场景。
- 等价于除以 2:
- 潜在问题
- 整数溢出:如果
left + right超过int的最大值(Integer.MAX_VALUE),仍然会导致溢出问题。 - 负数问题:如果
left + right是负数,右移结果可能与预期不符。相加为负数的原因是:当两个正数相加的结果超过int的最大值时,最高位(符号位)会从 0 变为 1,导致结果被解释为负数。
- 整数溢出:如果
- 特点
-
使用
>>>(无符号右移)>>>是无符号右移操作符,它会忽略符号位,并在左侧补 0。int mid = (left + right) >>> 1;- 特点
- 等价于除以 2:
(left + right) >>> 1等价于将left + right视为无符号整数后除以 2。 - 忽略符号位:无论
left + right是正数还是负数,右移后结果都是正数。 - 避免负数问题:即使
left + right是负数,结果也会被正确处理。
- 等价于除以 2:
- 优点
- 避免溢出问题:
>>>可以正确处理left + right超过int最大值的情况。- 例如,
left = 1_500_000_000,right = 2_000_000_000,left + right会溢出为负数,但(left + right) >>> 1会得到正确的结果。
- 例如,
- 性能优化:与
>>类似,右移操作比除法更快。
- 避免溢出问题:
- 特点
-
性能对比
以下是几种计算方式的性能对比:
计算方式 性能 是否可能溢出 是否支持负数 (left + right) / 2较慢 是 是 left + (right - left) / 2较慢 否 是 (left + right) >> 1较快 是 是 (left + right) >>> 1较快 否 是
-
2 改动版
需求:在有序数组 A A A中查找值 t a r g e t target target,通过左闭右开区间优化边界处理。
- 如果找到,则返回该值在数组中的索引。
- 如果未找到,则返回 − 1 -1 −1。
2.1 算法描述
- 初始化:给定一个内含 n n n个元素的有序数组 A A A,满足 A 0 ≤ A 1 ≤ A 2 ≤ . . . ≤ A n − 1 A_{0} ≤ A_{1} ≤ A_{2} ≤ ... ≤ A_{n−1} A0≤A1≤A2≤...≤An−1,一个待查值 t a r g e t target target。
- 设置初始索引:设置 i = 0 i = 0 i=0, j = n j = n j=n(左闭右开区间)。
- 终止条件:如果 i ≥ j i \geq j i≥j,结束查找,返回 − 1 −1 −1。
- 计算中间索引:设置 m = ⌊ i + j 2 ⌋ m = \lfloor \frac{i+j}{2} \rfloor m=⌊2i+j⌋。
- 比较并调整索引:
- 如果 t a r g e t < A m target < A_{m} target<Am,设置 j = m j = m j=m(保持右开特性)。
- 如果 A m < t a r g e t A_{m} < target Am<target,设置 i = m + 1 i = m + 1 i=m+1。
- 如果 A m = t a r g e t A_{m} = target Am=target,返回索引 m m m。
2.2 算法流程图
2.3 算法实现
2.3.1 Java实现
/*** 使用二分查找算法查找目标值在数组中的索引* 如果目标值存在于数组中,则返回其索引;如果目标值不存在于数组中,则返回-1* 二分查找算法的前提是输入数组必须是有序的** @param arr 一个有序的整数数组* @param target 目标值* @return 目标值在数组中的索引,如果目标值不存在于数组中,则返回-1*/
public static int binarySearchAlternative(int[] arr, int target) {// TODO 1. 设置初始索引int left = 0; // 左边界int right = arr.length; // 右边界// TODO 2. 循环查找while (left < right) {// TODO 2.1. 计算中间索引int mid = (right + left) >>> 1;// TODO 2.2. 比较中间索引的值与目标值if (arr[mid] == target) {// TODO 2.3. 如果等于目标值,返回中间索引return mid;} else if (arr[mid] < target) {// TODO 2.4. 如果小于目标值,更新左边界left = mid + 1;} else {// TODO 2.5. 如果大于目标值,更新右边界right = mid;}}// TODO 3. 如果循环结束,没有找到目标值,返回-1return -1;
}
2.4 改进点分析
2.4.1 区间定义差异
| 特性 | 基础版 | 改进版 |
|---|---|---|
| 初始区间 | 左闭右闭 [0, n-1] | 左闭右开 [0, n) |
| 循环条件 | left <= right | left < right |
| 右边界更新方式 | right = mid - 1 | right = mid |
2.4.2 核心改进原理
- 右开区间的优势:
- 更直观的索引计算:初始右边界直接取数组长度,无需
-1调整 - 减少边界条件判断:当
right = mid时,天然保持右开特性
- 更直观的索引计算:初始右边界直接取数组长度,无需
- 循环次数优化:
- 基础版终止条件为
left > right,需要多一次无效循环 - 改进版终止条件为
left == right,精确控制循环次数
- 基础版终止条件为
2.4.3 数学等价性证明
对于区间长度 L = j − i L = j - i L=j−i:
- 基础版每次迭代减少 L / 2 L/2 L/2
- 改进版每次迭代减少 ⌈ L / 2 ⌉ \lceil L/2 \rceil ⌈L/2⌉
两种方式时间复杂度均为 O ( log n ) O(\log n) O(logn),但改进版具有更好的空间局部性
3 平衡版
3.1 算法描述
- 初始化:给定一个内含 n n n 个元素的有序数组 A A A,满足 A 0 ≤ A 1 ≤ A 2 ≤ . . . ≤ A n − 1 A_0≤A_1≤A_2≤...≤A_{n−1} A0≤A1≤A2≤...≤An−1,一个待查值 t a r g e t target target。
- 设置初始索引:设置左边界 l e f t = 0 left=0 left=0,右边界$ right=n$(左闭右开区间)。
- 终止条件:如果 r i g h t − l e f t ≤ 1 right−left≤1 right−left≤1,结束查找,返回 − 1 −1 −1。
- 计算中间索引:设置$ mid=\lfloor \frac{i+j}{2} \rfloor$。
- 比较并调整索引:
- 如果 t a r g e t < A m i d target<A_{mid} target<Amid,设置 r i g h t = m i d right=mid right=mid。
- 如果 A m i d < t a r g e t A_{mid}<target Amid<target,设置$ left=mid$。
- 如果 A m i d = t a r g e t A_{mid}=target Amid=target,返回索引$ mid$。
3.2 算法流程图
3.3 算法实现
3.3.1 Java实现
/*** 使用平衡二分查找算法在已排序的数组中搜索指定目标值* 此方法通过不断缩小搜索范围的一半来高效查找目标值,适用于大规模数据集** @param arr 已排序的整数数组,不包含重复元素* @param target 要搜索的目标值* @return 目标值在数组中的索引;如果目标值不在数组中,则返回-1*/
public static int binarySearchBalanced(int[] arr, int target) {// 1. 设置初始索引int left = 0; // 左边界int right = arr.length; // 右边界// 2. 循环查找while (1 < right - left) {// 2.1. 计算中间索引int mid = (right + left) >>> 1;// 2.2. 比较中间索引的值与目标值if (arr[mid] < target) {// 2.4. 如果小于目标值,更新左边界left = mid;} else {// 2.5. 如果大于目标值,更新右边界right = mid;}}// 3. 最后检查左边界是否为目标值if (arr[left] == target) {// 3.1 如果等于目标值,返回左边界return left;} else {// 3.2 如果没有找到目标值,返回-1return -1;}
}
3.4 改进点分析
3.4.1 区间定义差异
| 特性 | 基础版 | 平衡版 |
|---|---|---|
| 初始区间 | 左闭右闭$ [0, n-1]$ | 左闭右开$ [0, n)$ |
| 循环条件 | left <= right | 1 < right - left |
| 右边界更新方式 | right = mid - 1 | right = mid |
3.4.2 核心改进原理
- 右开区间的优势:
- 更直观的索引计算:初始右边界直接取数组长度,无需
-1调整。 - 减少边界条件判断:当
right = mid时,天然保持右开特性。
- 更直观的索引计算:初始右边界直接取数组长度,无需
- 循环次数优化:
- 基础版终止条件为
left > right,需要多一次无效循环。 - 平衡版终止条件为
1 < right - left,精确控制循环次数。
- 基础版终止条件为
3.4.3 数学等价性证明
对于区间长度 L = j − i L=j−i L=j−i:
- 基础版每次迭代减少 L / 2 L/2 L/2。
- 平衡版每次迭代减少 ⌈ L / 2 ⌉ ⌈L/2⌉ ⌈L/2⌉。
两种方式时间复杂度均为 O ( l o g n ) O(logn) O(logn),但平衡版具有更好的空间局部性。
3.4.4 性能分析
- 时间复杂度: O ( l o g n ) O(logn) O(logn)。每次迭代将搜索范围缩小一半,因此查找效率非常高。
- 空间复杂度: O ( 1 ) O(1) O(1)。算法只使用了常量级别的额外空间,适合大规模数据集。
4 对比总结
4.1 区间定义
| 版本 | 初始区间 | 循环条件 | 右边界更新方式 |
|---|---|---|---|
| 基础版 | 左闭右闭 [ 0 , n − 1 ] [0, n-1] [0,n−1] | left <= right | right = mid - 1 |
| 改进版 | 左闭右开$ [0, n)$ | left < right | right = mid |
| 平衡版 | 左闭右开$ [0, n)$ | right - left > 1 | right = mid |
4.2 中间索引计算
- 基础版:
int mid = (left + right) >>> 1; - 改进版:
int mid = (left + right) >>> 1; - 平衡版:
int mid = (left + right) >>> 1;
4.3 终止条件
- 基础版:当循环结束时,若未找到目标值,返回 − 1 -1 −1。
- 改进版:当循环结束时,若未找到目标值,返回 − 1 -1 −1。
- 平衡版:循环结束后,检查左边界是否为目标值。
4.4 改进点
- 基础版:逻辑简单,易于理解。
- 改进版:
- 使用左闭右开区间,右边界更新更直观。
- 使用无符号右移运算符
>>>计算中间值,避免整数溢出。
- 平衡版:
- 通过左闭右开区间和特定的终止条件,进一步优化循环次数。
- 最后检查左边界,减少不必要的比较。
4.5 性能分析
- 时间复杂度:
- 所有版本均为$ O(log n)$,但在实际运行中,平衡版的循环次数更少,性能稍优。
- 空间复杂度:
- 所有版本均为$ O(1)$,不占用额外空间。
相关文章:
1-1二分查找
二分查找 1 基础版1.1 算法描述1.2 算法流程图1.3 算法实现1.3.1 Java实现 2 改动版2.1 算法描述2.2 算法流程图2.3 算法实现2.3.1 Java实现 2.4 改进点分析2.4.1 区间定义差异2.4.2 核心改进原理2.4.3 数学等价性证明 3 平衡版3.1 算法描述3.2 算法流程图3.3 算法实现3.3.1 Ja…...
【如何掌握CSP-J 信奥赛中的深搜算法】
CSP-J 信奥赛中的深搜(深度优先搜索)算法是一个重要知识点,以下是一些学习深搜算法的建议: 理解基础概念 定义与原理:深度优先搜索是一种用于遍历或搜索图、树等数据结构的算法。它从起始节点开始,沿着一条…...
Unity笔试常考
线程同步的几种方式 1.信号量pv操作 2.互斥加锁 3.条件变量 五层网络协议指的是哪五层 1.应用层 2.运输层 3.网络层 4.链路层 5.物理层 TCP和UDP区别 tcp 面向连接,保证发送顺序,速度慢,必须在线,三次握手,4次挥手…...
知识图谱智能应用系统:基于人工智能的知识提取架构
在知识图谱智能应用系统中,知识提取是将非结构化数据(如文本、文档)转化为结构化知识的关键步骤。通过人工智能技术,系统能够自动识别文本中的实体、关系、属性和事件,并将其转化为可用于知识图谱构建的三元组数据。以下是对知识提取架构的详细描述,包括环境准备、数据标…...
Qt:Qt基础介绍
目录 Qt背景介绍 什么是Qt Qt的发展史 Qt支持的平台 Qt版本 Qt的优点 Qt的应用场景 Qt的成功案例 Qt的发展前景及就业分析 Qt背景介绍 什么是Qt Qt是⼀个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是完全面向…...
【deepSeek R1】Ollama 更改模型安装位置 以及应用安装位置
【deepSeek R1】Ollama 更改模型安装位置 以及应用安装位置 本地版部署deepSeek R1 可以参考文章 3分钟教你搭建属于自己的本地大模型 DeepSeek R1 Ollama 是一个开源工具,旨在帮助用户轻松在本地计算机上运行、部署和管理大型语言模型(LLMs)…...
让office集成deepseek,支持office和WPS办公软件!(体验感受)
导读 AIGC:AIGC是一种新的人工智能技术,它的全称是Artificial Intelligence Generative Content,即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术,能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…...
DKG(Distributed Key Generation)协议
一、DKG是什么 DKG(分布式密钥生成)提供了一种去中心化的方法,使各个参与方在不相互信任的情况下生成共享密钥,以确保安全通信和多方参与的机密性。 DKG技术的关键思想是使用多方计算(secure multiparty computation)和秘钥共享(secret sharing)的概念。 秘钥共享 则…...
动态规划问题——青蛙跳台阶案例分析
问题描述: 一只青蛙要跳上n级台阶,它每次可以跳 1级或者2级。问:青蛙有多少种不同的跳法可以跳完这些台阶? 举个例子: 假设台阶数 n 3 ,我们来看看青蛙有多少种跳法。 可能的跳法: 1. 跳1级…...
Spring(26) spring-security-oauth2 官方表结构解析
目录 一、什么是 spring-security-oauth2?二、spring-security-oauth2 的表结构2.1 oauth_client_details 客户端详细信息表2.2 oauth_access_token 认证授权Token记录表2.3 oauth_refresh_token 刷新授权Token记录表2.4 oauth_code 授权Code记录表 一、什么是 spri…...
MySQL 数据库编程-C++
目录 1 数据库基本知识 1.1 MYSQL常见命令 1.2 SQL注入 1.3 ORM框架 1 数据库基本知识 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成:…...
【大数据技术】搭建完全分布式高可用大数据集群(Flume)
搭建完全分布式高可用大数据集群(Flume) apache-flume-1.11.0-bin.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Flume 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目…...
疯狂前端面试题(二)
一、Webpack的理解 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。Webpack 能够将各种资源(JavaScript、CSS、图片、字体等)视为模块,并通过依赖关系图将这些模块打包成一个或多个最终的输出文件(通常是一个或几个…...
kafka专栏解读
kafka专栏文章的编写将根据kafka架构进行编写,即先编辑kafka生产者相关的内容,再编写kafka服务端的内容(这部分是核心,内容较多,包含kafka分区管理、日志存储、延时操作、控制器、可靠性等),最后…...
深入探究 C++17 std::is_invocable
文章目录 一、引言二、std::is_invocable 概述代码示例输出结果 三、std::is_invocable 的工作原理简化实现示例 四、std::is_invocable 的相关变体1. std::is_invocable_r2. std::is_nothrow_invocable 和 std::is_nothrow_invocable_r 五、使用场景1. 模板元编程2. 泛型算法 …...
OpenCV:图像修复
目录 简述 1. 原理说明 1.1 Navier-Stokes方法(INPAINT_NS) 1.2 快速行进方法(INPAINT_TELEA) 2. 实现步骤 2.1 输入图像和掩膜(Mask) 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …...
【项目日记(四)】thread cache 层
前言 前面我们对整个项目的框架进行了介绍,本期开始我们将进行第一层线程缓存层(thread cache)的详细介绍与实现。 目录 前言 一、thread cache 的整体设计 二、内存对齐规则和哈希映射关系 2.1 如何对齐? 2.2 这样设计对齐规则的好处?…...
人工智能图像分割之Mask2former源码解读
环境搭建: (1)首先本代码是下载的mmdetection-2022.9的,所以它的版本要配置好,本源码配置例如mmcv1.7,python3.7,pytorch1.13,cuda11.7。pytorch与python,cuda版本匹配可参考:https://www.jb51.net/python/3308342lx.htm。 (2)还有一个是先要安装一个vs2022版本或…...
uniapp 编译生成鸿蒙正式app步骤
1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…...
2024最新版Java面试题及答案,【来自于各大厂】
发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全~ 篇幅限制就只能给大家展示小册部分内容了,需要完整版的及Java面试宝典小伙伴点赞转发,关注我后在【翻到最下方,文尾点击名片】即可免费获取…...
Excel 融合 deepseek
效果展示 代码实现 Function QhBaiDuYunAIReq(question, _Optional Authorization "Bearer ", _Optional Qhurl "https://qianfan.baidubce.com/v2/chat/completions")Dim XMLHTTP As ObjectDim url As Stringurl Qhurl 这里替换为你实际的URLDim postD…...
【填坑】新能源汽车三电设计之常用半导体器件系统性介绍
# 在新能源汽车的三电(电池、电机、电控)系统中,半导体器件扮演着至关重要的角色。它们如同系统的“大脑”和“神经末梢”,精确地控制着电能的流向与转换,确保新能源汽车高效、稳定且安全地运行。今天,就让…...
SpringCloud面试题----Nacos和Eureka的区别
功能特性 服务发现 Nacos:支持基于 DNS 和 RPC 的服务发现,提供了更为灵活的服务发现机制,能满足不同场景下的服务发现需求。Eureka:主要基于 HTTP 的 RESTful 接口进行服务发现,客户端通过向 Eureka Server 发送 HT…...
21.2.6 字体和边框
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 通过设置Rang.Font对象的几个成员就可以修改字体,设置Range.Borders就可以修改边框样式。 【例 21.6】【项目ÿ…...
正则表达式进阶(二)——零宽断言详解:\b \B \K \z \A
在正则表达式中,零宽断言是一种非常强大的工具,能够在不消费字符的情况下对匹配位置进行约束。除了环视(lookahead 和 lookbehind)以外,还有一些常用的零宽断言,它们用于处理边界、字符串的开头和结尾等特殊…...
OpenFeign远程调用返回的是List<T>类型的数据
在使用 OpenFeign 进行远程调用时,如果接口返回的是 List 类型的数据,可以通过以下方式处理: 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化,如果服务端返回的是 List的JSON格式数据,可以直接在 Feig…...
三维模拟-机械臂自翻车
机械仿真 前言效果图后续 前言 最近在研究Unity机械仿真,用Unity实现其运动学仿真展示的功能,发现一个好用的插件“MGS-Machinery-master”,完美的解决了Unity关节定义缺少液压缸伸缩关节功能,内置了多个场景,讲真的&…...
网络安全治理架构图 网络安全管理架构
网站安全攻防战 XSS攻击 防御手段: - 消毒。 因为恶意脚本中有一些特殊字符,可以通过转义的方式来进行防范 - HttpOnly 对cookie添加httpOnly属性则脚本不能修改cookie。就能防止恶意脚本篡改cookie 注入攻击 SQL注入攻击需要攻击者对数据库结构有所…...
调用deepseek的API接口使用,对话,json化,产品化
背景 最近没咋用chatgpt了,deepseek-r1推理模型写代码质量是很高。deepseek其输出内容的质量和效果在国产的模型里面来说确实算是最强的,并且成本低,它的API接口生态也做的非常好,和OpenAI完美兼容。所以我们这一期来学一下怎么调…...
omegaconf库使用实践
最近在重构RapidOCR仓库代码,使其更加优雅的同时,具有扩展性。无意从他人源码中发现omegaconf库。 omegaconf OmegaConf是一个用于处理配置文件和命令行参数的Python库。它支持YAML、JSON、INI等多种配置文件格式,提供了配置合并、类型安全…...
