算法分析与设计
This presentation is the property of its rightful owner.
Sponsored Links
1 / 41

算法分析与设计 PowerPoint PPT Presentation


  • 71 Views
  • Uploaded on
  • Presentation posted in: General

算法分析与设计. 授 课: 课件制作: 单 位:. 吴磊 电子科技大学. Email: [email protected] www.uestc.edu.cn--- > 教师社区 ---> 吴磊. 第一章 绪 论. 1.1数据结构的定义和地位  1.2 数据结构的基本术语  1.3 算法和算法分析  1.4 算法与程序  1.5 描述算法. §1.1 数据结构的定义和地位. 什么是程序、软件? N. 沃思( Niklaus Wirth) 教授提出: 程序=算法+数据结构 以上公式说明了如下两个问题:

Download Presentation

算法分析与设计

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


5953771

算法分析与设计

授 课:

课件制作:

单 位:

吴磊

电子科技大学

Email: [email protected]

www.uestc.edu.cn--->教师社区--->吴磊


5953771

第一章 绪 论

  • 1.1数据结构的定义和地位

  • 1.2数据结构的基本术语

  • 1.3算法和算法分析

  • 1.4算法与程序

  • 1.5描述算法


5953771

§1.1 数据结构的定义和地位

  • 什么是程序、软件?

  • N.沃思(Niklaus Wirth)教授提出:

    程序=算法+数据结构

    • 以上公式说明了如下两个问题:

    • (1)数据上的算法决定如何构造和组织数据(算法→数据结构)。

    • (2)算法的选择依赖于作为基础的数据结构(数据结构→算法)。

      软件=程序+文档(软件工程的观点)


  • 5953771

    • 数值计算解决问题的一般步骤:

    • 数学模型→选择计算机语言→编出程序→测试→最终解答。

    • 数值计算的关键是:如何得出数学模型(方程)?

    • 程序设计人员比较关注程序设计的技巧。

    • 非数值计算问题:

    • 数据元素之间的相互关系一般无法用数学方程加以描述。

    • 例1.1 电话号码查询问题:

    • (1)按顺序存储方式:遍历表

    • (2)按姓氏索引方式:要写出好的查找算法,取决于这张表的结构及存储方式。

    • 电话号码表的结构和存储方式决定了查找(算法)的效率。


    5953771

    • 例1.2 田径赛的时间安排问题(无向图的着色问题) :

      设有六个比赛项目,规定每个选手至多可参加三个项目,有五人报名参加比赛(如下表所示)设计比赛日程表,使得在尽可能短的时间内完成比赛。


    5953771

    A

    B

    F

    E

    C

    D

    • 田径赛的时间安排问题解法:

      (1)设用如下六个不同的代号代表不同的项目:

    • 跳高 跳远 标枪 铅球 100米 200米

    • A B C D E F

      (2)用顶点代表比赛项目

    • 不能同时进行比赛的项目之间连上一条边。

      (3)某选手比赛的项目必定有边相连(不能同时比赛)。

    结论:安排四各比赛时间

    1(A,C),2(B,D),3(E),4(F)


    5953771

    ……..

    ……..

    …...

    …...

    …...

    …...

    • 例1.3 人机对弈:树形结构


    5953771

    §1.2 数据结构的基本术语

    • 1.数据,数据对象和数据元素

    • 数据是对客观事物的符号表示,是指计算机能处理的符号的总称。

    • (其他定义类似见书)

    • 2.数据结构

    • 数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。通常有四种结构:

    •    (1)集合

    •    (2)线形结构

    •    (3)树型结构

    •    (4)图状结构或网状结构


    5953771

    • 3.逻辑结构和物理结构

    • 逻辑结构:数据元素间抽象化的相互关系(即数据结构)

    • 与数据的存储无关,独立于计算机,它是从具体问题

    • 抽象出来的数学模型。

      物理结构(存储结构):

      • 数据元素及其关系在计算机存储器中的存储方式。

      • 是逻辑结构用计算机语言的实现,它依赖于计算机语言。

        小结:

        (1)数据的逻辑结构、存储结构和数据的运算(算法)构成了数据结构三个方面的含义。

        (2)程序设计的实质是对实际问题选择一个好的数据结构,加之设计一个好的算法。而好的算法在很大程度上取决于描述实际问题的数据结构。


    5953771

    • 4.数据类型

    • 抽象数据类型(Abstract Data Type)是指一个数学模型以及定义在该模型上的一组操作。

    •   ADT 抽象数据类型{

    •       数据对象:<数据对象的定义>

    •       数据关系:<数据关系的定义>

    •       数据操作:<数据操作的定义>

    •   }ADT 抽象数据类型名

    • 5.算法

    • 所谓算法(Algorithm)是描述计算机解决给定问题的操作过程(解题方法),即为解决某一特定问题而由若干条指令组成的有穷序列。


    5953771

    §1.3 算法和算法分析

    • 一、算法的表示和实现:

    • 描述---可采用自然语言、数学语言或约定的符号语言。

    • 实现---必须借助程序设计语言提供的数据类型及其运算

    • 二、算法的定义和特性:

    • 有穷性: 执行了有限条指令后一定要终止。

    • 确定性:算法的每一步操作都必须有确切定义,不得有任何歧义性。

    • 可行性:算法的每一步操作都必须是可行的,即每步操作均能在有限时间内完成。

    • 输入:一个算法有n(n>=0)个初始数据的输入。

    • 输出:一个算法有一个或多个与输入有某种关系的有效信息的输出。

    • 思考题:算法和程序主要区别是什么?


    5953771

    • 三、算法设计的要求:

    • 正确性

    • (1)不含语法错误

    • (2)程序对于n组输入数据能够得出满足规格说明要求的结果。

    • (3)程序对于精心选择的典型、边界性的n组输入数据能得出满足规格说明要求的结果。

    • (4)程序对于一切合适的输入数据都能得出满足规格说明要求的结果(穷举)。

    • 可读性

    • 健壮性

    • 效率与存储需求。


    5953771

    1.程序运行所耗费的时间(由下列因素决定):

    • 算法所选用的策略

    • 问题的规模

    • 书写程序所采用的语言

    • 编译程序所产生的机器代码的质量

    • 机器执行指令的速度

    • 一个算法耗费的时间=算法中每条语句的执行时间之和。

    • 若不考虑机器硬、软件因素,可以认为算法“运行工作量”的大小是问题规模的函数。

    四、算法的度量:


    5953771

    四、算法的度量:

    • 2.问题的规模(size)---n

    • 算法求解问题的输入量(或初始数据量)。

      3.不考虑机器软硬件环境时算法的时间耗费:

    • 设:执行每条语句所需时间为单位时间,则:

    • 一个算法耗费的时间=所有语句的频度之和。

    • 时间复杂度T(n)---

    • 即:时间耗费,它是算法求解问题n的函数。

    • 渐近时间复杂度---

    • 即当问题的规模n→∞时的时间复杂度T(n)的数量级(阶),记作:T(n)=O(f(n))

    • 评价一个算法的时间性能,主要标准是算法的渐近时间复杂度


    5953771

    四、算法的度量:

    • 4.算法度量主要指标

      频度:语句在算法中重复的次数。

    • (渐进)时间复杂度:T(n)=O(f(n))

    • (渐进)空间复杂度:S(n)=O(f(n))

    • 频度

    • 1

    • n

    • n-1

    • n-1

    • 时间复杂度:

    • T(n)=O(f(n))=O(3n-1)=O(n)

    • 例.i=1;

    • while (i<n)

    • {x=x+1;

    • i=i+1;}

    • 空间复杂度:

    • S(n)=O(f(n))=O(3)=O(1)


    5953771

    • 例1.x=0;

    • for(i=1;i<=n;++i)

    • for(j=1;j<=n;++j)

    • for(k=1;k<=n;++k)

    • ++x;

    四、算法的度量:

    • 例2.scanf(&x);

    • i=0;

    • while(i<n&&a[i]==x)

    • ++i;


    5953771

    • 例1:

    • fact=1;

    • for (i=1;i<=n;i++)

    • fact*=i;

    • 例2:

    • sum=0;

    • for (i=1;i<=n;i++)

    • for (j=1;j<=n;j++)

    • sum+=a[i][j];

    • 问题:两个程序哪个快呢?


    5953771

    • 假如加法速度是乘法的10倍.

    • 你可能会认为:

    • 10*n与n*n当n的取值不同时,结果不同.

    • 但算法分析的结论是:

    • 程序1的渐进时间复杂度底,因此更优.


    5953771

    思考题:

    • 计算下列程序中每条语句的频度:

    • 1. count=1;

    • for(i=1;i<=n;i++)

    • for(j=1;j<=i;j++)

    • for(k=1;k<=j;k++)

    • count++;

    • 2. i=n;j=0;

    • while (i>(j+1)*(j+1))

    • j++;


    5953771

    例、储油点问题

    • 一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500升。因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿过沙漠,试问司机如何建立这些储油点?每个储油点应存多少油,才能使卡车以消耗最少油的代价通过沙漠?


    5953771

    例、渡河问题

    • 一个人带了一只狼、一只山羊和一棵白菜想要渡河。河上有一只独木船,每次除人外只能带一样东西,另外如果人不在时狼就要吃山羊,羊就要吃白菜。问应该怎样安排渡河,才能做到既把所有东西都带过河,而且在河上来回的次数又最少?

    • 设M代表人,W代表狼,S代表山羊,V代表白菜。


    5953771

    例、渡河问题

    • 算法思想:

      用集合表示在某岸上的所有情况(16种):

      [MWSV] [MWS] [MWV] [MSV][WSV] [MW][MS][MV] [WS][WV][SV] [M][S] [V] [空]

      剩下的10种情况,按若甲经过一次渡河可变成乙,那么就在甲与乙之间连一条边,由此得到如下图G:

      MWSV MWS MWV MSV MS

      WV W S V 空

    结论:在G中找一条连接顶点MWSV与空,并且包含边数最少的路.


    5953771

    • 考虑下面swap函数的代码其中有语法错误吗?这个函数达到它的预期目标了吗?

    • void swap(int&a,int &b)

    • { int& tmp=b;

    • b=a;

    • a=tmp;

    • }


    5953771

    1.5 描述算法

    Java语言描述算法。

    1.Java程序结构

    (1)Java程序的两种类型:应用程序和applet

    • 区别:应用程序的主方法为main,其可在命令行中用命令 语句java 应用程序名来执行;

    • applet的主方法为init,其必须嵌入HTML文件,由Web浏览器或applet阅读器来执行。

      (2)包:java程序和类可以包(packages)的形式组织管理。

      (3)import语句:在java程序中可用import语句加载所需的包。

    • 例如,import java.io.*;语句加载java.io包。


    5953771

    • 2.Java数据类型

    • 对基本数据类型:在声明一个具有基本数据类型的变

    • 量时,自动建立该数据类型的对象(或称实例)。

    • 如:int k;

    • 对非基本数据类型:语句 String s; 并不建立具有数据类型String的对象,而是建立一个类型String的引用对象,数据类型为String的对象可用下面的new语句建立。

    s = new String(“Welcome”);

    String s = new String(“Welcome”);


    5953771

    3.方法

    在Java中,执行特定任务的函数或过程统称为方法(methods) 。例如,java的Math类给出的常见数学计算的方法如下表所示:


    5953771

    计算表达式 值的自定义方法ab描述如下:

    • 3.方法

    public static int ab(int a, int b)

    {

    return (a+b+Math.abs(a-b))/2;

    }

    (1)方法参数:Java中所有方法的参数均为值参数。上述方法ab中,a和b是形式参数,在调用方法时通过实际参数赋值。

    (2)方法重载:Java允许方法重载,即允许定义有不同签名的同名方法。

    上述方法ab可重载为:

    public static double ab(double a, double b)

    {

    return (a+b+Math.abs(a-b))/2.0;

    }


    5953771

    4.异常

    Java的异常提供了一种处理错误的方法。当程序发现一个错误,就引发一个异常,以便在合适地方捕获异常并进行处理。

    通常用try块来定义异常处理。每个异常处理由一个catch语句组成。

    public static void main(String [] args)

    {

    try { f ( ); }

    catch (exception1)

    { 异常处理; }

    catch (exception2)

    { 异常处理; }

    finally

    { finally块; }

    }


    5953771

    公有(public)

    私有(private)

    保护(protected)

    5.Java的类

    Java的类一般由4个部分组成:

    (1)类名

    (2)数据成员

    (3)方法

    (4)访问修饰


    5953771

    6.通用方法

    下面的方法swap用于交换一维整型数组a的位置i和位置j处的值。

    public static void swap(int [] a, int i, int j)

    {

    int temp = a[i];

    a[i] = a[j];

    a[j] = temp;

    }

    该方法只适用于

    整型数组

    以上方法修改如下:

    public static void swap(object [] a, int i, int j)

    {

    object temp = a[i];

    a[i] = a[j];

    a[j] = temp;

    }

    该方法具有通用性,适用于Object类型及其所有子类


    5953771

    7.垃圾收集

    8.递归

    Java的new运算用于分配所需的内存空间。

    例如, int [] a = new int[500000]; 分配2000000字节空间

    给整型数组a。频繁用new分配空间可能会耗尽内存。Java的垃

    圾收集器会适时扫描内存,回收不用的空间(垃圾)给new重新

    分配。

    public static int sum(int [] a, int n)

    {

    if (n==0) return 0;

    else return a[n-1]+sum(a,n-1);

    }

    计算一维整型数组前n个元素之和的递归方法


    5953771

    • Java语言的特点

      Java=

      “C++”--“复杂性和奇异性”+“安全性和可移植性”

    • Java由那些特性?

    • (1) 面向对象

    • 封装性、多态性、继承性、动态链接

    • (2) 操作平台无关性

    • 严格的语言定义:“没有依据机器的不同而不同” 或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的


    5953771

    Java

    interpreter

    Just-in-time

    compiler

    Runtime System

    Operating System

    Hardware

    • Java虚拟机

    不同的操作系统有不同的虚

    拟机.

    它类似一个小巧而高效的CPU.

    byte-code代码是与平台无关的

    是虚拟机的机器指令.

    Java字节代码运行的两种方式:

    interpreter(解释方式)

    Just-in-time(即时编译):由代码

    生成器将字节代码转换成本机

    的机器代码,然后可以以较高速

    度执行.


    5953771

    • (3) 安全问题

    • Java是在网络环境下使用的语言

    • 一个安全的网络至少要防止以下几种破坏的可能性:

    • 毁灭系统资源

    • 消耗系统资源

    • 挖掘系统或个人机密

    • 骚扰正常工作的进行


    5953771

    限定对象的

    存取权限

    系统堆栈溢出

    参数类型一致

    Java源程序

    (.java文件)

    Bytecode 载入器

    Bytecode检查

    Java编译器

    Bytecode 解释器

    程序执行系统

    Java Bytecode

    (.class文件)

    系统执行平台

    WWW浏览器

    限制Java小应用程序

    的不正当使用


    5953771

    • (4) 多线程

    • Java提供现成的类Thread,只要继承这个类就可以编写多线程的程序。

    • (5) Java与C及C++的区别

    • 不再有#include 和#define 等于处理功能

    • 不再有structure,union及typedef

    • 不再有函数、不再有指针、不再有多重继承

    • 不再有goto

    • 不再有操作符重载(Operatior Overloading)

    • 取消自动类型转换,要求强制转换


    5953771

    • Java的开发环境

    • Java开发环境 JDK

    • JDK中有Java编译器和bytecode解释器Applwtviewer是小应用程序的bytecode解释器

    • JDK的安装

    • 直接执行JDK.exe


    5953771

    产生如下目录结构

    java\bin的目录下包含义下主要文件:

    javac: Java编译器, 用来将java程序编译成

    Bytecode

    java: Java编译器,执行已经转换成Bytecode的

    java应用程序.

    jdb: Java调试器, 用来调试java程序

    javap: 反编译,将类文件还原回方法和变量.

    javadoc:文档生成器,创建HTML文件

    appletviwer : Java解释器, 用来解释已经转换成

    Bytecode的java小应用程序.


    5953771

    • JAVA 的API中的类组织成8个包

    • Java.applet 包含所有的实现的applets的类

    • Java.awt 包含抽象窗口工作集中的图形/文

    • (java.awt.image) 本/窗口/GUI类

      (java.awt.peer)

      Java.io    包含所有的输入输出类

      java.lang 包含所有的基本语言类

      java.net   包含所有实现网络功能的类

      java.util   包含有用的数据类型类


    5953771

    class HelloWorldApp

    { public static void main(String args[])

    {

    System.out.println(“Hi, ”+args[0]);

    }

    }

    • Java应用和Java小应用程序

    • 编辑存盘:主类名(含有main方法)和

      文件名要一致性 HelloWorldApp.java

    • 编译程序 : javac HelloWorldApp.java

    • 运行程序 : java HelloWorldApp “myjava”

    • 运行结果 : Hi, myjava


  • Login