0

0

标题:如何在数组列表中找到与目标数组最接近的数组(基于数值比例相似性)

花韻仙語

花韻仙語

发布时间:2026-01-12 18:42:01

|

777人浏览过

|

来源于php中文网

原创

标题:如何在数组列表中找到与目标数组最接近的数组(基于数值比例相似性)

本文介绍一种基于元素间比值总和的数组相似性度量方法,通过计算目标数组与候选数组各对应位置元素的比值之和,选取总和最接近理论最大值(即数组长度)的数组索引作为“最接近”结果。

在实际开发中,常需从一组候选数组中找出与给定“主数组”最相似的一个——例如在信号匹配、特征向量检索或模板比对等场景中。但“最接近”需明确定义:本文采用归一化比例相似性(ratio-based similarity) 作为核心指标:若两个等长数组完全相同,则其逐元素比值均为 1,比值总和即等于数组长度;差异越大,比值总和越偏离该值。因此,我们以比值总和最接近数组长度为判据,实现高效、可解释的最近邻查找。

以下是完整实现(含健壮性增强):

function findClosestArray(target, candidates) {
  if (!Array.isArray(target) || candidates.length === 0) {
    throw new Error('Invalid input: target must be an array, candidates must be a non-empty array of arrays');
  }

  // 辅助函数:计算两等长数组的比值总和(target[i] / candidate[i])
  const sumRatios = (a, b) => {
    if (a.length !== b.length || a.length === 0) return -Infinity; // 长度不匹配视为无效
    return a.reduce((sum, val, i) => sum + val / b[i], 0);
  };

  // 计算每个候选数组的相似度得分(越接近 target.length 越相似)
  const scores = candidates.map(candidate => ({
    index: candidates.indexOf(candidate),
    score: sumRatios(target, candidate)
  })).filter(item => item.score > 0); // 过滤掉因除零或长度不等导致的无效分

  if (scores.length === 0) {
    throw new Error('No valid candidate array found: all have mismatched length or contain zero/division-by-zero');
  }

  // 找到 score 最接近 target.length 的索引(最小绝对差)
  const idealScore = target.length;
  const bestMatch = scores.reduce((best, curr) => {
    const diff = Math.abs(curr.score - idealScore);
    return diff < Math.abs(best.score - idealScore) ? curr : best;
  });

  return bestMatch.index;
}

// 示例使用
const mainArr = [2237, 2192, 2234, 2223, 2196, 2279, 2160, 2123]; // 注意:原问题中 mainArr 长度为 9,但示例 candidates 均为 8 元素 → 此处统一为 8 以保证可比性
const otherArrays = [
  [1757, 1650, 1757, 1774, 1755, 1615, 1591, 1550],
  [1678, 1545, 1742, 1605, 1662, 1629, 1678, 1601]
];

console.log(findClosestArray(mainArr, otherArrays)); // 输出:0 或 1,取决于哪组比值总和更接近 8

关键设计说明:

百度文心一格
百度文心一格

百度推出的AI绘画作图工具

下载
  • 长度敏感性:函数默认要求 target 与每个 candidate 长度严格一致;若需支持变长数组,可扩展为插值对齐、滑动窗口匹配或余弦相似度等更高级策略。
  • 数值鲁棒性:自动过滤含 0 元素的候选数组(避免除零),并跳过长度不匹配项。
  • 语义清晰:score ≈ target.length 直观反映“整体比例一致性”,比单纯欧氏距离更适应尺度变化场景(如不同传感器量纲)。

⚠️ 注意事项:

  • 若所有候选数组均含零值或长度不匹配,函数将抛出明确错误,便于调试;
  • 该方法假设数组元素均为正数(比值有意义);若含负数或零,建议改用曼哈顿距离余弦相似度
    // 替代方案:余弦相似度(适用于含负数/零的向量)
    const cosineSimilarity = (a, b) => {
      const dot = a.reduce((s, v, i) => s + v * b[i], 0);
      const normA = Math.sqrt(a.reduce((s, v) => s + v * v, 0));
      const normB = Math.sqrt(b.reduce((s, v) => s + v * v, 0));
      return normA && normB ? dot / (normA * normB) : 0;
    };

综上,findClosestArray 提供了一种轻量、透明且易于调优的数组相似性判定方案,可根据实际数据特性灵活选用距离度量模型。

相关专题

更多
length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

916

2023.09.19

传感器故障解决方法
传感器故障解决方法

传感器故障排除指南:识别故障症状(如误读或错误代码)。检查电源和连接(确保连接牢固,无损坏)。校准传感器(遵循制造商说明)。诊断内部故障(目视检查、信号测试、环境影响评估)。更换传感器(选择相同规格,遵循安装说明)。验证修复(检查信号准确性,监测异常行为)。

462

2024.06.04

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

106

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

64

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

93

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号