就地排序半边数据结构

问题描述

我有一个半边的实现,我正在尝试对边进行排序,以使边n + 1是边n对。

设置

我想就地执行此操作以节省内存,但我发现不确定如何解决的理论壁。

让我们假设HE存储在列表中,并且您可以通过自定义getter(例如.Pair().Next())访问其成员。

算法的思想很简单。

for(uint i=0; i<half_edges.size(); i+=2)
{
   swap(half_edges[i+1],half_edges[i].Pair()); // This is pseudo code,assume this works
}

这就是主意,只要将您旁边的他换成您所在位置的对子即可。

现在,您当然需要更新指针,因此,对于最初为$ i + 1 $的货币对和HE,您都必须经历以下繁琐的过程:

    faces[old_pair_face].edge = i + 1;
    verts[old_pair_vert].edge = i + 1;
    edges[old_pair_prev].next = i + 1;
    edges[old_pair_next].prev = i + 1;
    edges[i].pair = i + 1;

    faces[old_other_face].edge = old_pair_index;
    verts[old_other_vert].edge = old_pair_index;
    edges[old_other_prev].next = old_pair_index;
    edges[old_other_next].prev = old_pair_index;
    edges[old_other_pair].pair = old_pair_index;

基本上只是更新所有指向原始2个元素的指针。

错误

上面的ALMOST起作用。但是,请考虑以下情况。假设我们在边缘i处。这对ijnext的{​​{1}}是j

因此i+1i + 1交换,因此一对j现在位于i。然后,您想更新指向i + 1的{​​{1}},因此在这种特定情况下,交换会无意间使next指向您自己。这是无效的,因为“半边”不允许边指向自身。

这种情况很少见,所以花了我一段时间才找到,但这显然是我的逻辑上的错误

问题是,考虑到已经实现的半边,如何在O(1)内存中排序其边,使n和n + 1成对,同时避免上述陷阱?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)