数据结构Java版例程练习

昨日下午于图书馆借到一本蔡明志编的数据结构(Java版)。大概翻了下看起来写的还可以,借一本去实验室看吧。

这书第一章用各种废话粗略介绍了下神马事算法,并举了一小堆例子。第二章讲数组。虽然没看懂第二章想要说明什么问题,不过第二章最后的生命游戏倒是很有趣,虽然过去有玩过,但原理并未完全理解。那么今天上午的计划就是把这书的前两章看完,顺便做个笔记神马的……


第一章 算法分析

在这里,算法的定义是解决问题的有限步骤过程,也可以说是在解答过程中的一步步过程。对于简单的问题,很容易看出解决问题的步骤,对于复杂的问题却不然。

性能分析(Performance Analysis)的常用方法有Time Complexity AnalysisTime Complexity Analysis

算法复杂度的分析可以用O,Ω和Θ来确定一个程序的时间复杂度。定义如下:

f(n) = O(g(n)),当且仅当唯一存在正整数c即n0,使得f(n) <= cg(n), 对所有得n, n >=n0

f(n)=Ω(g(n))当且仅当存在正整数c和n0,使得f(n) >= c*g(n),对所有的n,n >= 0

f(n)=Θ(g(n)),当且仅当存在正整数c1,c2和n,使得c1*g(n)<=f(n)<=c2*g(n),对所有的n, n >= 0



哦对了,第一页还有四个例子的说。虽然很简单,还是要把写的代码贴上以作纪念= =

#1

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.firedom.www;

import fire.*;

/**
 *
 * @author firedom
 *
 *
 *
 */
public class OBJECT extends iostr {

    /**
     * @param args the command line arguments
     */


    public static void main(String[] args) {
        int a[][] = new int[12][11];
        for (int i = 0; i < a.length; i++) { //获得行长度
            for (int j = 0; j < a[0].length; j++) { // 获得列长度
                a[i][j] = ((i * 10) + j); // 
                // 以这种方式递增得到的最大的数是120,而不是12*11
                // 每次循环,个位数为零的数会出现两次。
            }
        }
        sum(a);
    }

    public static void sum(int array[][]) {
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                output(array[i][j]);
            }
        }
    }
}


    static int count = 0;
    public static void main(String[] args) {
        int a[][] = new int[12][11];
        for (int i = 0; i < a.length; i++) { //获得行长度
            for (int j = 0; j < a[0].length; j++) { // 获得列长度
                a[i][j] = count; // 这样写才ok-
                count++;
            }
        }
        sum(a);
    }

#2 内部矩阵相加 & 查找 & 相乘

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.firedom.www;

import fire.*;

/**
 *
 * @author firedom
 *
 *
 *
 */
class setArray {

    private int a[][] = new int[5][5];
    private int b[][] = new int[5][5];
    private int c[][] = new int[5][5];

    setArray() {
        int count = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                a[i][j] = count;
                b[i][j] = count;
                count++;
            }
        }
    }

    public int getaryA(int i, int j) {
        return (a[i][j]);
    }

    public int getaryB(int i, int j) {
        return (b[i][j]);
    }

    public void sumAdd() {
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                c[i][j] = (getaryA(i, j) + getaryB(i, j));
            }
        }
    }

    public int srarchTarget(int a[], int target) { // search the first target,nember
        // start to 0

        for (int i = 0; i < a.length; i++) {
            if (target == a[i]) {
                return (i);
            }
        }
        return (-1);

    }

    public void mult() {
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                sum = 0;
                for (int k = 0; k < a.length; k++) {
                    sum += (a[i][k] * b[k][j]);
                    c[i][j] = sum;

                }

            }
        }

    }

    public void printMultary() {
        mult();
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[0].length; j++) {
                System.out.print(c[i][j] + " ");
            }
            System.out.println(" ");
        }
    }

    public void printary() {
        sumAdd();
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[0].length; j++) {
                System.out.print(c[i][j] + " ");
            }
            System.out.println(" ");
        }
    }
}

public class OBJECT extends iostr {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        setArray a = new setArray();
        a.printary();

        int[] num = {2, 3, 1, 4, 3, 5, 4, 6, 34, 2};
        int target = 5;
        output(a.srarchTarget(num, target));

        System.out.println(" ");
        System.out.println(" ");
        System.out.println(" ");
        System.out.println(" ");
        System.out.println(" ");

        a.printMultary();

    }
}

使用二分法查找已经排序完成的数列的复杂度是O(log2N),函数图像大概像这个样子:


差点把代码忘了,按照二分法的思路写出的代码是这样的:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package execcount;

/**
 *
 * @author firedom
 */
class searchAlog {

    public void binarysearch(int source[], int findNumber) {
        int low = 0;
        int upper = source.length;
        int middle;
        while (low <= upper) {
            middle = (upper + low) / 2;
            if (source[middle] > findNumber) {
                upper = middle - 1;
            } else if (source[middle] < findNumber) {
                low = middle + 1;
            } else {
                System.out.println(middle);
                break;
            }
        }
    }
}

public class Execcount {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        int[] data = new int[1000000];
        int count = 0;
        for (int i = 0; i < data.length; i++) {
            data[i] = count;
            count++;
        }
        searchAlog b = new searchAlog();
        b.binarysearch(data, 8475);
    }
}
==看这样子以后还是直接贴关键代码吧,不然的话太占地方了。

饿看样子今天只能到这里了,发烧好难受的说。

1.1 单项选择题 1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的① 、数据信息在计算机中的② 以及一组相关的运算等的课程。 ① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象 ② A.存储结构 B.关系 C.运算 D.算法 2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其中D是① 的有限集合,R是D上的② 有限集合。 ① A.算法 B.数据元素 C.数据操作 D.数据对象 ② A.操作 B.映象 C.存储 D.关系 3. 在数据结构中,从逻辑上可以把数据结构分成 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4. 算法分析的目的是① ,算法分析的两个主要方面是② 。 ① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系 C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性 ② A. 空间复杂性和时间复杂性 B. 正确性和简明性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性。 ① A. 计算方法 B. 排序方法 C. 解决问题的有限运算序列 D. 调度方法 ② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性 1.2 填空题(将正确的答案填在相应的空中) 1. 数据逻辑结构包括 、 、 和 四种类型,树形结构和图形结构合称为 。 2. 在线性结构中,第一个结点 前驱结点,其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点。 3. 在树形结构中,树根结点没有 结点,其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点,其余每个结点的直接后续结点可以 。 4. 在图形结构中,每个结点的前驱结点数和后续结点数可以 。 5. 线性结构中元素之间存在 关系,树形结构中元素之间存在 关系,图形结构中元素之间存在 关系。 6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。 7. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0;j<n; j++) A[i][j]=0; 8. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0; j<i; j++) A[i][j]=0; 9. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 s=0; for (i=0;i<n;i++) for (j=0;j<n;j++) for (k=0;k<n;k++) s=s+B[i][j][k]; sum=s; 10. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 int i=0,s=0; while (s<n) { i++; s+=i; //s=s+i } 11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 i=1; while (i<=n) i=i*2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值