- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这样的时间间隔:
[5,10]
我有更多的时间点列表,长度不同,例如:
t1=[3,6,9,10]
t2=[2,4,5,6,10]
..
t1 [3,6]
是第一个区间,[6,9]
是第二个区间,依此类推。
t2
和其他列表也是如此。
现在我需要保存列表,以及与第一个时间间隔相交的特定间隔。例如,在 t1
中,我有 [3,6]
与 [5,10]、[6,9]
相交,与 [5,10]
等
我已经制定了一个算法,但我要处理更多数据,我需要一个快速算法。例如,如果我使用 300.000 个列表并且每个列表都有 200 个时间点,我的算法 1 在大约 5-10 秒内正常。但如果我有 10.000 个或更多时间点,算法就会非常慢。
我的算法是这样的:
First time interval <- [t1,t2]
For each list
For each time interval [s1,s2] in list
if(s1>= t1 && s2 <= t2)
{
saveIntervall()
}
else if (s1<= t2 && s2 > t2)
{
saveIntervall()
}
else if(s1 < t1 && s2 >= t1)
{
saveIntervall()
}
else if (s1 < t1 && s2 > t2)
{
saveIntervall()
}
Edit1:是的,我已经订购了 list 。
Edit2:我还有另一个问题,当我找到交点时,我需要计算一个介于 0 和 1 之间的分数,以判断交点的大小。我用这个:
double score = 0.0d;
if(s1>= t1 && s2 <= t2)
{
score = (s2-s1) / (t2-t1);
}
else if(t2 >= s2 && t1 > s1)
{
score = (s2-t1) / (t2-t1);
}
else if(t2 < s2 && t1 <= s1)
{
score = (t2-s1) / (t2-t1);
}
else
{
score = 1;
}
我也可以加快速度吗?
最佳答案
两个区间 [s1, s2] 和 [t1, t2] 的交集为空当且仅当:
t2 < s1 or s2 < t1
所以对于两个间隔来检查两者是否相交你只需要做上面的测试。
此外,一旦您知道 s2 < t1,那么就没有必要继续处理带来 t1 的列表,因为较大的间隔永远不会相交,这意味着您应该继续前进。
朴素伪算法:
given [s1, s2]
for each list [t1, t2, ... t(n)] in search_lists
for each interval [t(x), t(x+1)] from [t1, t2, ... t(n] (x goes from 0 to n-1)
if t(x+1) < s1
continue
if s2 < t(x)
break
saveInterval()
要真正利用 [t1, t2, .. , t(n)] 已排序这一事实,可以进行相当多的改进。
首先注意 [s1, s2]
将与 [t(x), t(x+1)]
iff t(x+1) >= s1
和 s2 >= t(x)
但是
if t(x) >= s1 then for every h>0 `t(x+h) >= s1`
还有
if s2 >= t(x) then for every h>0 `s2 >= t(x-h)`
所以如果我们找到最小的 i 使得 t(i+1)>=s1 那么从 [t(i), t(i+1)]
开始的所有区间都满足相交的第一个条件;即 ([t(i+1), t(i+2)]
, [t(i+2), t(i+3)]
... )
如果我们找到最大的 j 使得 s2 >= t(j-1) 那么所有从 [t(j-1), t(j)]
向后的区间都满足第二个健康)状况 。即 ([t(j-2), t(j-1)]
, [t(j-3), t(j-2)]
... )
i 和 j 之间的所有间隔同时满足且仅满足它们。
所以最终的算法是:
given [s1, s2]
for each list [t1, t2, ... t(n)] in search_lists
find the smallest i such that t(i+1)>=s1
find the biggest j such that s2>= t(j-1)
if j>i then all the intervals between `{t(i)... t(j)}` intersect with [s1, s2]
otherwise there is no intersection.
由于 {t1, t2, t3...t(n)}
已排序,我们可以使用二进制搜索来查找索引 i
和 j
高效
编辑2:
[s1,s2]和[t1,t2]的交集是:
[最大(s1, t1), min(s2,t2)]
大小是:L1 = s2-s1
L2 = t2-t1
L3 = min(s2,t2) - max(s1,t1)
您要查找的分数是:L3/min(L2, L1)
介于 0 和 1 之间的分数。
(min(s2,t2) - max(s1,t1)) / ( min(s2-s1, t2-t1) )
计算这个的成本是 3 次测试、3 次减法运算和 1 次浮点运算。但我假设间隔有效并且存在交集,否则需要更多测试。 (s2>s2
, t2>t1
and min(s2,t2) > max(s1,t1)
。最后的测试是一样的iff 上述讨论的交集条件。
关于求区间交集的Java算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24511278/
我有一个现有站点,其数据库设计不正确并且包含大量记录,因此我们无法更改数据库结构。 本期数据库主要包含用户、问题、选项、答案4个表。有一组标准的问题和选项,但对于每个用户,每组问题和选项在答案表中都有
有没有办法找出两个 CGPathRef 是否相交。就我而言,所有 CGPath 都有 closePath。 例如,我有两条路径。一条路径是旋转一定角度的矩形,另一条路径是弯曲路径。两条路径的原点会经常
我目前正在使用 JavaFX 研究不同形状之间的边界相交。我想检测两个多边形在它们的点上而不是在它们的边界上的碰撞(即 2 个多边形)。 请参见图 1:不需要的行为和图 2:需要的行为。 是否有任何现
在我的three.js 场景中,我有一些立方体。我想为用户提供用鼠标选择框的可能性。 这是重要的代码(我使用 Three.js 版本 69。): function init() { [...]
我有一个问题。我想将四边形与四边形相交。 int main(){ typedef boost::geometry::model::point_xy TBoostPoint; typedef b
在 MongoDB 中我们找到了交集的方法,但我们也想实现日期范围排除。让我解释一下。 我们有每个支持团队的每日轮值表。每个支持团队可以每 15 分钟预订一次,持续 5-25 分钟(大约)。每个团队有
目录 1、列表求并集 1. union_by 2、列表求交集 1. intersection_by
我有以下查询: select id from t1 intersect select id from t2 intersect select id from t3 id 在某些表中可能不是唯一的,所以
需要完成此实现才能使用 UseSet 类。不确定我所实现的是否100%正确。 但是我需要 Union 和 SysDiff 方面的帮助。 public class Set { private Ar
我的程序打印主构造函数,但不返回 3 个底部函数,而是返回其编译结果。我哪里出错了? import java.util.*; public class Main { public static v
我正在尝试找到两个不同列表列表的交集。换句话说,找出 list1 中的所有列表是否与列表 2 中的任何列表相交。 列表1: [[1,4],[1,6],[6,8],[8,10]] 列表2: [[],
我正在尝试从 2 个已知 BST 的交集创建一个新的 BST。我在第二种情况下的 intersect2 方法中收到 NullPointerException,位于“cur3.item.set_acco
这个问题已经有答案了: self referential struct definition? (9 个回答) 已关闭 7 年前。 我有一个脚本 a.h #include b.h type
我在 user_profile 表上运行搜索,其中包含单个索引和复合索引: SELECT ••• FROM user_profile up JOIN auth_user
我正在尝试为(公寓)列表创建过滤器,通过 apartsments_features 表与 apartment features 建立多对多关系。 我只想包括具有所有某些功能(在表格上标记为"is")的
我想从两个给定的嵌套列表中创建一个新的嵌套列表(每个列表中都有唯一的项目),以便新的嵌套列表是两个列表的最大公共(public)交集。 一个例子希望能帮助阐明我的问题: old1 = [[1,
我在 Django 中有两个模型,我不确定如何编写它们(是否有一个抽象模型并继承等等......或者有两个不同的模型)但通常我有两种类型的对象 A 和 B。 A 和 B 完全相同,因为它们只是项目。它
我有一个像这样的数组 arrays = [ ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'g'], ['a',
我正在通过向 Mario Zechner 的开源跳线游戏添加更多功能来学习 libgdx。我正在尝试制作一些带有角度的平台并遇到旋转矩形的碰撞检测问题。 我关注了this解决方案并使用多边形和我的矩形
我有一个包含对象的数组: let data = [[{a:0}, {b:1}], [{a:1}, {b:1}]] 现在我想制作一个 lodash intersection这两个数组,返回 [{b:1}
我是一名优秀的程序员,十分优秀!