`
zww80216
  • 浏览: 47102 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于Nested Sets and Materialized Path的java实现

阅读更多

贴代码不说话:

/**
 * <br>
 * 标题: 关于Nested Sets and Materialized Path的java实现<br>
 * 功能概要: <br>
 * 版权: cityyouth.cn (c) 2005 <br>
 * 公司:上海城市青年网 <br>
 * 创建时间:2006-1-25 <br>
 * 修改时间: <br>
 * 修改原因:<br>
 * <p>
 * path x+y bin(numer)<br>
 * <root> 1/1 1<br>
 * 1 3/2 11<br>
 * 1.1 7/4 111<br>
 * 1.1.1 15/8 1111<br>
 * 1.1.1.1 31/16 11111<br>
 * 1.2 11/8 1011<br>
 * 1.2.1 23/16 10111<br>
 * 1.3 19/16 10011<br>
 * 1.3.1 39/32 100111<br>
 * 2 3/4 011<br>
 * 2.1 7/8 0111<br>
 * 2.1.1 15/16 01111<br>
 * 2.1.2 27/32 011011<br>
 * 2.2 11/16 01011<br>
 * 2.2.1 19/32 010111<br>
 * 3 3/8 0011<br>
 * 3.1 7/16 00111<br>
 * 4 3/16 00011
 * </p>
 * 
 * 
@author 张伟
 * 
@version 1.0
 
*/
public class NestedSetsUtil {
    
public static double x_numer(double numer, double denom) {
        
double ret_num = numer + 1;
        
double ret_den = denom * 2;
        
while (Math.floor(ret_num / 2== ret_num / 2) {
            ret_num 
= ret_num / 2;
            ret_den 
= ret_den / 2;
        }
        
return ret_num;
    }

    
public static double x_denom(double numer, double denom) {
        
double ret_num;
        
double ret_den;
        ret_num 
= numer + 1;
        ret_den 
= denom * 2;
        
while (Math.floor(ret_num / 2== ret_num / 2) {
            ret_num 
= ret_num / 2;
            ret_den 
= ret_den / 2;
        }
        
return ret_den;
    }

    
public static double y_numer(double numer, double denom) {
        
double num;
        
double den;
        num 
= x_numer(numer, denom);
        den 
= x_denom(numer, denom);
        
while (den < denom) {
            num 
= num * 2;
            den 
= den * 2;
        }
        num 
= numer - num;
        
while (Math.floor(num / 2== num / 2) {
            num 
= num / 2;
            den 
= den / 2;
        }
        
return num;
    }

    
public static double y_denom(double numer, double denom) {
        
double num;
        
double den;
        num 
= x_numer(numer, denom);
        den 
= x_denom(numer, denom);
        
while (den < denom) {
            num 
= num * 2;
            den 
= den * 2;
        }
        num 
= numer - num;
        
while (Math.floor(num / 2== num / 2) {
            num 
= num / 2;
            den 
= den / 2;
        }
        
return den;
    }

    
public static double parent_numer(double numer, double denom) {
        
double ret_num;
        
double ret_den;
        
if (numer == 3) {
            
return Double.NaN;
        }
        ret_num 
= (numer - 1/ 2;
        ret_den 
= denom / 2;
        
while (Math.floor((ret_num - 1/ 4== (ret_num - 1/ 4) {
            ret_num 
= (ret_num + 1/ 2;
            ret_den 
= ret_den / 2;
        }
        
return ret_num;
    }

    
public static double parent_denom(double numer, double denom) {
        
double ret_num;
        
double ret_den;
        
if (numer == 3) {
            
return Double.NaN;
        }
        ret_num 
= (numer - 1/ 2;
        ret_den 
= denom / 2;
        
while (Math.floor((ret_num - 1/ 4== (ret_num - 1/ 4) {
            ret_num 
= (ret_num + 1/ 2;
            ret_den 
= ret_den / 2;
        }
        
return ret_den;
    }

    
public static double sibling_number(double numer, double denom) {
        
// 修正了验证3/4,1/1等
        /*
         * if (numer == 3) { return Double.NaN; }
         
*/
        
double ret_num = (numer - 1/ 2;
        
double ret_den = denom / 2;
        
double ret = 1;
        
while (Math.floor((ret_num - 1/ 4== (ret_num - 1/ 4) {
            
if (ret_num == 1 && ret_den == 1)
                
return ret;
            ret_num 
= (ret_num + 1/ 2;
            ret_den 
= ret_den / 2;
            ret 
= ret + 1;
        }
        
return ret;
    }

    
private static String path_recur(double numer, double denom) {
        
if (Double.isNaN(numer))
            
return "";
        
return path_recur(parent_numer(numer, denom), parent_denom(numer, denom)) + "."
                
+ (int) sibling_number(numer, denom);

    }

    
public static String path(double numer, double denom) {
        String result 
= path_recur(numer, denom);
        
if (result.length() > 0)
            
return result.substring(1, result.length());
        
return result;
    }

    
public static double distance(double num1, double den1, double num2, double den2) {
        
if (Double.isNaN(num1))
            
return -999999;
        
if (num1 == num2 && den1 == den2)
            
return 0;
        
return 1 + distance(parent_numer(num1, den1), parent_denom(num1, den1), num2, den2);
    }

    
public static double child_numer(double num, double den, double child) {
        
return num * Math.pow(2d, child) + 3d - Math.pow(2d, child);
    }

    
public static double child_denom(double num, double den, double child) {
        
return den * (double) Math.pow(2, child);
    }

    
public static double path_numer(String path) {
        
double num = 1;
        
double den = 1;
        String postfix 
= "." + path + ".";
        String sibling;

        
while (postfix.length() > 1) {
            sibling 
= postfix.substring(1, postfix.indexOf("."2));
            postfix 
= postfix.substring(postfix.indexOf("."2), postfix.length()
                    
- postfix.indexOf("."2+ 2);

            num 
= child_numer(num, den, Integer.parseInt(sibling));
            den 
= child_denom(num, den, Integer.parseInt(sibling));
        }
        
return num;
    }

    
public static double path_denom(String path) {
        
double num;
        
double den;
        String postfix;
        String sibling;
        num 
= 1;
        den 
= 1;
        postfix 
= "." + path + ".";

        
while (postfix.length() > 1) {
            sibling 
= postfix.substring(1, postfix.indexOf("."2));
            postfix 
= postfix.substring(postfix.indexOf("."2), postfix.length()
                    
- postfix.indexOf("."2+ 2);

            num 
= child_numer(num, den, Double.parseDouble(sibling));
            den 
= child_denom(num, den, Double.parseDouble(sibling));
        }
        
return den;
    }

    
public static void main(String[] args) {
        
// 说明5-8,19-32是39/32的x和y坐标,39/32 is the node 1.3.1
        
// System.out.println(x_numer(39d, 32d) + "/" + x_denom(39d, 32d));
        
// System.out.println(y_numer(39d, 32d) + "/" + y_denom(39d, 32d));
        
// System.out.println(5d / 8d + 19d / 32d);
        
// System.out.println(39d / 32d);

        
// 27/32 is the node 2.1.2, 那么 7/8 is 2.1,查找父节点成功
        
// System.out.println(parent_numer(27d, 32d) + "/" + parent_denom(27d,
        
// 32d));
        
// 开始查找那些是他的兄弟
        
// System.out.println(sibling_number(3d, 2d));
        
// System.out.println(sibling_number(3d, 4d));
        
// System.out.println(sibling_number(15d,16d));
        
// System.out.println(path_numer("1.1.7")+"/"+path_denom("1.1.7"));
        
// 计算节点的路径
        
// System.out.println(path(15d, 16d));
        /*
         * System.out.println(distance(27d, 32d, 3d, 4d));
         * System.out.println(child_numer(3d, 2d, 3d) + "/" + child_denom(3d,
         * 2d, 3d));
         * System.out.println(path_numer("2.1.1")+"/"+path_denom("2.1.1"));
         
*/
        
// System.out.println(".2.1.3.".substring(1,".2.1.3".indexOf(".",2)));
        
// System.out.println(".2.1.3.".substring(".2.1.3.".indexOf(".",2),".2.1.3.".length()-".2.1.3.".indexOf(".",2)+1));
        String ss = "1.2";
        System.out.println((
int) path_numer(ss) + "/" + (int) path_denom(ss));
        System.out.println(path(path_numer(ss), path_denom(ss)));

    }

}
分享到:
评论

相关推荐

    Laravel开发-nestedsets

    **Laravel 开发 - Nested Sets** 在 Laravel 开发中,Nested Sets 是一种处理层次结构数据的有效方法,尤其适用于树状结构。它通过提供一个有序的数据集合来管理具有层级关系的数据,比如目录、菜单或者组织结构。`...

    tp5的nestedsets,方便的对树形结构的数据在关系型数据库中进行管理和操作。.zip

    在本案例中,我们关注的是如何在ThinkPHP5(简称TP5)框架下使用nested sets来实现这些功能。 首先,让我们理解Nested Sets的基本概念。Nested Sets模型将树中的每个节点分配两个数值,通常称为`lft`(左边界)和`...

    yii2-nested-sets, Yii框架的嵌套集行为.zip

    yii2-nested-sets, Yii框架的嵌套集行为 nest 2的行为 一种利用改进的预排序树遍历算法的Yii框架的现代嵌套。安装安装这个扩展的首选方法是通过 composer插件。运行$ composer require creocoder/yii2-nes

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...

    Spring Nested事务简单案例

    Nested事务是基于JDBC的Savepoint机制实现的,它可以让我们在一个已有的事务内部开启一个新的事务,而这个新事务被称为子事务。当子事务完成时,如果父事务正常提交,那么子事务所做的更改也会被提交;如果父事务...

    Java实现多种单例模式

    以下是Java实现的六种单例模式的详细解释: 1. 懒汉式(Lazy Initialization): 这种方式延迟了单例对象的初始化,直到第一次被请求时。例如,`SingleInstance1.java`可能就实现了这种方式。代码通常包含一个私有...

    quaqua-7.3.4.nested.zip java美化包

    quaqua库,全名Jquaqua,是由Raph Levien开发的一个跨平台的Java Swing Look and Feel实现。Look and Feel(L&F)是Java Swing中的一个重要概念,它定义了用户界面组件的视觉样式和交互行为。通过更换L&F,开发者...

    yii2-nested-sets:Yii2的嵌套集行为

    安装通过Composer安装: composer require paulzi/yii2-nested-sets 或添加" paulzi/yii2-nested-sets " : " ^1.0 " 到composer.json文件的require部分。迁移示例警告! depth属性不能被无符号! 单树迁移: class m...

    Nested Sets CodeSmith Templates-开源

    总的来说,"Nested Sets CodeSmith Templates"是一个实用的工具,旨在简化在SQL数据库中实现和操作树形结构的过程,特别适合那些希望快速构建和维护层次结构数据的开发者。通过利用CodeSmith的模板引擎,开发者可以...

    db2物化路径模型查询

    WHERE a.materialized_path LIKE CONCAT(b.materialized_path, '%') AND b.description = '雨恬' order by materialized_path -- 自底到顶的查询 SELECT a.materialized_path, a.commander, a.description FROM t_...

    java-leetcode题解之Flatten Nested List Iterator.java

    java java_leetcode题解之Flatten Nested List Iterator

    java代码-Nested

    在Java编程语言中,"Nested"通常指的是嵌套类或者嵌套结构,这是一门强大的特性,使得代码更加模块化和高效。嵌套类可以分为两种主要类型:内部类(Inner Classes)和局部类(Local Classes)。让我们深入探讨这两种...

    Laravel开发-nested-sets

    在Laravel框架中,"nested sets"是一种管理层次结构数据的有效方法,尤其适用于有层级关系的数据,如菜单、目录树或者组织结构等。这个技术基于数学理论中的“二叉搜索树”(Binary Search Tree),通过两个额外的字段...

    使用Ztree实现java动态树形菜单

    - 层级表设计:可以使用adjacency list模型,其中每个节点包含一个指向其父节点的外键,或者使用nested sets model或materialized path模型,它们更适合于快速查询整个路径或范围内的节点。 5. **事件处理**: - ...

    Java-Docs-3.zip_nested

    总之,"Java Docs 3.zip_nested" 包含了关于Java日期处理和嵌套类的详细信息,这对于提升Java程序员的专业技能和面试准备非常有价值。通过深入学习这些知识点,开发者能够更好地掌握Java的高级特性,并能解决更复杂...

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    **描述:“搜集整理关于java错误处理:java.lang.OutOfMemoryError: Java heap space”** - 描述提到了对这个问题的相关资料进行整理,这意味着该文档将提供如何识别、分析并解决此类问题的方法。 #### 详细解析 ...

    java操作sqlite数据库工具代码及jar包

    在Java编程中,SQLite是一种轻量级的、嵌入式的关系型...通过导入jar包和使用工具类,开发者可以快速地在Java项目中实现对SQLite数据库的读写操作,而无需复杂的环境配置。这对于小型项目或学习数据库操作非常有用。

    Nested list and file.txt

    You're going to write a program that lets the user enter a sentence and translates it to another language. The program will learn. When it first comes across a word it doesn't have in its dictionary, ...

Global site tag (gtag.js) - Google Analytics