arrays - 在格上有效地计算邻居的功能

标签 arrays algorithm list data-structures nearest-neighbor

我正在研究 Ising模型,我正在尝试有效地计算函数 H(σ),其中 σ 是 Lx 的当前状态L 格(即 σ_ij ∈ {+1, -1} for i,j{1,2,..., L})。要计算特定 σ 的 H,我需要执行以下计算:

enter image description here

其中 ⟨i j⟩ 表示站点 σ_i 和 σ_j 是最近的邻居并且(假设)J 是一个常数。

几个问题:

  1. 我应该将状态 σ 存储为 LxL 矩阵还是L2 列表?对于 RAM 中的内存访问,一个比另一个更好吗(我想这取决于我访问元素的方式......)?
  2. 无论哪种情况,我怎样才能最好地计算 H

我真的认为这归结为我如何最有效地访问(和操纵)每个状态的邻居。

一些想法:

  1. 我发现,如果我循环遍历列表或矩阵中的每个元素,我将重复计算,那么是否有“最佳”方法返回唯一的邻居?
  2. 是否有我没有想到的更好的数据结构?

最佳答案

你的问题有点宽泛,让我有点困惑,所以如果我的答案不是你要找的,请原谅,但我希望它能有所帮助(一点点)。


在索引方面,数组比列表更快。矩阵是一个二维数组,例如(其中 NM 对您来说都是 L):

enter image description here

这意味着您首先访问 a[i],然后访问 a[i][j]

但是,您可以通过使用一维数组模拟二维数组来避免这种双重访问。在这种情况下,如果您想访问矩阵中的元素 a[i][j],您现在可以这样做,a[i * L + j]

这样你加载一次,但你乘以并添加你的变量,但在某些情况下这可能仍然更快。


现在关于最近邻问题,您似乎使用的是 square-lattice Ising model ,这意味着您在二维空间中工作。

低维度最近邻搜索的一个非常有效的数据结构是 kd-tree .该树的构造需要 O(nlogn),其中 n 是数据集的大小。

现在应该考虑构建这样一个数据结构是否值得。

PS:有很多库实现了 kd-tree,例如 CGAL。

关于arrays - 在格上有效地计算邻居的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47425686/

相关文章:

php - 从两个相似的 MySQL 结果集创建数组时行为不一致

javascript - 按多个属性对多维数组进行排序

python - 如何从这两个列表列表中删除出现在两个列表列表中的可能列表?

在单个时钟周期内执行的verilog中的余数运算算法

CSS - 不使用绝对定位和 JS 的水平样式列表

Java 8 : Merging two Lists containing objects by key

javascript - 在 JavaScript 中替换数组键的最佳方法?

javascript - jQuery $.each push(this) 无法正常工作

ruby - 无法通过 gsub 和 ||= ruby​​ 方法解析多个电话号码

algorithm - 我在哪里可以学习如何结合算法和数据结构?