我有一定数量的范围,每个范围都有一个重量。总范围内的每个点都由该点落入的所有范围的权重之和进行评分。我希望能够便宜地找到积分的总价值,并希望能够找到最大值。理想情况下,它也能够找到一组(等距)间隔点的最大值。
不幸的是,我受到性能的严重限制,并且很难找到一个好的算法。
我能找到的唯一两个不错的解决方案是: - 通过抽取一堆积分来强制它。对于每一个:检查每个范围是否合适,找到总值,然后检查它是否比目前为止最好。通过取范围的边界可以找到体面点样本。 - 创建一组存储桶。迭代所有范围,为适合该范围的所有桶添加值。然后遍历所有桶以找到最佳的
两者都不够快(我们已经过测试),后者不连续,因此存在准确性问题。
只要性能更好,我就可以得到稍微不准确的响应。 为我的特殊情况增加了一些额外的复杂性是因为我实际上处理角度,所以环境是模块化的。范围无法排序,我需要确保从340度到20度的范围包含350和10度的点。 我正在处理的角度范围不能超过180度,并且很少超过90度。 范围的数量通常不是很高(1-30),但我需要做很多计算。
如果重要,语言就是Java。
答案 0 :(得分:1)
制作角度间隔的列表(数组)。如果间隔结束值小于起始值(20 <340),则向结束添加360(340,380)
列出一对(角度,+起点重量或终点重量)。
连接列表及其副本以提供圆形交集。 (可以只复制列表的一部分)
按角度对它们进行排序(在结合时使用+/-作为辅助键: - 在+之前)
使CurrWeight = 0
浏览列表,将+ / weight字段添加到CurrWeight。检查最大值。
(这种方法适用于线性列表,我试图将其修改为循环列表,也许我可能会遗漏一些警告)