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

关键设计说明:

聚蜂消防BeesFPD
聚蜂消防BeesFPD

关注消防领域的智慧云平台

下载
  • 长度敏感性:函数默认要求 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函数的用法,大家可以阅读本专题下面的文章。

918

2023.09.19

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

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

463

2024.06.04

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

61

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

20

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号