【问题标题】:Need a cache friendly data structure to store the neighbors of a letter in a 2d-array需要一个缓存友好的数据结构来将字母的邻居存储在二维数组中
【发布时间】:2012-03-04 10:12:17
【问题描述】:

假设以下是我们正在操作的二维数组

a b c d
e f g h
i j k l
m n o p

'f' 的周围邻居是 [a b c e g i j k]。我正在尝试创建一个缓存友好的数据结构来存储节点的邻居。现在我有类似的东西

struct Neighbor{
   size_t neighborPosition[8][2];
   size_t size;
};

typedef size_t Position[2];
typedef Neighbor** NeighborTable;

请注意,一个节点可以拥有的最大邻居是 8。有人有什么建议吗?我需要结构是一个恒定时间的邻居查找,所以我将预先计算每个节点的邻居。

【问题讨论】:

  • 如果你有一个已知尺寸的规则网格,那么最适合缓存的表示是预先计算邻居。您仍然可以在恒定时间内计算邻居,并且可能会比查找答案更快。
  • 我同意@JohnCalsbeek。这在图像处理中很常见。例如,用于在图像中查找对象。
  • 是的,分支仍然比等待从主内存读取要好得多......如果它在行缓存中,那么查找可能没问题,但这意味着你的表不是这样大,那为什么要优化呢?
  • @JohnCalsbeek:网格大小可以变化。这是一个boggle求解器程序。因此,如果我不预先计算它,那么我将不得不多次计算节点的邻居
  • 但是,网格大小是已知的。描述网格大小的单个数据比邻接列表更容易保存。如果您试图使这种缓存友好,那么您只想存储大小并重新计算邻居(进入内存比当前架构上的计算慢几个数量级)。但是,对于 Boggle,如果您以任何一种方式衡量性能差异,我都会感到震惊。只做产生最少代码的事情。

标签: c++ c performance caching optimization


【解决方案1】:

就相对位置而言,每个单元格都具有相同的邻居,但边缘单元格除外。但是如果你添加一个边框(在开始和结束处额外的行和列),并用一个让你知道它是一个边框的值填充它,你根本不需要任何数据结构来识别邻居。

【讨论】:

  • 这不是一个坏主意,我可能会尝试,但是有一个列表会更方便
猜你喜欢
  • 2015-03-09
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多