这是使用C/C 创建和存储周期的最好的选择
Which is the best away to create and store cycles using c/c++?
哪个是使用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(构建周期。您很可能会在构造函数中检查序列,并可能会引发异常,如果它是无效的(但是,如果您不喜欢异常,则有其他选择...。(。
然后您需要某种等价。我的主张是:
- 如果顶点的数量不相等,则循环不能相等。
- 它可能会缩短其余算法(但必须对此进行评估!(,如果您计算每个顶点ID的出现数量,则必须匹配
- 搜索每个周期的最小顶点ID,从此开始,比较每个后续的值,如果达到末端,则在向量中包裹。 。
- 如果序列匹配,则完成;但是,这尚未涵盖有多个最低值的情况。如果发生这种情况,您可能只需在一个周期中重复尝试下一个最小值的步骤,而在另一个周期中保持相同。您可能会尝试与Maxima并行执行相同的操作,或者无论如何您都对它们进行了计数(请参见上文(,使用最小元素的最小值/Maxima。
编辑:进一步改进(受[Scheff]对问题的评论启发的想法(:
我们最好从迄今为止发现的相对最小值中选择某种绝对最小值,而不是重新尝试每个最小值。如果x
的后继者小于y
的后继,则相对最小x
小于相对最小y
。如果两个继任者平等,请查看下一个继任者,依此类推。如果您发现多个绝对最小值(如果某些间接后继者等于最初的最小值(,则您将有一个序列某些子周期重复自身多次(1-2-3-1-2-3-1-2-3
(。然后没关系,您选择哪个"绝对" ...
不过,您肯定会跳过步骤2。
在构造函数中找到最低限度并将其存储。然后比较变得容易,您只需以两个周期的速度以各自的最低限度开始...
- 将字符串存储在c++中的稳定内存中
- 如何使用默认参数等选择模板专业化
- std::原子加载和存储都需要吗
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何在共享库的整个生命周期内存储数据
- OpenCV:无法从 contrib 存储库中找到模块(跟踪器,选择ROI)
- 这是使用C/C 创建和存储周期的最好的选择
- RocksDB是存储同质对象的好选择吗
- 如何仅从输入文件中"20071406"的数字中选择"2007"的数字并将其存储在变量中?
- C++ Sqlite 选择语句并存储为向量
- 如何存储需要随机选择和删除的数据,矢量,哈希表或其他
- 选择 STL 容器来存储线程
- 从数据库中选择客户端的信息并存储到向量中
- 存储和缓存的选择
- 努力创建一个函数,将用户输入存储到任意选择的向量(使用c++)
- 如何将自定义对象存储在向量中,以便在服务器的生命周期中存储
- 在std::容器中选择存储值还是存储指针时的注意事项
- 对象的存储类型,选择什么更好
- 从存储过程中的tmp表中进行选择
- 需要选择一个容器来存储我的数据