0

我目前正在对晶格上的物理模拟进行编码,我有兴趣描述这个晶格中的循环,它们是由晶格单元的边缘组成的闭合曲线。我将有关此晶格单元的信息(通过信息我的意思是一个布尔变量,表示边缘是否有价值,用于组成一个循环)在一个 3 维布尔数组中。

我现在正在考虑一个很好的结构来处理这个循环。它们基本上是一个边列表,所以我需要一个类似于 3d 整数向量数组的东西,每个边在我当前的参数化中由 3 个坐标定义。我已经在考虑围绕这个“列表”对象构建一个类,因为我需要计算循环直径的方法,将来可能还会更多。

但是,我绝对不是很清楚我必须这样做的结构选择,我的物理背景在 C++ 方面没有教给我足够的知识。因此,我想听听您对塑造这段代码的建议。我真的很喜欢发现一些新方法来编码这个孩子。

4

1 回答 1

1

你想要两个不同的东西。一个是跟踪所有边缘并允许通过 (int,int,int) 索引快速查找边缘对象(您可能不希望int那里,但类似size_t左右)。这完全独立于您创建这些有序子集的第二个目标。

一般收藏 (1)

由于您的边缘数据库将是稀疏的(即只有少数可能的索引实际上会识别为特定边缘),因此我之前使用 3d 矩阵的建议是不合适的。相反,您可能希望使用散列图查找边。

这有多容易,取决于各个整数的预期大小。也就是说,您能否设法使每个整数不超过 21 位(例如,如果您的整数是short int只有 16 位的值),那么您可以将它们连接到一个已经有std::hash实现的 64 位值。否则,您将不得不实现自己的哈希专业化,例如std::hash<std::array<uint32_t,3>>(这也很容易,并且高度可堆叠)。

一旦你可以散列你的密钥,你就可以把它扔进一个std::unordered_map并完成它。那东西很快

环路检测 (2)

然后,您希望拥有用于识别循环的短期数据结构,因此您需要一种在一端扩展但从不在另一端扩展的数据结构。这意味着如果您有非常大的实例,您可能对 anstd::vector或可能对 anstd::deque没问题(但请先尝试向量!)。

我建议简单地将索引保持在本地向量的边缘。您始终可以在 unordered_map 中查找边缘对象。那么问题是如何表示索引。如果 Int 表示您的整数类型(例如int, size_t, short, ...),那么使用 --- 可能是最一致的,std::array<Int,3>如果整数的类型不同,您将需要一个std::tuple<...>.

于 2013-10-14T10:41:48.680 回答