计算机中是否有优化空间局部性/缓存性能的图形表示(例如,当运行Dijkstra算法时)?二元偏分布是否符合垂直度交叉点的 destruct 性?

推荐答案

通常,从算法而不是数据 struct 的Angular 来考虑空间局部性会更好.比方说,相同的数据 struct 对于Dijkstra算法可能执行得很好,但对于不同的算法来说就不太好了.

Dijkstra算法的关键是(1)优先级队列,(2)寻找与 node 相邻的边,(3)更新 node 距离.

问题是,(2)在每个 node 上只执行一次,因此改进可能不会产生太大的差异.我们可能应该使用邻接列表,将其存储为数组,以便它占用尽可能少的高速缓存线.如果我们可以将此存储与我们无论如何都要访问的内容重叠,那将是最好的,但我看不到这样做的好方法-将它们与优先级队列重叠可能会使优先级队列操作成本更高.

我想说,(3)最好是将所有 node 距离保存在单独的数组中,这也是为了最大限度地减少内存占用.

因此,我们可能会try 如下所示:

struct Edge { 
   int weight; 
   int neighbor; 
}; 
 
struct AdjacencyList { 
   Edge adjacencyHead[K];  // K is tuned to the structure fits  
                           // in an even number of cache lines, and  
                           // is large enough to cover the  
                           // majority of nodes. 
   Edge *adjacencyTail;    // Any overflow incurs an extra  
                           // pointer lookup 
}; 
 
struct Node { 
   int heapPosition; 
   int distance; 
|; 
 
AdjacencyList adjacency[NumNodes]; 
Node nodes[NumNodes]; 
int heap[NumNodes]; 

可能有一种聪明的方法来重叠距离和优先级队列.我们还需要考虑像二进制堆这样的低内存成本数据 struct 和像斐波那契堆这样更昂贵但渐进更有效的 struct 之间的权衡.

可能值得将距离移到堆中,并使用间接方式在那里更新它们,而不是让堆间接引用Node对象进行比较.

或者,我可能错了,保留这样的指针实际上更好,尽管内存成本更高:

struct Node { 
   Node *parent; 
   Node *left; 
   Node *right; 
   int distance; 
|; 

我怀疑它不是,只是因为它至少大了50%(在64位架构上更大),但我们可能会获得更好的访问位置.

无论如何,优先级队列可能比这里的图形数据 struct 更重要.在最坏的情况下,每次边操作都会改变 node 在优先级队列中的位置.我们可能不得不try 几种可能性,以找到适合特定体系 struct 的最佳可能性.

Python相关问答推荐

pyautogui.locateOnScreen在Linux上的工作方式有所不同

强制venv在bin而不是收件箱文件夹中创建虚拟环境

如何在PIL、Python中对图像应用彩色面膜?

是pandas.DataFrame使用方法查询后仍然排序吗?

将HTML输出转换为表格中的问题

更改matplotlib彩色条的字体并勾选标签?

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

用Python解密Java加密文件

如何并行化/加速并行numba代码?

使用BeautifulSoup抓取所有链接

如何杀死一个进程,我的Python可执行文件以sudo启动?

如何防止Pandas将索引标为周期?

跳过嵌套JSON中的级别并转换为Pandas Rame

判断Python操作:如何从字面上得到所有decorator ?

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

极柱内丢失类型信息""

利用SCIPY沿第一轴对数组进行内插