Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 第一个元素之间的差值小于或等于第二个元素最小值的成对数_C++_Algorithm_Performance_Optimization - Fatal编程技术网

C++ 第一个元素之间的差值小于或等于第二个元素最小值的成对数

C++ 第一个元素之间的差值小于或等于第二个元素最小值的成对数,c++,algorithm,performance,optimization,C++,Algorithm,Performance,Optimization,给定整数对数组,需要找到对的对数,使对的第一个元素之间的绝对差小于或等于对的第二个元素的最小值 例如: PS:我原以为时间复杂度比*N上的naive要高。当你把成对的点看作二维点时,你就可以在坐标系中说明这个问题了 现在,要将每个对点与点上方区域中的所有对点连接起来,宽度为点的y坐标。下图给出了两个示例。以这种方式构建区域可确保: 你考虑的点的y坐标是上面所有点的最小值。 点的x坐标差不大于该y坐标。 现在的问题是,我们如何才能快速找到该地区的要点 对于这些类型的查询,通常使用。您可以在logn

给定整数对数组,需要找到对的对数,使对的第一个元素之间的绝对差小于或等于对的第二个元素的最小值

例如:


PS:我原以为时间复杂度比*N上的naive要高。

当你把成对的点看作二维点时,你就可以在坐标系中说明这个问题了

现在,要将每个对点与点上方区域中的所有对点连接起来,宽度为点的y坐标。下图给出了两个示例。以这种方式构建区域可确保:

你考虑的点的y坐标是上面所有点的最小值。 点的x坐标差不大于该y坐标。 现在的问题是,我们如何才能快速找到该地区的要点

对于这些类型的查询,通常使用。您可以在logn上构建一个R树。查询的复杂性取决于查询的选择性,在这个问题上取决于数据分布。如果幸运的话,它是Olog n,但对于每个点,它也可能收敛到On


然而,如果我理解你的意思是正确的,你对所有的对都不感兴趣,只对对对的数量感兴趣。如果是这种情况,您可以向R树页面添加一个计数器,用于存储每页中存储的点数。然后,您不必验证所有点,这些点可以使您更接近每个点的Olog n。

当您将这些对视为二维点时,您可以在坐标系中说明问题

现在,要将每个对点与点上方区域中的所有对点连接起来,宽度为点的y坐标。下图给出了两个示例。以这种方式构建区域可确保:

你考虑的点的y坐标是上面所有点的最小值。 点的x坐标差不大于该y坐标。 现在的问题是,我们如何才能快速找到该地区的要点

对于这些类型的查询,通常使用。您可以在logn上构建一个R树。查询的复杂性取决于查询的选择性,在这个问题上取决于数据分布。如果幸运的话,它是Olog n,但对于每个点,它也可能收敛到On


然而,如果我理解你的意思是正确的,你对所有的对都不感兴趣,只对对对的数量感兴趣。如果是这种情况,您可以向R树页面添加一个计数器,用于存储每页中存储的点数。这样,您就不必验证所有可以使您更接近每个点的Olog n的点。

您的对是坐标。把他们当作职位

对于给定的坐标x,y,匹配的坐标形成一个圆锥体,从x轴凸出,直到到达高度y。然后它变成一列,宽度为2y+1,以x为中心,一直到无穷大

因此,现在需要一种方法来计算这样一个区域中的元素,而无需进行任何元素计算

假设你有一张从x,y到x,y的地图,上面和左边的点叫做正方形累积地图。然后计算列部分需要两次查找和一次减法。应该可以在lg n时间左右构建这样一个地图

类似的几何累积计数可用于有效计算三角形或锥形区域中的元素计数。例如,如果我们有一个从k到k的元素映射,x-y>=k,您可以在其中的1次查找中计算三角形中的元素计数,并在平方累积映射中进行3次查找,然后进行2次减法和1次加法

有一个相反方向的对角线累加贴图,现在可以按照上面指定的方式计算圆锥体中的元素数


如果查找需要lgn时间,那么构建这些地图需要lgn时间,那么我们可以简单地迭代其中的每个点n,计算附近点lgn的数量,求和,除以2,因为我们重复计算每个点,我们就有了一个关于lgn的问题解决方案。

您的对是坐标。把他们当作职位

对于给定的坐标x,y,匹配的坐标形成一个圆锥体,从x轴凸出,直到到达高度y。然后它变成一列,宽度为2y+1,以x为中心,一直到无穷大

因此,现在需要一种方法来计算这样一个区域中的元素,而无需进行任何元素计算

假设你有一张从x,y到x,y的地图,上面和左边的点叫做正方形累积地图。然后计算列部分需要两次查找和一次减法。应该可以在lg n时间左右构建这样一个地图

类似的几何累积计数可用于e 高效地计算三角形或锥形区域中的元素计数。例如,如果我们有一个从k到k的元素映射,x-y>=k,您可以在其中的1次查找中计算三角形中的元素计数,并在平方累积映射中进行3次查找,然后进行2次减法和1次加法

有一个相反方向的对角线累加贴图,现在可以按照上面指定的方式计算圆锥体中的元素数


如果查找需要lgn时间,构建这些映射需要lgn时间,那么我们可以简单地迭代其中的每个点n,计算附近点lgn工作的数量,求和,除以2,因为我们重复计算每个点,我们就有了一个关于lgn的问题解决方案。

让我们以不递增的顺序按第二个值对成对进行排序。然后按此顺序遍历这些对。假设当前对具有索引i,并查看所有对j,i,其中j 这可以做到,例如,使用我们可以保留和更新Ologn中每个顶点中的子节点数。 伪代码:

res = 0
sort pairs by second value in non-increasing order
for i = 1 to n
    res += number of elements in BST on interval [pairs[i].first - pairs[i].second, pairs[i].first + pairs[i].second]
    add pairs[i].first to BST   
总体复杂性将显示在*logn上


如果对中的整数值处于打开状态,则BST可以替换为或。

让我们按第二个值按非递增顺序对对对进行排序。然后按此顺序遍历这些对。假设当前对具有索引i,并查看所有对j,i,其中j 这可以做到,例如,使用我们可以保留和更新Ologn中每个顶点中的子节点数。 伪代码:

res = 0
sort pairs by second value in non-increasing order
for i = 1 to n
    res += number of elements in BST on interval [pairs[i].first - pairs[i].second, pairs[i].first + pairs[i].second]
    add pairs[i].first to BST   
总体复杂性将显示在*logn上


如果对中的整数值为开,BST可以被替换,例如,使用或a。

坦白地说,我看不到第一眼就能降低复杂度的调整,但我猜一定有一些基于对排序的小调整,但我不知道复杂度会下降多少。因此-您期望,作为输出,匹配成对值的数组/向量-因此在您的示例中,您会得到[1,0]?不,他想要元素的数量。根据问题,正确的输出为1。如果我找到比二次型更快的东西。如果我这样做了,我会发布一个答案。整数必须是非负的吗?如果5,我真的看不到第一眼就能降低复杂度的调整,但我想一定有一些基于对排序的小调整,但我不知道复杂度会下降多少。所以-你期望,作为输出,匹配成对值的数组/向量-因此在您的示例中,您会得到[1,0]?不,他想要元素的数量。根据问题,正确的输出为1。如果我找到比二次型更快的东西。如果我这样做了,我会发布一个答案。整数必须是非负的吗?如果5与我的计算结果非常相似;但是在红点下面有一个圆锥体对x轴有影响吗?如果红色点为5,5,则10,5,9,4,8,3,7,2,6,1和5,0位于非常相似的匹配圆锥体的一个边缘。我只想到向上匹配,这样可以避免重复。如果圆锥体中红点下方有一个点,那么它会在自己的连接步骤中与红点连接,对吗?对。你还得注意如何处理与你“平等”的事情。我想只有在你左边数数才能避免重复数数?你减少了你必须做的累积功,因为没有更多的对角线,这和我计算的非常相似;但是在红点下面有一个圆锥体对x轴有影响吗?如果红色点为5,5,则10,5,9,4,8,3,7,2,6,1和5,0位于非常相似的匹配圆锥体的一个边缘。我只想到向上匹配,这样可以避免重复。如果圆锥体中红点下方有一个点,那么它会在自己的连接步骤中与红点连接,对吗?对。你还得注意如何处理与你“平等”的事情。我想只有在你左边数数才能避免重复数数?因为没有更多的对角线,所以你减少了你必须做的累积功。我必须承认这是一个更好的可能是这个问题的最优解。我必须承认这是一个更好的可能是这个问题的最优解。
[pairs[i].first - pairs[i].second, pairs[i].first + pairs[i].second]
res = 0
sort pairs by second value in non-increasing order
for i = 1 to n
    res += number of elements in BST on interval [pairs[i].first - pairs[i].second, pairs[i].first + pairs[i].second]
    add pairs[i].first to BST