在Graph中,存在
triangular strip问题.基本上,我们有一组相邻的三角形,我们想要将每个三角形视为一个新的顶点,如果它们后面的两个三角形有一个共同的边,则两个新顶点之间会有一条边.
我的问题是关于阅读每个三角形并为它们构建新的条形图.
例如,我们有这些三角形(A,B和C):
A – 0,1,3
B – 1,2,3
C – 2,3,4
因此A和B有一个共同的边缘,B和C也是如此.新的条带从A到B再到C.
好.我认为这里的关键之一是每次读到新三角形时,我们都想知道哪些三角形与新三角形有共同边.
一种愚蠢的方式是我们只扫描所有旧三角形并将它们的三个顶点与新顶点进行比较,如果两个顶点匹配,则存在邻接.
一种更好的方法(在Algorithm Design Manual中描述)是每次我们为每个三角形顶点创建一个列表.该列表包含通过顶点的所有三角形.例如,对于上面的三角形,顶点0具有{A}的列表,顶点1具有{A,B}的列表等.因此,当出现新的三角形时,我们只需要检查3个顶点并尝试查找哪个旧三角形有两个共同的顶点与新的三角形.
这里有一些问题:
>线性更好的方式吗?如何定义这种阅读和构建图形的“线性”?例如,以更好的方式,新三角形需要经过3个旧三角形列表.这是否足够线性?我认为它是线性的,因为它最多只读取所有旧三角形.但如果我的想法是真的,那么愚蠢的方式也是线性的,对吧?所以我想我可能错了,但很困惑.
>会有更好的方法吗?这在Algorithm Design Manual被要求作为消费税,即使在最坏的情况下,消费税也要求纯线性算法.
我的解决方案更好的方法是,不是为每个顶点构建一个列表,而是为每个边构建一个列表.顶点可以有许多三角形通过,但是有一个边,最多会有两个三角形通过,假设所有三角形的边不相互交叉,最多是合并(共同).
然后每个边缘都有一个最多两个项目的列表.对于新出现的三角形,需要检查最多3个边缘.我认为这比上面更好的方式更好.
我对吗?或者我是更好的方式,一个纯粹的最佳线性解决方案?
最佳答案
Is the better way linear?
不它不是.如你所说,是的,将会有三个列表来检查哪个是比愚蠢方式更小的整个旧三角形的空间,但是这些列表的长度随着检查的三角形数量的增长而线性增长.在最坏的情况下,更好的方法具有与多项式的愚蠢方式相同的复杂性(所有三角形共享顶点的情况)
A – 0,1,2
B – 0,2,3
C – 0,3,4
D – 0,4,5
…
关于你对这个问题的解决方案,你是对的,你的是线性的,假设从前面创建的边缘获取边缘是在恒定时间内完成的(需要类似哈希表的结构,而不是列表).
此外,您可以改进自己,只需记住已添加到列表中的边(哈希表?)一次,并删除两次遇到的边(因为假设边只能在两个三角形之间共享)