用STL在C++中实现Bentley-Ottmann
Implementing Bentley-Ottmann in C++ using the STL
我想在这个描述的基础上,使用STL元素来实现Bentley-Ottmann线段交叉算法。Bentley Ottmann维基百科
我正在努力实现优先级队列。描述要求我删除任何交叉点:
如果p是线段s的左端点,则将s插入T中。找到T中s正下方和正上方的线段r和T(如果存在),如果它们的交叉点在事件队列中形成潜在的未来事件,则将其删除。如果s与r或T交叉,则将这些交叉点添加为事件队列中的潜在未来事件。
似乎不可能使用STL优先级队列作为事件队列,因为它的搜索复杂度是线性的,我需要找到并删除s和t的任何交叉点。我应该用一套吗?或者使用优先级队列是否可行?
有一些优先级队列结构可以快速删除,但它们需要大量额外的内存。
实际上,只将r-t交叉点留在队列中更有效。然后,到了处理事件的时候,如果它无效(因为r和t不相邻)或已经完成,就忽略它。
为了检测r-t何时已经完成,只需确保您的优先级队列按总排序排序,即不要只比较事件的x值。当多个事件具有相同的x值时,请使用所涉及的段的标识符来断开连接。然后,当r-t在队列中多次出现时,所有的出现都将在一起,您可以按顺序将它们全部弹出。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 用STL在C++中实现Bentley-Ottmann