问题:在保留操作的O(1)算法复杂度的同时,将图的动态邻接列表存储在文件中。
我正在尝试在文件中存储动态双向图。可以添加和删除节点和边缘,并且这些操作必须是O(1)的。我的当前设计如下:
文件1 - 节点
每个节点存储两个整数(插入是追加,删除使用空闲列表):
- 入边数 - 出边数
文件2 - 边缘
每个边缘存储4个整数(插入是追加,删除使用空闲列表+与节点的最后一个边缘交换以更新其新索引):
- 起始节点(指向文件1) - 起始索引(即第三个入边) - 终止节点(指向文件1) - 终止索引(即第二个出边)
文件3 - 链接
作为文件2中边缘位置的开放地址哈希表。当你从文件1读取一个节点时,你知道有x个入边和y个出边。通过这个信息,你可以去文件3中获取每个边缘在文件2中的位置。键值对如下:
- 节点在文件1中的索引(例如第一个节点为0,第二个节点为1) - 0 <= 边缘索引 < 入边数/出边数
如果将文件3的键表示为链式哈希表(不适用于文件,但不需要哈希...)的示例:
我正在使用
在这种情况下,是否有专门的哈希算法或方法可用于
我正在尝试在文件中存储动态双向图。可以添加和删除节点和边缘,并且这些操作必须是O(1)的。我的当前设计如下:
文件1 - 节点
每个节点存储两个整数(插入是追加,删除使用空闲列表):
- 入边数 - 出边数
文件2 - 边缘
每个边缘存储4个整数(插入是追加,删除使用空闲列表+与节点的最后一个边缘交换以更新其新索引):
- 起始节点(指向文件1) - 起始索引(即第三个入边) - 终止节点(指向文件1) - 终止索引(即第二个出边)
文件3 - 链接
作为文件2中边缘位置的开放地址哈希表。当你从文件1读取一个节点时,你知道有x个入边和y个出边。通过这个信息,你可以去文件3中获取每个边缘在文件2中的位置。键值对如下:
- 节点在文件1中的索引(例如第一个节点为0,第二个节点为1) - 0 <= 边缘索引 < 入边数/出边数
如果将文件3的键表示为链式哈希表(不适用于文件,但不需要哈希...)的示例:
Keys (indices from `File 1` + 0 <= index < number of edgesfrom `File 1`, not actually stored)
1 | 0 1 2
2 | 0 1
3 |
4 | 0
5 | 0 1 2
我正在使用
qHash
和QPair
来进行哈希,但是冲突的数量非常高。特别是与单个int
哈希相比,后者使用qHash
非常高效。由于存储的值是指向另一个文件的索引,因此探测成本很高,所以我想减少冲突的数量。在这种情况下,是否有专门的哈希算法或方法可用于
pair of ints
,可以更好地执行?或者当然还有其他方法可以避免这个问题,例如如何实现文件中的链接哈希表(我只能想到使用缓冲区,但我认为这对于像我的稀疏图形来说是过度的)?