当前位置: 首页 > 知识库问答 >
问题:

二分图中的交叉数

杭涵映
2023-03-14

在二分图中,左边有n个节点,右边有m个节点。节点的顺序是从1到n和从1到m。左边的节点连接到右边的节点。没有连接所有节点。对于例如:

1 is connected to 4

2 is connected to 3

3 is connected to 2

3 is connected to 1

我想知道如何像一些用户提到的那样,通过使用二进制索引树来解决这个问题。我用O(n^2)algo求解,得到Tle。

这不是家庭作业。昨天我学习了BIT,正在寻找一些问题,所以我遇到了这个。告诉我诀窍。请不要写整个程序。

共有1个答案

路昆杰
2023-03-14

按左节点的索引对边进行排序,然后按右节点的索引(对于相等的左索引)对边进行排序。查看右侧节点的索引。图中的每一个交叉对应于一对索引,在这个排序列表中排列不顺。你只需要数数这样的“不按顺序排列”的对就可以了。

将排序列表中右节点的每个索引依次插入到二叉索引树中。在每次插入之后,您可以在O(log(m))时间内找到树中已经有多少较大的索引。因此,整个算法的时间复杂度为O(h*(log(h)+log(m))):O(h*log(h))用于排序,O(h*log(m))用于计算索引倒置次数(这里'h'是边的个数)。您可以使用基数排序或桶排序将其改进为O(h*log(m))。

更新:

正如Android Decoded所注意到的,倒排数问题可以使用基于合并排序的分治算法来解决。详见此处说明。这种方法的时间复杂度O(h*log(h))比使用二叉索引树的复杂度O(h*log(m))要大,但对于边数不大于节点数的稀疏图来说,它需要更少的内存,而且对高速缓存更友好,因此应该更快。

如果在合并过程中消除重复项,合并排序方法的复杂度可以提高到O(h*log(m))。为此,对(value,numberOfInstances)的对应用合并排序,其中相邻的相同值用适当的“numberOfInstances”组合到一个条目中。在最坏的情况下,对于第一个log(m)合并过程没有消除重复,这具有O(h*log(m))的复杂性;则在O(h)时间内快速消除重复项时,可保留多达log(n)次传递。

实现一个二进制索引树,对于给定的键可以返回它在树中的索引,从最大的值开始(最大的一个->索引0,第二大的->索引1,...)。然后在将每个元素插入到树中之后,请求它的索引--这将是排序列表中该元素左边的较大值的数目。

更多细节:二进制索引树可能被实现为搜索树,其每个节点都被后代节点的计数器所增强。不要为重复的元素创建单独的节点,只需为每个元素更新后代节点计数器。当查询某个键的索引时,首先要搜索树中对应于该索引的节点;然后对当前节点的每个祖先的直接右子代的所有计数器求和,包括当前节点本身的右子代,但不包括当前节点在其某些祖先的右侧的所有情况。

 类似资料:
  • 校验者: @peels 翻译者: @Counting stars 交叉分解模块主要包含两个算法族: 偏最小二乘法(PLS)和典型相关分析(CCA)。 这些算法族具有发现两个多元数据集之间的线性关系的用途: fit method (拟合方法)的参数 X 和 Y 都是 2 维数组。 交叉分解算法能够找到两个矩阵 (X 和 Y) 的基础关系。它们是对在两个空间的 协方差结构进行建模的隐变量方法。它们将尝

  • 交叉表图表也称为文本表,以文本形式显示数据。 交叉表图表采用一个或多个维度以及一个或多个度量。此图表还可以显示度量字段值的不同计算,例如总百分比,运行总计等。 例如,如果要查找每个区域中每个细分的销售数量,请考虑数据源:Sample-Superstore。要使用下面的可用订单日期显示每年的数据,请参阅创建交叉表图表的一些步骤。 第1步:将维度订单日期拖到列架中。 第2步:此外,将维度Region和

  • 我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需

  • 试图实施更大规模的井字游戏 这个游戏可以有超过3行和3列 每当发现4个连续的模式(水平,垂直或交叉) 选手是赢家 我已经找到了水平和垂直匹配的实现方法 但是找不到一种方法来识别2d数组中某个字符的交叉模式 考虑下面的二维数组 ` ` 如何检查“*”字符在这个2d数组中是否有四个连续的交叉模式

  • 我有一个列表,可以包含两个自然数或两个以上的列表。每个列表还包含两个整数或两个其他列表,依此类推。e、 i.:[[4,7],[3,5],[9,1]]我需要使用递归来计算树中所有数字的总和,并编写以下代码: 代码不工作,因为它总是将sum返回到12,所以我的问题是,如何使它工作,但仍然使用递归?。我没有正确地识别基本情况吗?