如何手绘java程序的树分解(tree-decomposition),或者有什么方法能得到一个java程序的输分解

如问题所述,最好能有个全面点的答案,举个操作实例最好!感谢!
如果完美解决问题,我会追加奖励!

麻烦把问题描述清楚。有没有需求文档。

树分解,属于分解法(Decomposition Method)的一种,也被称为集团树,连接树和连接树,是将图形映射到相关树(Related Tree)的一种方法。它的主要特性是可以有效地计算原始图的某些属性(例如,独立多项式)。 图的树分解不是唯一的,也不需要与原始图同构。树分解常常与树的宽度(Treewidth,简称树宽)的概念联系在一起。在最佳树分解中,映射到任何树顶点的原始图顶点数被称为树宽。

img


如图所示,假设现有图G =(V,E),G的树分解是一对(T,χ),其中T =(N,F)是树,并且χ:N→2V为每个节点分配一组顶点 (称为节点的包),满足以下条件:

1.对于每个顶点v∈V,存在节点i∈N使得v∈χ(i)。

2.对于每一条边(v,w)∈E,存在一个i∈N且v∈χ(i)且w∈χ(i)。

3.对于每个i,j,k∈N:如果j位于i和k之间的路径上,则χ(i)∩ χ(k)⊆ χ(j)。

树分解的宽度定义为maxi∈N| x(i)| -1,并且图的树宽是所有树分解中的最小宽度。

img


AI中的寻路算法主要分盲目式搜索和启发式搜索两种,同图论中的最短路径问题相联系,在图论的数据结构上进行实现。图论中的深度优先搜索算法(DFS)和广度优先搜索算法(BFS)以及Dijksrta最短路径贪心算法都属于盲目式搜索算法。

在AI和概率推理领域中,树分解又称为团树,可以用来提高推理效率,并且给约束满足问题(constraint satisfaction problem)和 NP-hard 问题提供了求解答案,提高了图论在AI方面的效率,比如优化了机器人寻路的方案。
1、准备表结构及对应的表数据

a、表结构:

create tableTB_TREE

(

CID NUMBER not null,

CNAME VARCHAR2(50),

PID NUMBER //父节点

)

b、表数据:

insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0);

insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1);

insert into tb_tree (CID, CNAME, PID) values (3, '广东省', 1);

insert into tb_tree (CID, CNAME, PID) values (4, '上海市', 1);

insert into tb_tree (CID, CNAME, PID) values (5, '广州市', 3);

insert into tb_tree (CID, CNAME, PID) values (6, '深圳市', 3);

insert into tb_tree (CID, CNAME, PID) values (7, '海珠区', 5);

insert into tb_tree (CID, CNAME, PID) values (8, '天河区', 5);

insert into tb_tree (CID, CNAME, PID) values (9, '福田区', 6);

insert into tb_tree (CID, CNAME, PID) values (10, '南山区', 6);

insert into tb_tree (CID, CNAME, PID) values (11, '密云县', 2);

insert into tb_tree (CID, CNAME, PID) values (12, '浦东', 4);

2、TreeNode对象,对应tb_tree

public class TreeNode implementsSerializable {

privateInteger cid;

privateString cname;

privateInteger pid;

private List nodes = newArrayList();

publicTreeNode() {

}

//getter、setter省略

}

3、测试数据

public classTreeNodeTest {

@Test

public void loadTree() throwsException{

System.out.println(JsonUtils.javaToJson(recursiveTree(1)));

}

/*** 递归算法解析成树形结构

*

* @paramcid

* @return* @authorjiqinlin

*/

public TreeNode recursiveTree(intcid) {

//根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?)

TreeNode node =personService.getreeNode(cid);

//查询cid下的所有子节点(SELECT * FROM tb_tree t WHERE t.pid=?)

List childTreeNodes =personService.queryTreeNode(cid);

//遍历子节点

for(TreeNode child : childTreeNodes){

TreeNode n = recursiveTree(child.getCid()); //递归

node.getNodes().add(n);

}

returnnode;

}

}

输出的json格式如下:

{

"cid": 1,

"nodes": [

{

"cid": 2,

"nodes": [

{

"cid": 11,

"nodes": [

],

"cname": "密云县",

"pid": 2}

],

"cname": "北京市",

"pid": 1},

{

"cid": 3,

"nodes": [

{

"cid": 5,

"nodes": [

{

"cid": 7,

"nodes": [

],

"cname": "海珠区",

"pid": 5},

{

"cid": 8,

"nodes": [

],

"cname": "天河区",

"pid": 5}

],

"cname": "广州市",

"pid": 3},

{

"cid": 6,

"nodes": [

{

"cid": 9,

"nodes": [

],

"cname": "福田区",

"pid": 6},

{

"cid": 10,

"nodes": [

],

"cname": "南山区",

"pid": 6}

],

"cname": "深圳市",

"pid": 3}

],

"cname": "广东省",

"pid": 1},

{

"cid": 4,

"nodes": [

{

"cid": 12,

"nodes": [

],

"cname": "浦东",

"pid": 4}

],

"cname": "上海市",

"pid": 1}

],

"cname": "中国",

"pid": 0}