问候Overflowers,
- 我们的算法需要接收一个
查询DAG结构和输出
满足该命中的命中列表
曲线图。
- 图中的每条边指向a
唯一的对象列表
过滤。
- 每个对象都有两个值,比如HEAD
和TAIL。
- 通过有向边连接节点
在图中类似于HEAD和TAIL
这些物品。
- 例如,查询DAG为三
连接的节点需要两个对象
(每个边缘列表中的一个)在哪里
一个人的HEAD等于另一个人的TAIL。
- 等等更复杂的DAG
查询。
- 因此,算法的作用是
返回所有可能的对象
实现这一目标的排列
HEAD / TAIL共享(相等)
标准。
- 一次点击就是可能的
此类对象的排列列表。
我们目前的解决方案如下:
- 按HEAD / TAIL排序,然后按顺序列表
按长度递增(最短
第一)。
- 迭代来自的对象
最短的清单。
- 二进制搜索下一个对象
共享HEAD / TAIL值的列表
与最后一个对象
搜索列表直接连接到
它。
- 如果列表中不存在此类对象,
回到上一个列表并尝试
将其下一个对象排序。
- 如果下一个对象与其匹配
边缘/列表标准,我们继续前进
再次,否则我们回去等等
上。
- 如果我们达到最长的名单,那么我们
受到所有人的打击
每个列表中与之匹配的对象
整体DAG标准。
- 返回上一个列表并尝试
直到我们到达底部
第一个最短的清单。
如您所见,我们只需在线程之间均匀划分第一个列表。
但是,这可能导致不同线程上的负载不平衡。
因此,搜索列表的顺序可能会影响性能。
我们选择使用最短到最长的跳跃,以便在我们到达更长的列表之前检测到未命中,我们尝试线性而非二进制。
如果我们选择最长到最短,我们可以实现完美的平衡,但总是必须完全迭代影响性能的最长列表。
你觉得这个平衡是什么?
这是一个标准的算法问题,有一个我可以google的名字吗?
是否可以同时遍历可以实现更好性能的DAG?
非常感谢!