C++ 从二维坐标列表(向量)中提取上边界和下边界
我的程序包含多边形,多边形的形式为包含点的向量(二维双坐标,存储在自制结构中)。我正在寻找一种快速找到包含多边形的最小正方形的方法(即知道所有点的最大和最小坐标)C++ 从二维坐标列表(向量)中提取上边界和下边界,c++,sorting,C++,Sorting,我的程序包含多边形,多边形的形式为包含点的向量(二维双坐标,存储在自制结构中)。我正在寻找一种快速找到包含多边形的最小正方形的方法(即知道所有点的最大和最小坐标) 有没有比解析所有点并存储最小值和最大值更快的方法?我不确定是否有比线性时间更快的方法在值数组中查找最小值和最大值。我能想到的唯一“优化”是在迭代数组的其他情况下(填充数组/在所有点上执行函数)找到这些值,然后对任何数据更新进行检查。您描述的算法很简单:迭代所有点,并找到每个坐标的最小值和最大值。这是一个O(n)算法,n是你拥有的点数
有没有比解析所有点并存储最小值和最大值更快的方法?我不确定是否有比线性时间更快的方法在值数组中查找最小值和最大值。我能想到的唯一“优化”是在迭代数组的其他情况下(填充数组/在所有点上执行函数)找到这些值,然后对任何数据更新进行检查。您描述的算法很简单:迭代所有点,并找到每个坐标的最小值和最大值。这是一个O(n)算法,n是你拥有的点数 你不能做得更好,因为你至少需要检查你所有的点一次,否则最后一点可能在你找到的方格之外
现在,复杂度充其量是O(n),所以你只需要最小化常数因子,但在这种情况下,它已经很小了:在向量上只有一个循环,寻找两个最大值和两个最小值。你可以迭代所有点,找到最大值和最小值,或者做一些预处理,例如,将您的积分存储在treap()中。
没有任何预处理方法比只对所有点进行迭代更好。我对此表示怀疑,除非你可以缓存边界框和/或在构建多边形时迭代计算。不,我不这么认为。你可以看看std::minmax\u元素,它比minu元素+max\u元素稍微好一点。