这是使用C/C 创建和存储周期的最好的选择

Which is the best away to create and store cycles using c/c++?

本文关键字:存储周期 选择 创建      更新时间:2023-10-16

哪个是使用C/C ?

创建和存储周期的最好的选择

我有结构:

struct CYCLE {
    vector<Arc> route;
    float COST;
}
struct Arc {
    int i, j;
    Arc () {};
    Arc (const Arc& obj): i(obj.i), j(obj.j) {};
    Arc(int _i, int _j) : i(_i), j(_j) {}    
};

要存储已经创建的周期,我考虑使用:

vector<CYCLE> ConjCycles;

对于创建的每个周期,我需要验证是否尚未将此周期添加到conjcycles中。周期:1-2-2-1;与周期相同:2-2-1-2。如何检测到这些周期相同?我考虑过使用地图来控制这一点。但是,我不知道如何为周期设置钥匙,因此上述两个周期具有相同的键。

您的周期表示中有很多冗余,e。G。对于一个周期1-3-2-4-1

{ (1, 3), (3, 2), (2, 4), (4, 1) }

如果我们将周期视为循环图,则将边缘存储在数据结构中。存储顶点的效率更高:

struct Cycle
{
    std::vector<int> vertices;
};

您从vertices[n]vertices[n + 1]中隐式获得的边缘;最后一个顶点始终与第一个顶点相同,因此请勿明确存储,最后一个边缘将是vertices[vertices.size() - 1]vertices[0]

请注意,这只是内部表示;您仍然可以从一个边序(Arc s(构建周期。您很可能会在构造函数中检查序列,并可能会引发异常,如果它是无效的(但是,如果您不喜欢异常,则有其他选择...。(。

(。

然后您需要某种等价。我的主张是:

  1. 如果顶点的数量不相等,则循环不能相等。
  2. 它可能会缩短其余算法(但必须对此进行评估!(,如果您计算每个顶点ID的出现数量,则必须匹配
  3. 搜索每个周期的最小顶点ID,从此开始,比较每个后续的值,如果达到末端,则在向量中包裹。
  4. 如果序列匹配,则完成;但是,这尚未涵盖有多个最低值的情况。如果发生这种情况,您可能只需在一个周期中重复尝试下一个最小值的步骤,而在另一个周期中保持相同。您可能会尝试与Maxima并行执行相同的操作,或者无论如何您都对它们进行了计数(请参见上文(,使用最小元素的最小值/Maxima。

编辑:进一步改进(受[Scheff]对问题的评论启发的想法(:

我们最好从迄今为止发现的相对最小值中选择某种绝对最小值,而不是重新尝试每个最小值。如果x的后继者小于y的后继,则相对最小x小于相对最小y。如果两个继任者平等,请查看下一个继任者,依此类推。如果您发现多个绝对最小值(如果某些间接后继者等于最初的最小值(,则您将有一个序列某些子周期重复自身多次(1-2-3-1-2-3-1-2-3(。然后没关系,您选择哪个"绝对" ...

不过,您肯定会跳过步骤2。

在构造函数中找到最低限度并将其存储。然后比较变得容易,您只需以两个周期的速度以各自的最低限度开始...