老妖的博客
现实的中没有几个人能够真为对方去死,甚至山盟海誓很快就会在金钱面前变的微不足道,这才是生活。没有永远的爱,除了你的父母对你,当然也就没有永远的恨,更没有永远的痛,时间是最好的治疗大师,它会很快抚平你心灵上累累的伤痕。很多年以后你想起来时,那些在你生命中汹涌来往的人群至多是个模糊的影子或者毫无意义的名字
posts - 105,  comments - 171,  trackbacks - 0

贴代码不说话:

/**
 * <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)));

    }

}
posted on 2006-01-26 11:52 老妖 阅读(602) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年10月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

随笔分类(48)

随笔档案(104)

好友链接

我的豆瓣

积分与排名

  • 积分 - 219642
  • 排名 - 257

最新评论

阅读排行榜