algorithm - 选择最远元素子集的算法
问题描述
假设有一组对象S。假设为S中的每对对象定义一个距离函数,它具有度量的属性,即d(x, x) = 0 , d(x, y) = d(y, x)和d(x, z) <= d(x, y) + d(y, z)。
目标:找到一个集合S',它是具有给定大小的 S 的子集,使得 S' 中的元素在所有可能的S'中彼此相距最远。
问题一:如何定义“相距最远”?请注意,只有距离函数,元素本身没有任何坐标等(它们可能是例如字符串,距离是 Levenshtein 距离)。一个明显的候选者是成对距离的总和,但我想知道是否还有其他(更好的?)方法,尤其是关于问题 2。
问题2:如何实际选择元素以形成S'?一种明显的方法是暴力破解,即尝试所有组合并选择元素相距最远的组合,但这听起来在计算上无效。有没有更好的方法,可能利用元素“最远”的一些巧妙定义。
解决方案
假设集合 S 中有N个元素,并将S中元素i的分离度量定义为到其最近邻居的距离,即l(i) = min(d(i, j))其中0 < = i, j <= N - 1, i != j。
因此,生成的子集S'将包含M个元素,其中的最大值为l(i),其中M是子集S'的给定大小
这需要N * (N-1) / 2 次调用距离函数d。
Tis 算法可以进行一些优化。当我们看到距离d(i, k) < Cmin时,我们可以中止l(i)的计算,其中Cmin是已计算的子集S'候选中的最小l。我们将不得不保留和更新包含对(j, l(j))的候选列表
PS 这个问题等同于E. Dijkstra “最偏远村庄的问题”中描述的问题
推荐阅读
- c# - HtmlToImageConverter C# 无法正确生成基于 HTML/CSS 的图像
- ruby-on-rails - rails webpacker angular - polyfills.ts - 错误:无法解析“core-js/es6/reflect”
- css - 链接在 gatsby 中有一个额外的下划线
- excel - 我想清除或删除具有变量值的行
- node.js - 如何使用多个文件夹暂存存储库
- angular - Angular 7中作为queryParams的对象
- python - Kombu/Celery 发布者 订阅者
- angular - ngrx 异步元减速器
- r - 在数据框中,如果值存在于另一个数据框中,则重复值
- c# - 当我使用 array.Length 作为索引时,为什么我的数组会抛出错误“System.ArgumentOutOfRangeException”?