贴代码不说话:
/**
* <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 开发 - Nested Sets** 在 Laravel 开发中,Nested Sets 是一种处理层次结构数据的有效方法,尤其适用于树状结构。它通过提供一个有序的数据集合来管理具有层级关系的数据,比如目录、菜单或者组织结构。`...
在本案例中,我们关注的是如何在ThinkPHP5(简称TP5)框架下使用nested sets来实现这些功能。 首先,让我们理解Nested Sets的基本概念。Nested Sets模型将树中的每个节点分配两个数值,通常称为`lft`(左边界)和`...
yii2-nested-sets, Yii框架的嵌套集行为 nest 2的行为 一种利用改进的预排序树遍历算法的Yii框架的现代嵌套。安装安装这个扩展的首选方法是通过 composer插件。运行$ composer require creocoder/yii2-nes
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...
Nested事务是基于JDBC的Savepoint机制实现的,它可以让我们在一个已有的事务内部开启一个新的事务,而这个新事务被称为子事务。当子事务完成时,如果父事务正常提交,那么子事务所做的更改也会被提交;如果父事务...
以下是Java实现的六种单例模式的详细解释: 1. 懒汉式(Lazy Initialization): 这种方式延迟了单例对象的初始化,直到第一次被请求时。例如,`SingleInstance1.java`可能就实现了这种方式。代码通常包含一个私有...
quaqua库,全名Jquaqua,是由Raph Levien开发的一个跨平台的Java Swing Look and Feel实现。Look and Feel(L&F)是Java Swing中的一个重要概念,它定义了用户界面组件的视觉样式和交互行为。通过更换L&F,开发者...
安装通过Composer安装: composer require paulzi/yii2-nested-sets 或添加" paulzi/yii2-nested-sets " : " ^1.0 " 到composer.json文件的require部分。迁移示例警告! depth属性不能被无符号! 单树迁移: class m...
总的来说,"Nested Sets CodeSmith Templates"是一个实用的工具,旨在简化在SQL数据库中实现和操作树形结构的过程,特别适合那些希望快速构建和维护层次结构数据的开发者。通过利用CodeSmith的模板引擎,开发者可以...
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 java_leetcode题解之Flatten Nested List Iterator
在Java编程语言中,"Nested"通常指的是嵌套类或者嵌套结构,这是一门强大的特性,使得代码更加模块化和高效。嵌套类可以分为两种主要类型:内部类(Inner Classes)和局部类(Local Classes)。让我们深入探讨这两种...
在Laravel框架中,"nested sets"是一种管理层次结构数据的有效方法,尤其适用于有层级关系的数据,如菜单、目录树或者组织结构等。这个技术基于数学理论中的“二叉搜索树”(Binary Search Tree),通过两个额外的字段...
- 层级表设计:可以使用adjacency list模型,其中每个节点包含一个指向其父节点的外键,或者使用nested sets model或materialized path模型,它们更适合于快速查询整个路径或范围内的节点。 5. **事件处理**: - ...
总之,"Java Docs 3.zip_nested" 包含了关于Java日期处理和嵌套类的详细信息,这对于提升Java程序员的专业技能和面试准备非常有价值。通过深入学习这些知识点,开发者能够更好地掌握Java的高级特性,并能解决更复杂...
**描述:“搜集整理关于java错误处理:java.lang.OutOfMemoryError: Java heap space”** - 描述提到了对这个问题的相关资料进行整理,这意味着该文档将提供如何识别、分析并解决此类问题的方法。 #### 详细解析 ...
在Java编程中,SQLite是一种轻量级的、嵌入式的关系型...通过导入jar包和使用工具类,开发者可以快速地在Java项目中实现对SQLite数据库的读写操作,而无需复杂的环境配置。这对于小型项目或学习数据库操作非常有用。
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, ...