绪论

 

性质:专业基础课,计算机专业核心课程;72学时,4.5学分;课程设计1周,1学分。
特点:结构复杂,算法抽象;
重点:线性表、二叉树、图、查找、排序;
难点:链式存储结构,递归算法。
一个人迟早、肯定能够从他的付出中获得回报,也肯定会因为偷懒、幼稚、无知而付出代价,有些惨痛级别的代价是不能承受的。例如,大学不能毕业、没有学位、留级等,影响终身,后悔莫及。
1.1.1   为什么要学习数据结构
软件设计是计算机学科各个领域的核心。软件设计时要考虑的首要问题是数据的表示、组织和处理方法。数据结构设计和算法设计是软件系统设计的核心。
“数据结构+算法=程序设计” 

 

数据结构(data structure)指数据元素之间存在的关系。包含以下三方面:
数据的逻辑结构
数据的存储结构
数据操作
线性结构:数据元素只有一个前驱数据元素和一个后继数据元素。
树结构:每个数据元素只有一个前驱数据元素,可有零个或若干个后继数据元素。
图结构:每个数据数据元素元素可有零个或若干个前驱数据元素,零个或若干个后继。
线性表表示可重复的无序集合,元素间具有前驱、后继次序关系;不同元素的关键字可重复,采用序号能够识别关键字重复的数据元素。
排序线性表表示可重复的排序集合,元素按关键字大小次序排序。
散列表表示不可重复的无序集合,元素关键字不重复,元素间没有次序,不排序。
二叉排序树表示不可重复的排序集合,元素关键字不重复,元素按关键字升/降序排序。

 

一个算法(Algorithm)是一个有穷规则的集合,其规则确定一个解决某一特定类型问题的操作序列。 
算法定义
有穷性
确定性
输入
输出
可行性
算法设计目标
正确性
可读性
健壮性
高时间效率
高空间效率

算法分析

度量算法的时间效率
算法的时间效率指算法的执行时间随问题规模的增长而增长的趋势,通常采用时间复杂度来度量算法的时间效率。
T(n)=O(f(n)) 
度量算法的空间效率
空间复杂度指算法在执行时为解决问题所需要的额外内存空间,不包括输入数据所占用的存储空间。 
S(n)=O(f(n))  

 

 

 

 

 

返回a与b的最大公约数
int gcd(int a, int b) 
{
    while (b!=0)
    {   int temp = a%b;
        a = b;
        b = temp; 
    }
    return a;
}
//《数据结构(Java版)(第4版)》,作者:叶核亚。2014年7月3日。JDK 8.11。
//§1.2.3   算法设计
//【例1.3】 求两个整数的最大公约数。
//4.3 递归【实验4-5】递归算法

public class Gcd
{
    public static int gcd1(int a, int b)          //返回a与b的最大公因数
    {
        while (b!=0)
        {
            int temp = a%b;
            a = b;
            b = temp; 
        }
        return a;
    }
    
    //4.3 递归【实验4-5】递归算法
    public static int gcd2(int a, int b)          //返回a,b的最大公因数,递归方法
    {
        if(b==0)
            return a;
        if(a<0)
            return gcd2(-a, b);
        if(b<0)
            return gcd2(a, -b);
        return gcd2(b, a%b);
    }
    public static int mygcd2(int a, int b){
        if(b ==0) return a;
        return mygcd2(b,a%b);
    }
    public static Integer mygcdn(int... numArray){
        if(numArray.length == 0){
            return null;
        }
        if(numArray.length == 1){
            return numArray[0];
        }
        return myGcdnForManyNumber(numArray);
    }
    // 我自己补充的求多个数的最大公约数
    public static Integer myGcdnForManyNumber(int... numArray){
        if(numArray.length == 2){
            return mygcd2(numArray[0],numArray[1]);
        }
        int[] newArray = new int[numArray.length -1];
        newArray[0] = mygcd2(numArray[0],numArray[1]);
        System.arraycopy(numArray, 2, newArray, 1, numArray.length -2);
        return myGcdnForManyNumber(newArray);
    }
    
    public static void main(String args[]) 
    {
        System.out.println(12%18);
        int a=12, b=18, c=24;
        System.out.println("gcd1("+a+","+b+","+c+")="+gcd1(gcd2(a,b), c));
        System.out.println("gcd1("+a+","+b+","+c+"+3)="+mygcdn(a,b,c,3));
    }
}
/*
程序运行结果如下:

12

gcd1(12,18,24)=6

gcd1(12,18,24+3)=3

 

 

posted @ 2020-05-30 02:06  lakeslove  阅读(120)  评论(0编辑  收藏  举报