算法 第四版 习题 答案(3)

2018-12-08 18:18

} }

思路: N列K行的数组:P(N,K)=(1-p)f(N-1,k)+p* f(N-1,K-1)

f(N-1,K-1) f(N-1,k) f(N,K)

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

public static int countC(int [] a)//排序后,统计重复数量 {

int cnt=0;

for(int i=0;i

return cnt; }

public static int[] remove(int [] a,int cnt ) {

int s=0;

int[] b=new int[a.length-cnt]; b[0]=a[0];

for(int i=0;i

else{ b[i-s+1]=a[i+1]; }

return b; }

1.1.29 等值键。为BinarySearch 类添加一个静态方法rank(),它接受一个键和一个整型有序数组(可能存在重复键)作为参数并返回数组中小于该键的元素数量,以及一个类似的方法count() 来返回数组中等于该键的元素的数量。注意:如果i 和j 分别是rank(key,a) 和count(key,a)的返回值,那么a[i..i+j-1] 就是数组中所有和key 相等的元素。

import java.util.Arrays; public class BinarySearch2 {

public BinarySearch2() { }

/*返回小于key的元素数量 * */

// TODO Auto-generated constructor stub

public static int rank(int key, int[] a)

{int lo = 0;

int hi = a.length - 1; while (lo <= hi) {

// Key is in a[lo..hi] or not present. int mid = lo + (hi - lo) / 2; if (key < a[mid]) hi = mid - 1; else if (key > a[mid]) lo = mid + 1; else { }

return-1; }

public static int count (int key, int[] a) { }

int cnt=0;

int i=rank(key,a);

while(a[i]==a[i+1]&&i

return cnt;

// TODO Auto-generated method stub In in = new In(\);

cnt++; i++;

while(a[mid]==a[mid-1]&&mid>0)

mid--;

return mid;

}

public static void main(String[] args) {

int[] whitelist = in.readAllInts(); Arrays.sort(whitelist); int key=StdIn.readInt(); int cnt=rank(key,whitelist);

StdOut.println(\+key+\+cnt ); int cntequal=count(key,whitelist);

StdOut.println(\+key+\+cntequal ); }

}

1.1.30 数组练习。编写一段程序,创建一个N×N 的布尔数组a[][]。其中当i 和j 互质时(没有相同因子),a[i][j] 为true,否则为false。

public static boolean[][] TestArrays( boolean [][] a)// { int N=a.length; int M=a[0].length; StdOut.println(M+\+\+N); for(int i=0;i

1.1.31 随机连接。编写一段程序,从命令行接受一个整数N 和double 值p(0 到1 之间)作为参数,在一个圆上画出大小为0.05 且间距相等的N 个点,然后将每对点按照概率p 用灰线连接。

public class RandomAccess { public RandomAccess() { // TODO Auto-generated constructor stub } public static void drawcricle(double x,double y,double r,int N,double p,double[][] a) { StdDraw.setXscale(0, x*2); StdDraw.setYscale(0, y*2); StdDraw.setPenRadius(0.005); StdDraw.setPenColor(StdDraw.RED); StdDraw.circle(50, 50, 50); for(int i=0;i

}

double n=50+50*Math.sin(2*Math.PI*i/N); StdDraw.point(m, n); a[i][0]=m; a[i][1]=n; StdDraw.setPenColor(StdDraw.RED); // StdDraw.text(m,n,i+\ } }

public static void Randomline(double x,double y,double[][] a) { StdDraw.setXscale(0, x*2); StdDraw.setYscale(0, y*2); StdDraw.setPenRadius(0.01); StdDraw.setPenColor(StdDraw.LIGHT_GRAY); int N=a.length; for(int i=0;i

public static void main(String[] args) { double x=50; double y=50; double r=50; int N=10; double p=0.2; double[][] a=new double[N][2]; //画圆/描点 drawcricle(x,y,r,N,p,a); //画线 Randomline(x,y,a); }

1.1.32 直方图。假设标准输入流中含有一系列double 值。编写一段程序,从命令行接受一个整数N 和两个double 值l 和r。将(l,r) 分为N 段并使用StdDraw 画出输入流中的值落入每段的数量的直方图。

public class histogram {

/*将(l,r) 分为N段 * */

public static double[] segmentation(int N,double l,double r,double[] a) {

if(N==0) return a; double s=(r-l)/N; a[0]=l;

for(int i=1;i

a[i]=a[i-1]+s;

return a; }

public static void makehistogram(double[] a,double[] b,double l,double r) {

int[] c=new int[a.length-1]; for(int i=0;i

for(int j=0;j

if(b[i]>=a[j]&&b[i]

c[j]++; continue;

int N=c.length;

StdDraw.setXscale(0,(r-l)*1.2 );

StdDraw.setYscale(0, b.length/N*1.5);

for(int i=0;i

public static void main(String[] args) {

// TODO Auto-generated method stub double x = l+(r-l)/N*i; double y = c[i]/2.0; double rw = (r-l)/(2*N); double rh = c[i]/2.0;

StdDraw.filledRectangle(x, y, rw, rh); StdOut.print(c[i]+\); }

int N=10;//段数 double l=2; double r=20;

double [] a=new double[N+1];//记录分段的节点

double [] b=new double[N*N*N];//随机产生一个数组,作为输入数字。 a=segmentation(N,l,r,a); for(int i=0;i


算法 第四版 习题 答案(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:一年级上册国防教育教案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: