首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用STL在C++中实现宾利-奥特曼

用STL在C++中实现宾利-奥特曼
EN

Stack Overflow用户
提问于 2016-05-08 15:47:43
回答 1查看 987关注 0票数 1

我想在此描述的基础上,利用STL元素实现Bentley-奥特曼线段交叉算法.宾利-奥特曼维基百科

我正在挣扎的是优先级队列的实现。描述要求我删除任何交叉点:

如果p是线段s的左端点,则将s插入T中。找到T中紧接s以下和s以上的分段r和t(如果它们存在),如果它们的交叉在事件队列中形成了潜在的未来事件,则将其移除。如果s跨越r或t,则在事件队列中添加这些交叉点作为潜在的未来事件。

使用STL优先级队列作为事件队列似乎是不可能的,因为它的搜索复杂度是线性的,我需要查找和删除任何s和t的交叉。我应该使用集合吗?或者,是否可以使用优先级队列?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-08 16:03:18

您可以快速删除优先级队列结构,但它们将需要大量额外的内存。

实际上,将r-t交集留在队列中更有效。然后,当需要处理事件时,如果事件无效(因为r和t不相邻)或者已经完成了,就忽略它。

为了检测r-t何时已经完成,只需确保您的优先级队列是按总顺序排序的,也就是说,不要仅仅比较事件的x值。当多个事件具有相同的x值时,请使用所涉段的标识符来断开连接。然后,当r-t多次出现在队列中时,所有的事件都会在一起,您可以按顺序将它们全部弹出。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37101730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档