多叉图(高级数据结构)

来源:互联网 发布:北京金税三期软件下载 编辑:程序博客网 时间:2024/06/07 04:48
多叉图(More-Graph),一种C++14规范中引入的高级数据结构。其为二叉图(Binary-Graph)的延伸,在世界算法数据结构大会上由杰诺·恩特在二叉图之后首先提出。 多叉图在形式上类似于二叉图,其实现类似于图论。
多叉图即为二叉图的延伸,采用多次方的数据结构,类似于编程学中的(Recursion)递归、(Iteration)迭代,但究竟是递归还是迭代,世界算法数据结构大会的一些人依然有一些争议。目前主流的两个观点如下,斯茂·斯迪尤德恩特认为,作为递归算法是一种不断反馈,将问题简单化,从繁到简,而迭代是将一个变两个,两个变四个,复杂化了,所以递归才是符合多叉图的变化形式。而杰诺·恩特认为,无论是将问题简单化,还是复杂化,形式上依然是“多叉”的样子,就像把一张图,倒过来看,它本质上依然是这张图片,所以其实无论是(Recursion)递归还(Iteration)迭代,都应该算是多次方的数据结构中的多叉图。




一、定义
多叉图(More-Graph),一种C++14规范中引入的高级数据结构。其为二叉图(Binary-Graph)的延伸,在世界算法数据结构大会上由斯茂·斯迪尤德恩特首先提出。 
多叉图在形式上类似于二叉图,其实现类似于图论(在下面的代码中有介绍)。由N的X次方个点,E的X次方条边构成(设X为N与E之积的最大极限数),当X等于N与E之积,即N与E之积等于N与E之积的最大极限数的时候,图像的长宽之比无限逼近黄金分割比,同样可复杂度退化为二叉图。其主要特征是多叉图的深度为depth以下的点中可以以图的方式跨级连接,并忽略其中边的最高权,直接理解为两点重合,从而达到以多叉形式实现连通环的目的。


二、PHP实现
<?php
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
//        used to display a nice indented tree
function display_children($parent, $level)
{
   // 获得一个 父节点 $parent 的所有子节点
   $result = mysql_query('SELECT name FROM tree '.
                          'WHERE parent="'.$parent.'";');
   // 显示每个子节点
   while ($row = mysql_fetch_array($result))
   {
       // 缩进显示节点名称
       echo str_repeat('  ',$level).$row['name']."n";
       //再次调用这个函数显示子节点的子节点
     
       display_children($row['name'], $level+1);
   }
}
?>;


<?php
// $node 是那个最深的节点
function get_path($node)
{
   // 查询这个节点的父节点
   $result = mysql_query('SELECT parent FROM tree '.
                          'WHERE name="'.$node.'";');
   $row = mysql_fetch_array($result);
   // 用一个数组保存路径
   $path = array();
   // 如果不是根节点则继续向上查询
   // (根节点没有父节点)
   if ($row['parent']!='')
   {
       // the last part of the path to $node, is the name
       // of the parent of $node
       $path[] = $row['parent'];
       // we should add the path to the parent of this node
       // to the path
       $path = array_merge(get_path($row['parent']), $path);
   }
   // return the path
   return $path;
}
?>;


如果对"Cherry"使用这个函数:print_r(get_path('Cherry')),就会得到这样的一个数组了: 
Array
(
  [0] =>; Food
  [1] =>; Fruit
  [2] =>; Red
)


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