Algorithms算法题<1.1>

1.1.27 二项分布。估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数:

1 public static double binomial(int N,int k,double p){
2     if(N==0 && k==0) return 1.0;
3     if(N<0 || k<0) return 0.0;
4     return (1.0-p)*binomial(N-1,k,p) + p*binomial(N-1,k-1,p);
5 }

用这段代码来计算该二项分布的值是不现实的,因为这里是使用递归调用函数来实现的,在函数调用前,编译器要做很多准备工作,所以递归的层数较多时,程序运行速度会极慢,一种改善的方法是使用循环来代替递归。

这里使用了二项分布的一个推导公式:

N次试验发生K次的概率:P(N,K)=(1-p)f(N-1,k)+p* f(N-1,K-1)。

使用循环实现代码如下:

 1 public class Test{
 2     /*使用一个二维数组来存放各项二项分布的概率
 3     *行代表重复N次试验,列代表发生k次,所以在下面循环条件中需要 j<=i
 4     */
 5     public static double[][] binomial(int N,int k,double p){
 6         double[][] array=new double[N+1][k+1];
 7         //给二维数组初始化第一列,避免下面执行时出现数组下标越界
 8         array[0][0]=1.0;
 9         for(int i=1;i<N+1;i++)
10             array[i][0]=array[i-1][0]*(1-p);
11         for(int i=1;i<N+1;i++)
12             for(int j=1;j<=i && j<k+1;j++)
13                 array[i][j]=(1-p)*array[i-1][j] + p*array[i-1][j-1];
14         return array;
15     }
16     public static void main(String[] args){
17         double[][] array=binomial(100,50,0.25);
18         System.out.println(array[100][50]);
19     }
20 }

运行结果:4.507310875086383E-8

  虽然递归让一些代码看起来非常清晰,简洁。但,就效率上来讲,循环比递归快了很多倍,而且递归会带来程序调试上的问题,所以:慎用递归。

  

1.1.28 删除重复元素。修改BinarySearch类中的测试用例来删除排序后白名单中的所有重复元素。

  这道题其实是不难的,简单来说就是如何删除数组中的重复元素,从而得到一个新的数组。可以先将数组转化为list,删除重复元素后再重新转化为数组。但本书到这里既然还没有介绍列表这种数据结构,那就仅用数组来实现吧。代码如下:

 1 import java.util.Arrays;
 2 public class Test{
 3     public static  int[] func1(int[] a){
 4        Arrays.sort(a);
 5        int length=1;
 6        //获得移除重复元素后的数组长度
 7        for(int i=1;i<a.length;i++){
 8            if(a[i]==a[i-1])
 9                continue;
10            length++;
11        }
12        int[] b=new int[length];
13        b[0]=a[0];
14        //引入变量count记录重复元素的个数
15        int count=0;
16        for(int i=1;i<a.length;i++){
17            if(a[i]==a[i-1]){
18                count++;
19                continue;
20            }
21            b[i-count]=a[i];
22        }
23        return b;
24     }
25     //在主函数中测试该方法
26     public static void main(String[] args){
27         int[] a={1,3,3,5,6,6,7,9,9,15};
28         int[] b=func1(a);
29         System.out.println("原数组:"+Arrays.toString(a) );
30         System.out.println("移除重复元素后的新数组:"+Arrays.toString(b) );
31     }
32 }

运行结果为:

原数组:[1, 3, 3, 5, 6, 6, 7, 9, 9, 15]
移除重复元素后的新数组:[1, 3, 5, 6, 7, 9, 15]

实现起来还是挺麻烦的,所以遇到这种情况还是使用list吧。

时间: 2024-10-29 10:45:45

Algorithms算法题<1.1>的相关文章

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

每天刷个算法题20160522:支持各种类型的并查集

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524671 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

每天刷个算法题20160521:二叉树高度(递归与非递归)

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502727 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

每天刷个算法题20160518:非递归二叉树遍历

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502254 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在贴点代码. 2002年我初中二年级,开始学习BASIC语言.2004年中考之后,开始参加NOIP,系统学习算法.一直非常喜欢算法,但工作后几乎不再碰这些东西.现在准备重新捡起来. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofe

每天刷个算法题20160524:阿克曼函数的递归转非递归解法

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524754 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

每天刷个算法题20160523:骑士巡游的递归转非递归解法

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524728 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

每天刷个算法题20160525:快速排序的递归转非递归解法

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524798 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

每天刷个算法题20160526:BFS解决八数码问题(九宫格问题)

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51524864 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

每天刷个算法题20160519:回溯法解八皇后

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502622 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西