我需要找到一个算法,该算法根据大小为n
的给定点S
计算凸包。
我知道来自S
的正好6点形成了凸包。
计算此功能的最佳和最有效的方式是什么?
我考虑过从@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public List<Lots> getLotByChantier(@PathParam("id") String id) {
List<Lots> listLots = faL.findAll();
for (Lots lot : listLots) {
if (!lot.getChantier().getId().equals(Long.parseLong(id))) {
listLots.remove(lot);
}
}
return listLots;
}
生成所有可能的点组合(这将是n选择6个点),这将需要O(n ^ 6),然后检查这是否是一个凸包,这将需要O (n)但导致总运行时间非常糟糕。肯定有更好的办法。任何提示?
答案 0 :(得分:5)
如果只有6个点位于凸包上,那么Jarvis March或礼品包装算法将非常有效。它在O(nh)
时间运行,其中h
是凸包上的点数。
答案 1 :(得分:1)
正如已经建议的那样,Jarvis March / Gift-wrapping算法在这种情况下非常快,因为与格雷厄姆扫描中的O(nh)
相比,时间复杂度为O(nlogn)
。
唯一可以更快思考的算法是在O(nlogh)
中运行的Chan算法,但由于h
非常小,因此差异很小。详细了解Chan&#39的算法here。