等价结点

1. 等价结点

在有向图中,若结点u到结点v之间有一条边,则称u为v的一个父节点,v是u的孩子结点,显然在图中结点可具有多个父节点与多个孩子结点。当结点u与结点v的孩子、父亲完全相同时,称u与v为等价结点。

2. RPC方法

该方法的核心思想为将结点按照其邻居结点进行排序,若两个节点为等价结点则两个结点在排序结果中必然相邻。

2.1 排序

先按照父结点进行排序,若两个结点父结点相同需继续判断孩子结点,若孩子结点也相同,则两个结点相等。

令结点u的父结点Fu = {f1,f1…},孩子结点Cu = {c1,c2…},结点v的父结点Fv = {f1’, f2’…},孩子结点Cv = {c1’, c2’…},其中每个结点的孩子与父亲均为从小到大的顺序。

父结点比较:

Fui表示结点u的第i个父结点,同理Fvi表示结点v的第i个孩子;Cui与Cvi分别表示结点u与v的第i个孩子结点。令i = 0,

(1) 若i同时大于结点u与v的父结点的个数,则u = v,比较结束;

(2) 若i大于结点u的父结点的个数,则u <v,比较结束;

(3) 若i大于结点v的父结点的个数,则v> u,比较结束;

(4) 若Fui > Fvi,则u > v;

(5) 若Fui < Fvi,则u < v;

(6) 若Fui = Fvi,则i++,返回(1)。

孩子结点比较与父结点比较类似。

2.2 查找等价类

令2.1中排序结果R = {a,b, c, d, e…},令ri为R中第i个结点。令i = 0,

(1) 若i > |V| – 1,其中V是图中的结点,运行结束;

(2) 若ri与ri+1的父亲与孩子结点完全相同,则结点ri与ri+1等价;反之ri与ri+1不等价。返回(1)继续执行。

参考:基于图压缩的k可达查询处理(软件学报2014)

时间: 2024-08-09 06:34:29

等价结点的相关文章

时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和做法. 如图所示,删除结点 i,那么只需找到 i 的前驱 h,然后连 h 到 j,再销毁i 即可.虽然可以安全的删除 i 结点,但是是顺序查找找到 i,之后删除,时间复杂度是 O(n)级别的.具体做法就是:顺序查找整个单链表,找到要删除结点 i 的直接前驱 h,把 h额 next 指向i 的 nex

树上某点距离最远的结点

题目链接 题目需要得到树上每个结点出发可到达的最远的结点,顺便求出树的直径. 这里顺便总结一下求解的两种方法. 第一种思路:三种dfs(bfs) 第一遍dfs(bfs)从任意结点出发,找到距离该结点最远的结点u(直径的端点之一). 第二遍dfs(bfs)从u出发,求出其他点到u的距离,最长的即为v(直径的另一个端点). 第三遍dfs(bfs)从v出发,求出其他点到v的距离. 可以知道,对于任意结点x,其在树上可到达的最远的距离为max{dist[x][u], dist[x][v]}. 故其最大值

O(1)时间删除链表的已知结点

这题并不需要从头结点遍历到已知结点,只需要知道已知结点,将改结点下一个结点赋值给它,再删除这个下一个结点就行,其中还需要考虑各种情况. 1)链表为空或者已知结点为空 2)链表只有一个结点,这个结点就是要删除的已知结点 3)要删除的已知结点在链表的末尾,此时就不能将下一个结点复制过去,我们就需要采用传统方法了.从头结点遍历找到该节点的上一个结点 #include "stdafx.h" #include <iostream> using namespace std; typed

【LeetCode】222. Count Complete Tree Nodes-完全二叉树的结点个数

一.描述: 二.思路: 完全二叉树: 对于整棵二叉树,从根结点出发,一直沿左下方向遍历树的深度是l,一直沿右下方向遍历的深度是r:则有两种情况: 1.l == r,左右深度相等,一定是完全二叉树,即满二叉树,结点个数为(2^l-1)或(2^r-1): 2.l != r,只有一种情况:在二叉树的倒数第二层,某个父结点只有左叶子结点而无右叶子结点,及l=r+1.等价的说,将这一个多余的左叶子结点去掉的话,则每棵最小的二叉树(一共3个结点)都是满二叉树,即又回到了上述情况1,最后再加1即为总叶子结点:

lintcode:等价二叉树

等价二叉树 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等. 样例 1 1 / \ / 2 2 and 2 2 / / 4 4 就是两棵等价的二叉树. 1 1 / \ / 2 3 and 2 3 / 4 4 就不是等价的. 解题 树的结构相同,结点值相等 直接递归 /** * Definition of TreeNode: * public class TreeNode { * public int val; * public Tr

B树和B+树的增/删结点(转)

add by zhj: 算法其实不复杂,尤其是增加结点的算法,逻辑很简单,但有时自己想不到. 增加结点算法:首先,对于B树,没有重复结点,所以新插入的数据一定会落在叶结点上,或者说落在叶结点的所有父结点切分成的开区间上. 不断的增加结点时,一定会有某个开区间的关键字个数先达到上限数+1,这时需要对该叶结点拆分,以中间值为拆分点,拆分为两个叶结点, 且中间值上移到父结点.然后判断父结点的关键字个数,如果也达到上限数+1,再次进行拆分.一直循环,直到某个父结点的关键字个数<=关键字 个数上限,循环结

等价表达式(codevs 1107 答案错误)

题目描述 Description 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题.假设你是明明,能完成这个任务吗? 这个选择题中的每个表达式都满足下面的性质:1.表达式只可能包含一个变量‘a’.2.表达式中出现的数都是正整数,而且都

c语言:建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据

建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据. 解:将第1个结点的起始地址赋给头指针head,将第2个结点的起始地址赋给第1个结点的next成员,将第3个结点的起始地址赋给第2个结点的next成员.第3个结点的next成员赋予NULL,这就形成了链表.为了建立链表,使head指向a结点,a.next指向b结点,b.next指向c结点,c.next=NULL的作用是使c.next不指向任何有用的存储单元. 程序: #include<stdio.h> struct Stud

关于二叉树结点数目的计算

对于任意一个二叉树,其叶子结点的数目为n0,而其度数为2的结点数n2,则n0=n2+1. 证明,对于此二叉树: 设其度数为1的结点数为n1.      从下往上看,每个结点都有一个边朝上,除了根结点,则边总数为:N=n0+n1+n2-1   ①    从上往下看,度数为2的结点有两个边,度数为1的结点有1个边,度数为0的结点有0个边,则边总数为:N=0*n0+1*n1+2*n2  ② 联立① ②,知:n0=n2+1