第一章 引论

1.1 本书讨论的内容

  从N个数中确定其中第k个最大者,选择问题。

1.将这N个数排序,然后返回位置k上的元素。

2.先把前K个元素读入书中并对其排序,接着再将剩余的元素逐个读入。当新元素被读到时,如果小于数组中第k个元素则忽略,否则放在正确位置。

1.2 数学知识复习

  在计算机科学中,除非有特别的声明,所有的对数都是以2为底的。

证明方法:1.归纳法证明 2.反证法证明

1.3 递归简论

1.基准情形:必须总有某些基准情形,它无须递归就能解出。

2.不断推进:每一次递归掉哦那个都必须要使求解状况朝接近基准情形的方向推进。

3.设计法则:假设所有的递归调用都能运行。

4.合成法则效益:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。

 

1.4 课后答案

1.4.1

public class wde{

public static final Random RANDOM = new Random(47);

public static void main(String[] args) {
printResult(createArray(RANDOM.nextInt(100000)));

//创建随即数组
public static int[] createArray(int length){
int[] values = new int[length];
for (int i = 0; i < length; i++) {
values[i] = RANDOM.nextInt(length * 2);
}
return values;
}
//打印结果
public static void printResult(int[] values){
System.out.println("length:" + values.length);
long start = System.currentTimeMillis();
System.out.println("result:" + select(values));
System.out.println("cost:" + (System.currentTimeMillis()-start) + "ms");
System.out.println("——————————–");
}
}

1.4.2

kage xiao;

import java.util.Random;



//字谜问题
public class wde {

public static final Random RANDOM = new Random(47);

public static final String[] WORDS = new String[]{"ynz","yzgm","oqz","owznt","z"};

public static void main(String[] args) {
char[][] chars = createTable(5);
printTable(chars);
findWord(chars);
}
//按照标量方向寻找满足的单词(或者说字符串)
public static void findWord(char[][] chars){
long start = System.currentTimeMillis();
for (int i = 0; i < chars.length; i++) {
for (int j = 0; j < chars.length; j++) {
for (int k = 0; k < chars.length; k++) {
for (int l = 0; l < chars.length; l++) {
if (i == k && j == l) {
printWord(String.valueOf(chars[i][j]), i, j, k, l);
continue;
}
if (k != i && j != l && (k-i) != (j-l) && (k-i) != (l - j)) {
continue;
}
StringBuffer stringBuffer = new StringBuffer();
if (i == k) {
if (j > l) {
for (int m = j; m >= l; m--) {
stringBuffer.append(chars[i][m]);
}
}else {
for (int m = j; m <= l; m++) {
stringBuffer.append(chars[i][m]);
}
}
}
if (j == l) {
if (i > k) {
for (int m = i; m >= k; m--) {
stringBuffer.append(chars[m][j]);
}
}else {
for (int m = i; m <= k; m++) {
stringBuffer.append(chars[m][j]);
}
}
}
if ((k-i) == (j - l)) {
if (i > k) {
for (int m = i,n = j; m >= k && n <= l; m--,n++) {
stringBuffer.append(chars[m][n]);
}
}else {
for (int m = i,n = j; m <= k && n >= l; m++,n--) {
stringBuffer.append(chars[m][n]);
}
}
}
if ((k -i) == (l - j)) {
if (i > k) {
for (int m = i,n = j; m >= k && n >= l; m--,n--) {
stringBuffer.append(chars[m][n]);
}
}else {
for (int m = i,n = j; m <= k && n <= l; m++,n++) {
stringBuffer.append(chars[m][n]);
}
}
}
printWord(stringBuffer.toString(), i, j, k, l);
}
}
}
}
System.out.println("————————————————-");
System.out.println("cost time:" + (System.currentTimeMillis() -start) + "ms");
}
//判断是否是既定的一个单词(或字符串)并打印
public static void printWord(String word,int i ,int j,int k,int l){
for (int m = 0; m < WORDS.length; m++) {
if (word.equals(WORDS[m])) {
System.out.println("find word:" + WORDS[m]);
System.out.println("scalar:" + "[" + (i+1) + "," + (j+1) + "]->[" + (k+1) + "," + (l+1) + "]");
}
}
}
//创建随即字符二维数组
public static char[][] createTable(int length){
char[][] chars = new char[length][length];
for (int i = 0; i < chars.length; i++) {
for (int j = 0; j < chars[i].length; j++) {
chars[i][j] = (char)(97 + RANDOM.nextInt(26));
}
}
return chars;
}
//打印二维数组
public static void printTable(char[][] chars){
System.out.println("———————————————");
for (int i = 0; i < chars.length; i++) {
System.out.print("  " + (i+1));
}
System.out.println();
for (int i = 0; i < chars.length; i++) {
System.out.print((i+1));
for (int j = 0; j < chars.length; j++) {
System.out.print(" " + chars[i][j]);
}
System.out.println();
}
System.out.println("———————————————");
}
}

原文地址:https://www.cnblogs.com/tuifeideyouran/p/3723456.html