我正在实施一种基于图减少规则的算法。 This video比单词更好地解释算法,但是,为了完成起见,这里有一个快速摘要:
算法在图中运行,其中每个节点有3个边,其中一个边是“主”边。当主边相交时,节点被认为是活动的并且应用缩减规则。值得注意的是,当两个节点交互时,非常接近它们的另一个节点很可能变为活动状态。
我目前正在存储这个图形,没有任何地方感:我只是将新节点附加到缓冲区。这是我正在使用的原始分配策略的代码,在JavaScript中原型:
function Node(type,tag){
var idx = garbage.pop() || memory.length;
memory[idx+0] = type; // Node type (used on readback)
memory[idx+1] = 0; // Port 0 target port
memory[idx+2] = 0; // Port 1 target port
memory[idx+3] = 0; // Port 2 target port
memory[idx+4] = 0; // Port 0 target node
memory[idx+5] = 0; // Port 1 target node
memory[idx+6] = 0; // Port 2 target node
memory[idx+7] = ++next_id; // Unique id
memory[idx+8] = tag; // Tag (used to decide which reduction rule apply)
return idx;
};
在内存中组织此图形的最佳方法是什么,以便最大化这种图形算法的局部性和缓存效率?
答案 0 :(得分:0)
我只知道两种“存储”图表的方法。通过“存储”我的意思是实现。
边缘存储在每个节点的链表中,具有以下所有优点:添加和删除边缘很快,但找到边缘很长。
边缘存储在节点矩阵中,Array [node1] [node2]的值是边的权重。添加和删除节点很长,但找到节点或边缘很快。
使用linked-list方法,只存储存在的内容,使用矩阵方法存储每条边即使它不存在,你必须为它提供一个值。