Algorithms算法题<1.1>
1.1.27 二项分布。估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数:
public static double binomial(int N,int k,double p){
if(N==0 && k==0) return 1.0;
if(N<0 || k<0) return 0.0;
return (1.0-p)*binomial(N-1,k,p) + p*binomial(N-1,k-1,p);
}
用这段代码来计算该二项分布的值是不现实的,因为这里是使用递归调用函数来实现的,在函数调用前,编译器要做很多准备工作,所以递归的层数较多时,程序运行速度会极慢,一种改善的方法是使用循环来代替递归。
这里使用了二项分布的一个推导公式:
N次试验发生K次的概率:P(N,K)=(1-p)f(N-1,k)+p* f(N-1,K-1)。
使用循环实现代码如下:
public class Test{
/*使用一个二维数组来存放各项二项分布的概率
*行代表重复N次试验,列代表发生k次,所以在下面循环条件中需要 j<=i
*/
public static double[][] binomial(int N,int k,double p){
double[][] array=new double[N+1][k+1];
//给二维数组初始化第一列,避免下面执行时出现数组下标越界
array[0][0]=1.0;
for(int i=1;i<N+1;i++)
array[i][0]=array[i-1][0]*(1-p);
for(int i=1;i<N+1;i++)
for(int j=1;j<=i && j<k+1;j++)
array[i][j]=(1-p)*array[i-1][j] + p*array[i-1][j-1];
return array;
}
public static void main(String[] args){
double[][] array=binomial(100,50,0.25);
System.out.println(array[100][50]);
}
}
运行结果:4.507310875086383E-8
虽然递归让一些代码看起来非常清晰,简洁。但,就效率上来讲,循环比递归快了很多倍,而且递归会带来程序调试上的问题,所以:慎用递归。
1.1.28 删除重复元素。修改BinarySearch类中的测试用例来删除排序后白名单中的所有重复元素。
这道题其实是不难的,简单来说就是如何删除数组中的重复元素,从而得到一个新的数组。可以先将数组转化为list,删除重复元素后再重新转化为数组。但本书到这里既然还没有介绍列表这种数据结构,那就仅用数组来实现吧。代码如下:
import java.util.Arrays;
public class Test{
public static int[] func1(int[] a){
Arrays.sort(a);
int length=1;
//获得移除重复元素后的数组长度
for(int i=1;i<a.length;i++){
if(a[i]==a[i-1])
continue;
length++;
}
int[] b=new int[length];
b[0]=a[0];
//引入变量count记录重复元素的个数
int count=0;
for(int i=1;i<a.length;i++){
if(a[i]==a[i-1]){
count++;
continue;
}
b[i-count]=a[i];
}
return b;
}
//在主函数中测试该方法
public static void main(String[] args){
int[] a={1,3,3,5,6,6,7,9,9,15};
int[] b=func1(a);
System.out.println("原数组:"+Arrays.toString(a) );
System.out.println("移除重复元素后的新数组:"+Arrays.toString(b) );
}
}
运行结果为:
原数组:[1, 3, 3, 5, 6, 6, 7, 9, 9, 15]
移除重复元素后的新数组:[1, 3, 5, 6, 7, 9, 15]
实现起来还是挺麻烦的,所以遇到这种情况还是使用list吧。
Algorithms算法题<1.1>的更多相关文章
- 一道java算法题分析
最近在面试中遇到这样的一道算法题: 求100!的结果的各位数之和为多少? 如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...
- FCC上的初级算法题
核心提示:FCC的算法题一共16道.跟之前简单到令人发指的基础题目相比,难度是上了一个台阶.主要涉及初步的字符串,数组等运算.仍然属于基础的基础,官方网站给出的建议完成时间为50小时,超出了之前所有非 ...
- 解决一道leetcode算法题的曲折过程及引发的思考
写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...
- js 中的算法题,那些经常看到的
js中遇到的算法题不是很多,可以说基本遇不到.但面试的时候,尤其是一些大公司,总是会出这样那样的算法题,考察一个程序员的逻辑思维能力.如下: 1.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...
- JavaScript算法题之–随机数的生成
JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2 ...
- 简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现。
简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现. 题目: Suppose a sorted array is rotated at som ...
- 经典算法题每日演练——第十七题 Dijkstra算法
原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...
- 经典算法题每日演练——第十六题 Kruskal算法
原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...
- 经典算法题每日演练——第十四题 Prim算法
原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...
随机推荐
- [Ynoi2016]谁的梦
题目大意: 给定$n$个序列,要你从每个序列中选一个非空子串然后拼起来,拼成的序列的贡献为不同元素个数. 支持单点修改,在开始时和每次修改完后,输出所有不同选取方案的贡献和. 解题思路: 窝又来切Yn ...
- SVN仓库导入文件
分两种: 1.导入文件版本库从0开始 (适合新项目) 2.将其他SVN服务器中的版本库导入进来,版本库继承原SVN服务器的(适合SVN版本库迁移) 第一种: #mkdir –p /home/code/ ...
- bit ( 比特 )和 Byte(字节)的关系
一.存储单位的bit 和 Byte1.bit(比特)bit也就是我们不一定听说过的比特,大名鼎鼎的比特币就是以此命名的.它的简写为小写字母 “b” .作为信息技术的最基本存储单元,因为比特实在太小了, ...
- python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看
马上就要过年啦 过年在家干啥咧 准备好被七大姑八大姨轮番「轰炸」了没? 你的内心 os 是这样的 但实际上你是这样的 应付完之后 闲暇时刻不妨看看电影 接下来咱们就来爬取豆瓣上评分最高的 250部电影 ...
- (32)Spring Boot使用@SpringBootApplication注解,从零开始学Spring Boot
[来也匆匆,去也匆匆,在此留下您的脚印吧,转发点赞评论] 如果看了我之前的文章,这个节你就可以忽略了,这个是针对一些刚入门的选手存在的困惑进行写的一篇文章. 很多Spring Boot开发者总是使用 ...
- 1013MySQL监控利器-Innotop
转自 http://www.cnblogs.com/ivictor/p/5101506.html 安装过程中 可以使用 YUM INSTALL INNOTOP进行直接安装 Innotop是一款十分强大 ...
- IndexError:string index out of range
IndexError:string index out of range 出现在下标越界的情况,如 item[1],可能为空的时候下标就会越界
- hdu1203--D - I NEED A OFFER!(转化01背包)
D - I NEED A OFFER! Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- hdu5326 Work
题目链接:点击打开链接 题目大意:有n个人.各自管理不同的人,问有多少人管理k个人. 思路:先记录每一个人的直接上级.然后模拟路径压缩的过程进行计数求和. #include<stdio.h> ...
- 【五】注入框架RoboGuice使用:(Your First POJO Injection)
上一篇我们简单的介绍了一下RoboGuice的使用([四]注入框架RoboGuice使用:(Your First System Service Injection)),今天我们来看下普通Java对象的 ...