经典算法问题的Java实现(转)

1.数值转换(System Conversion) 
1.1 r进制数 
  数N的r进制可以表示为: 
 

1.2 十进制转换为r进制 
  十进制数N和其他r进制数的转换是计算机实现计算的基本问题,基解决方案很多,其中一个简单算法基于下列原理: 
  N = (N div d) * r + N mod r (其中: div为整除运算,mod为求余运算) 
 
  问题:如何将非负十进制(Decimal)整数转化为八进制数(Octonary Number)? 
  将十进制转化为r进制: 

Java代码   收藏代码
  1. /** 
  2.  * 非负十进制整数转换为r进制数 
  3.  * @param n 待转换的十进制数 
  4.  * @param r 进制数(基数) 
  5.  * @return 返回转换后对应r进制数各位数字。 
  6.  */  
  7. byte [] dec2RNumber(int n,byte r) {  
  8.     if(n < 0 || r < 0) {  
  9.         throw new IllegalArgumentException(" the parameter is valid!");  
  10.     }  
  11.     Stack<Byte> s = new Stack<Byte>();  
  12.     while( n != 0){  
  13.         s.push(Byte.valueOf((byte) (n%r)));//求余  
  14.         n = n/r;//求商  
  15.     }  
  16.     byte [] rr  = new byte[s.size()];  
  17.     for (int i = 0; i < rr.length; i++) {  
  18.         rr[i] = s.pop();  
  19.     }  
  20.     return rr;  
  21. }  


  十进制非负整数转换为八进制: 

Java代码   收藏代码
  1. dec2RNumber(1348,8)  


2.斐波那契数列(Fibonacci Sequence) 
2.1 斐波那契数列是以递归的方法来定义: 
 
  斐波那契数列是从第0项和第1项开始,之后的项等于其前面相邻两项之和。 
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,...... 

2.2 兔子生育问题: 

  • 第一个月初有一对刚诞生的兔子
  • 第二个月之后(第三个月初)它们可以生育
  • 每月每对可生育的兔子会诞生下一对新兔子
  • 兔子永不死去

2.3 兔子问题的分析: 

  斐波那契数列的java非递归实现: 

Java代码   收藏代码
  1. int Fibs(int n) {  
  2.     if(n < 0) {  
  3.         throw new IllegalArgumentException(" the parameter is valid!");  
  4.     }  
  5.     int n1 = 0;//F(n-2)  
  6.     int n2 = 1;//F(n-1)  
  7.     int r = n1;//F(n)  
  8.     if(n == 1) {  
  9.         r = n2;  
  10.     }  
  11.     for (int i = 2; i <= n; i++) {  
  12.         r = n1 + n2 ;//F(n)=F(n-1)+F(n-2)  
  13.         n1 = n2;  
  14.         n2 = r;  
  15.     }  
  16.     return r;  
  17. }  



参照资料:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97#.E6.87.89.E7.94.A8

3.秦九韶算法求一元n次多项式的值(Compute Polynomial's value) 
3.1 秦九韶算法介绍: 
  秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。在西方被称作霍纳算法。 
  秦九韶算法: 
   
  一般地,一元n次多项式的求值需要经过[n(n+2)]/2次乘法和n次加法,而从上面的演算可以看出秦九韶算法只需要n次乘法和n次加法。极大地降低了算法复杂度。 
  参照:http://zh.wikipedia.org/wiki/%E9%9C%8D%E7%B4%8D%E6%BC%94%E7%AE%97%E6%B3%95 

3.2 秦九韶算法实现: 

Java代码   收藏代码
  1. /** 
  2.  * 秦九绍算法求一元n次多项式的值 
  3.  * f(x) = a[0]*x^n + a[1]*x^(n-1) + ... + a[n] 
  4.  * @param a 系数 
  5.  * @param x 基数 
  6.  * @return 
  7.  */  
  8. double qinjiushao(double [] a ,double x) {  
  9.     double v = a[0];  
  10.     for (int i = 1; i < a.length; i++) {  
  11.         v = v * x + a[i];  
  12.     }  
  13.     return v;  
  14. }  



3.3 秦九韶算法应用: 
  在Java中字符串的hashcode计算中就用到了秦九韶算法。其中基数为31(质数),系数为字符串对应的ASCII值。 

Java代码   收藏代码
  1. public int hashCode() {  
  2. int h = hash;  
  3. if (h == 0) {  
  4.     int off = offset;  
  5.     char val[] = value;  
  6.     int len = count;  
  7.   
  8.         for (int i = 0; i < len; i++) {  
  9.             h = 31*h + val[off++];  
  10.         }  
  11.         hash = h;  
  12.     }  
  13.     return h;  
  14. }  


  测试: 

Java代码   收藏代码
  1. System.out.println("abc".hashCode());  
  2.  结果:96354 = ax^2 + bx +c //其中( [a,b,c]=[97,98,99];x =31)  
  3.             = 97 * 961 + 98 * 31 +99  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值