二叉图(高级数据结构)

一、定义

二叉图(Binary-Map),一种C++14规范中引入的高级数据结构。其集合了二叉树和图论的优点,在世界算法数据结构大会上由斯茂·斯迪尤德恩特首先提出。 
  二叉图在形式上类似于二叉树,其实现类似于图论(在下面的代码中有介绍)。由N个点,E条边构成,E在等于N-1时二叉图的复杂度退化为二叉树,其主要特征是二叉图的深度为depth以下的点中可以以图的方式两两连接,并忽略其中边权,直接理解为两点重合,从而达到以二叉形式实现连通环的目的。 
  其形式近似于完全连通的杨辉三角或子节点重合的完全二叉树,在时间操作上遍历可以达到O(nlog1/n)的极低复杂度。适用于LCA查询任意点,在实现大规模数据时建树复杂度近似级数求和。 
  虽然称作二叉,但其实际上是图论适用的内容,广泛适用于各大领域,在优化近似堆维护SPFA等算法上都有应用。 
  完全二叉图和满二叉图的原理类似,但极易由于数据退化,因此这里不作探讨。 
  在NOIP2013初赛第九题中命题组首次引入了此概念。



二、STL实现

binary_map<pair<int,int> > q;

q.push_back(make_pair(u,v))//建边
q.push_front(make_pair(u,v))//建边
这两个都是建边,但是可能导致遍历的方式不同

q.find_root()//return 图的根节点
q.size()//return 图的大小
q.get_depth()//return 图的深度
q.empty()//如果图为空,return false,否则,return true;

q.top()//return 是pair<int,int>型的边
q.back()//return 是pair<int,int>型的边
区别同push_back与push_front

q.pop()//根据前序遍历弹出第一个点
q.back_pop()//根据后序遍历弹出第一个点

q.begin()//return iterator型的指针,返回第一个数据
q.end()//return iterator型的指针,返回最后一个数据

q.__lca(int x,int y)//return a与b的最近公共点

priority_binarymap<pair<int,int> >q;

由于优先二叉图具有的性质类似于优先队列,内部用斐波那契堆维护,不过只能从一头取出元素。
q.push(make_pair<u,v>);//将一条边放入堆内
q.top();//返回边权值最小的一条边,返回的类型是pair<int,int>
q.pop();//弹出堆顶的元素
q.empty();//如果图为空,则返回false,否则,返回true

同时与优先队列相同,也有小根堆
priority_binarymap<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> >


三、二叉图的应用

这里需要先引进一个概念,二叉图的重心。 
该重心的概念是和该数据结构同时在大会上提出的,重心的概念类似于信息学中的数据结构的树的重心。 
其主要意义出自于其几何概念,实现由C++的标准库进行。 
二叉图的重心通过深度优先搜索来遍历,从而实现了该二叉图边权的中心搜索,在最大流和二叉图对称完备匹配中有广泛的应用。

struct node
{
    int lc,rc;
    int value;
}binary_map[N];
int dis[N][N];
void dfs(int root)
{
    int lc,int rc;
    if(binary_map[root].lc)
    lc+=dfs(binary_map[root].lc)+dis[root][binary_map[root].lc];
    else
    return 0;
    if(binary_map[root].rc)
    rc+=dfs(binary_map[root].rc)+dis[root][binary_map[root].rc];
    else
    return 0;
    binary_map[root].value=lc+rc;
}
遍历binary_map中,求lc与rc比例的中间值

时间: 2024-07-30 05:29:37

二叉图(高级数据结构)的相关文章

c++实现二叉搜索树

自己实现了一下二叉搜索树的数据结构,记录一下: #include <iostream> using namespace std; struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int value) { val=value; left=NULL; right=NULL; } }; class SearchTree{ public: SearchTree(); ~SearchTree(); void Dest

c语言实现 非递归先序遍历二叉链树

1 #include<stdio.h> 2 #include<conio.h> 3 #include<malloc.h> 4 typedef char datatype; 5 typedef struct node{ 6 datatype data; 7 struct node *lchild,*rchild; 8 }bitree; //二叉链树数据结构定义 9 void Preorder(bitree *p) //先序遍历算法 10 { 11 bitree *Stac

c语言实现按层次(广度优先)非递归遍历二叉链树

1 #include<stdio.h> 2 #include<conio.h> 4 #include<malloc.h> 5 typedef char datatype; //字符类型 内容 6 typedef struct node{ //二叉链树数据结构 7 datatype data; 8 struct node *lchild,*rchild; 9 }bitree; 10 bitree *CreatTree(){ //上一篇的建立二叉链树的函数和这里的一模一样,

二叉搜索树的实现源码(源码较长,请慎入)

实现二叉搜索树的一种好方法是利用二叉树抽象数据类型. 我们以BisTree这个名称来代表二叉搜索树这种数据结构.通过typedef方式将BisTree(二叉搜索树)实现为BiTree(二叉树)的别名. 采用typedef方法使得二叉搜索树具有了某种程度的多态能力,如同栈和队列一样.这意味着除了专属于二叉搜索树的操作外,还可以在其上执行属于二叉树的操作. 数据结构AvlNode代表树中的结点,AvlNode包含3个成员: data是存储在结点中的数据:hidden用来标识结点是否已经移除:fact

高级数据结构:优先队列、图、前缀树、分段树以及树状数组详解

优秀的算法往往取决于你采用哪种数据结构,除了常规数据结构,日常更多也会遇到高级的数据结构,实现要比那些常用的数据结构要复杂得多,这些高级的数据结构能够让你在处理一些复杂问题的过程中多拥有一把利器.同时,掌握好它们的性质以及所适用的场合,在分析问题的时候回归本质,很多题目都能迎刃而解了. 这篇文章将重点介绍几种高级的数据结构,它们是:优先队列.图.前缀树.分段树以及树状数组. 一.优先队列 1.优先队列的作用 优先队列最大的作用是能保证每次取出的元素都是队列中优先级别最高的,这个优先级别可以是自定

数据结构-二叉搜索树(BST binary search tree)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left.right.parent,分别指向节点的左孩子.右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

C++实用数据结构:二叉索引树

看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次query操作的最坏的时间复杂度为O(n),在n较大时速度较慢.用前缀和也不能提高效率(每次add操作最坏为O(n)).有一种数据结构,可以在O(n)时间里初始化,用O(logn)的速度执行add操作或查询前缀和,从而执行query操作. 首先,我们来介绍“lowbit”.对于一个数x,lowbit(x