性质:专业基础课,计算机专业核心课程;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