Algorithm 按需求查找矩阵位置

Algorithm 按需求查找矩阵位置,algorithm,matrix,diagram,Algorithm,Matrix,Diagram,我有一个关于矩阵的问题 有一个矩阵和一个段列表。 每个段都有一个名称、一个起点或终点以及一个值,用于描述起点和终点是指矩阵的行还是列 可以有多个具有相同名称(但起点和终点不同)的线段 现在我们有了一张名单(a、b、c) 任务是找到每个矩阵位置(x,y)的位置适合 输入具有列表名称的每个段的范围(起点和终点) 最快的方法是什么 我需要它来确定逻辑表达式在KV图中的位置。如果同名的区间没有重叠,那么很容易找到一个复杂度为O(r*c*n)的算法。r=#行,c=#列,n=#名称 用0初始化r*c计数矩

我有一个关于矩阵的问题

有一个矩阵和一个段列表。 每个段都有一个名称、一个起点或终点以及一个值,用于描述起点和终点是指矩阵的行还是列

可以有多个具有相同名称(但起点和终点不同)的线段

现在我们有了一张名单(a、b、c)

任务是找到每个矩阵位置(x,y)的位置适合 输入具有列表名称的每个段的范围(起点和终点)

最快的方法是什么



我需要它来确定逻辑表达式在KV图中的位置。

如果同名的区间没有重叠,那么很容易找到一个复杂度为O(r*c*n)的算法。r=#行,c=#列,n=#名称

  • 用0初始化r*c计数矩阵

  • 对于每个名字

  • 对于名称为的每个间隔

  • 将间隔内计数矩阵的所有值增加1

  • 迭代计数矩阵并返回count==n的所有单元格


  • 如果具有相同名称的间隔不重叠,那么您必须增加每个名称n的最多r*c值,因此复杂性为O(r*c*n),最后一步中的+r*c无关紧要。

    您可以通过首先“压缩”相邻相同占用的行,以及类似的列,来加速这一过程,可能会加快很多。这可以在O(m log m)时间内完成,方法是对所有段的垂直端点进行排序,然后对列进行相同的排序(使用水平端点),如果m是段数,则留下一个矩阵,其大小现在最多为2m×2m。(因为每个名字可以描述很多段,我想你的算法的时间复杂度也需要一个“m”。@j_random_hacker这并不容易,因为你必须对每一列和每一行都这样做,间隔还有一个额外的维度。如果具有相同名称的段没有重叠,则段数无关紧要,这意味着每个名称最多有r*c段,但每个段只覆盖一个单元格。关于非重叠名称,您是对的,这意味着您的时间复杂性不需要m,抱歉。也许我解释得不是很好,但是压缩相同列的水平间隔和相同行的垂直间隔确实可以让您摆脱r和c——对于每个这样的压缩间隔,您可以记录原始大小(行数或列数),因此,现在矩阵中的每个单元格都对应于原始矩阵中的一个矩形(其所有单元格都将根据您的算法接收相同的计数)。