计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。

Slides:



Advertisements
Similar presentations
第二章 中药药性理论的现代研究 掌握中药四性的现代研究 掌握中药五味的现代研究 掌握中药毒性的现代研究 了解中药归经的现代研究.
Advertisements

河內塔(Hanoi)問題.
举国上下抗击风雪灾害专刊 温暖行动 灾情告急年关近 万众一心齐抗灾 可歌可泣留千古 温暖行动遍人间 导读提示 阳关雨露出版社
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
作文选刊 作文之窗
每节一经典 用系统的观点观察问题 总体设计,逐步求精 计算机科学学院 王小明 (博士/教授/博士生导师)
请说出牛顿第一定律的内容。.
快乐假期 2010年第6期 总第54期 贝尔芬 主编 暑期作文专刊 《快乐假期》杂志社 出版.
CH02 计算学科中的科学问题 概 述.
“八皇后”问题 崔萌萌 吕金华.
老师:如何撰写教研文章? 主讲:石修银 谨以此赠与孜孜追求的老师 谨以此赠与改变人生的老师.
依“标”据“本”,命制考题 发表于《数学教学》2006年第9期 (华东师大核心“CN”刊物)
第十一章 真理与价值 主讲人:阎华荣.
12星座 对于星座,你又知道多少呢? 第一刊.
第七章 固 定 资 产.
数学通报简介 ——如何写稿及投稿 数学通报 郑亚利 2014年8月.
推进《玻璃钢制品工》 国家职业资格证书制度的建设
本期导读: 1版 习 惯 2版 的 十个做人的好习惯 3版 力 4版 量 5版 6版 7版 8版
行政院國軍退除役官兵輔導委員會 嘉義榮民醫院.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
高级语言程序设计 主讲人:陈玉华.
物件導向程式設計 (Object-Oriented rogramming)
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
函數(一) 自訂函數、遞迴函數 綠園.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
If … else 選擇結構 P27.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
第八章 函数.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
算法的基本概念.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
第二章 程序的灵魂--算法.
計數式重複敘述 for 迴圈 P
C Programming in Action
东北林业大学 陈宇 ACM程序设计 东北林业大学 陈宇
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
公立學校教職員退休資遣撫卹條例重點說明 苗栗縣政府人事處編製 主講人:陳處長坤榮 107年5月2日.
鄧姚文 資料結構 第一章:基本概念 鄧姚文
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
C语言复习2----函数.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
C程序设计.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
函数 概述 模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 开发方法: 自上向下,逐步分解,分而治之
指標
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C程序设计.
第5章 函 数.
第一章 C语言概述 教师:周芸.
C语言程序设计 李祥 QQ:
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第6章 预 处 理.
國民年金 np97006.
演算法的效率分析.
第二章 类型、对象、运算符和表达式.
累堆排序法 (Heap Sort).
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
挑戰C++程式語言 ──第9章 函數.
程序设计基础.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第七章  数 组.
遞迴 Recursion.
第十二章 位运算.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
隨機函數.
Presentation transcript:

计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。

1 哥尼斯堡七桥问题 17世纪的东普鲁士有一座哥尼斯堡城,城中有一座奈佛夫岛,普雷格尔河的两条支流环绕其旁,并将整个城市分成北区、东区、南区和岛区4个区域,全城共有7座桥将4个城区相连起来。 通过这7座桥到各城区游玩,问题:寻找走遍这7座桥的路径,要求过每座桥只许走一次,最后又回到原出发点。

问题的抽象 1736年,大数学家列昂纳德·欧拉(L.Euler)发表了关于“哥尼斯堡七桥问题”的论文。 他抽象出问题最本质的东西,忽视问题非本质的东西(如桥的长度等),从而将哥尼斯堡七桥问题抽象为一个数学问题,即经过图中每边一次且仅一次的回路问题了。

欧拉回路 欧拉给出了哥尼斯堡七桥问题 的证明,还用数学方法给出了三条判定规则(判定每座桥恰好走过一次,不一定回到原点, 即对欧拉路径的判定): 如果通奇数座桥的地方不止两个,满足要求的路线是找不到的。 如果只有两个地方通奇数座桥,可以从这两个地方之一出发,找到所要求的路线。 如果没有一个地方是通奇数座桥的,则无论从哪里出发,所要求的路线都能实现。 根据第3点,可以得出,任一连通图存在欧拉回路的充分必要条件是所有顶点均有偶数度.

问题:在某个图G中,能不能找到这样的路径,即从一点出发不重复地走过所有的结点,最后又回到原出发点。 哈密尔顿回路问题 问题:在某个图G中,能不能找到这样的路径,即从一点出发不重复地走过所有的结点,最后又回到原出发点。 “哈密尔顿回路问题”与“欧拉回路问题”的不同点 “哈密尔顿回路问题”是访问每个结点一次,而“欧拉回路问题”是访问每条边一次。 对图G是否存在“欧拉回路”前面已给出充分必要条件,而对图G是否存在“哈密尔顿回路”至今仍未找到满足该问题的充分必要条件。

图论的形成和发展 欧拉的论文为图论的形成奠定了基础。 图论已成为我们对现实问题进行抽象的一个强有力的数学工具。 图论已广泛地应用于 计算学科 运筹学 信息论 控制论等学科 图论已成为我们对现实问题进行抽象的一个强有力的数学工具。 图论在计算学科中的作用越来越大,图论本身也得到了充分的发展。

2 可计算问题与不可计算问题 计算学科的问题,无非就是计算问题,从大的方面来说,分可计算问题与不可计算问题。可计算问题是存在算法可解的问题,不可计算问题是不存在算法可解的问题。 为便于理解,下面,分别以梵天塔(Hanoi,又译为汉诺)问题和停机问题来介绍可计算问题与不可计算问题。

2.1 排序问题 随机给出n个数,要求对它们进行排序。比如: 8,2,7,6,4,12 对于排序问题,有多种算法。 2.1 排序问题 随机给出n个数,要求对它们进行排序。比如: 8,2,7,6,4,12 对于排序问题,有多种算法。 一种选择排序算法是:从n个数中挑出最小的数,再从n-1个数中挑出第二小的数….. 那么,在这些众多的算法中,如何来比较谁的速度更快? 事后分析:机器的运行时间? 事前分析:与问题规模有关的表达式,表示算法中基本操作的执行次数。

一种选择排序算法是:从n个数中挑出最小的数,再从n-1个数中挑出第二小的数….. 时间复杂性与n有关,大概是n+(n-1)+…+1=1/2(n(n+1)),忽略常数项,取最大的指数,记为O(n2)。 最快的算法是快速排序算法,时间复杂度为O(nlogn)。

2.2 梵天塔问题 相传印度教的天神梵天在创造地球这一世界时,建了一座神庙,神庙里竖有三根宝石柱子,柱子由一个铜座支撑。梵天将64个直径大小不一的金盘子,按照从大到小的顺序依次套放在第一根柱子上,形成一座金塔(如图2.3所示),即所谓的梵天塔(又称汉诺塔)。天神让庙里的僧侣们将第一根柱子上的64个盘子借助第二根柱子全部移到第三根柱子上,即将整个塔迁移,同时定下3条规则:

每次只能移动一个盘子; 盘子只能在三根柱子上来回移动,不能放在他处; 在移动过程中,三根柱子上的盘子必须始终保持大盘在下,小盘在上。

递归算法(重点掌握) 递归是一种特别有用的工具,不仅在数学中广泛应用,在日常生活中也常常遇到。 以下使用递归算法来解决梵塔问题。

递归算法 在数学中几个熟知的数学定义: (2) 若t1,t2是树,则 也是树

递归 递归算法包括递推和回归两部分: 递推 就是为了得到问题的解,将它推到比原问题更简单的问题求解。 例如:n!=f(n),为了计算f(n),将它推到比原问题更简单的问题f(n-1),即f(n)=f(n-1)*n,而计算f(n-1)比计算f(n)简单,因为f(n-1)比f(n)更加接近已知解0!=1 使用递推要注意 (1)递推应有终止之时,例如当n=0时,0!=1为递推终止条件,所谓终止条件就是指在此条件下问题的解时明确的,缺少终止条件会使算法失败。 (2)简单问题表示离递推终止条件更接近的问题。简单的问题与原问题其解的算法是一致的,其差别主要反映在参数上,例如,f(n-1)比计算f(n)更简单,因为f(n-1)比f(n)参数少1。参数变化使问题递推到有明确解。

递归算法 回归 指当简单问题得到解后,回归到原问题的解上来。例如,当计算完(n-1)!后,回归计算n*(n-1)!,即得到n!的值。 使用回归要注意 (1)当回归到原问题的解时,算法中所涉及的处理对象是关于当前问题的,即递归算法所涉及的参数与局部处理对象是有层次的。当解一问题的时候,有它的一套参数与局部处理对象。当递推进入一个"简单问题"的时候。这套参数与局部对象便隐藏起来,在解简单问题的时候又有它自己的一套。当回归时,原问题的一套参数与局部处理对象又活跃起来了。 (2)回归到原问题已经得到问题的解,回归并不引起其他动作。

递归的例子 计算n! 根据公式 n!=1 当n=0 =n*(n-1)! 当n!=0 函数参数为n int f(int n) { if (!n) return 1; else return (n*f(n-1)); }

递归的例子 斐波那契数列(fibonacci) f(0)=0 f(1)=1 f(n)=f(n-1)+f(n-2) (n>=2) int f(int n) { if (!n) return 0; else if (n==1) return 1 ; else return(f(n-1)+f(n-2)); }

梵塔问题 用A、B、C分别表示三根针 将n个盘由A移到C上的操作步骤为: (1)将A上的n-1个盘借助C移到B上 算法分析: 用A、B、C分别表示三根针 将n个盘由A移到C上的操作步骤为: (1)将A上的n-1个盘借助C移到B上 (2)把A上剩下的一个盘由A移到C上 (3)将B上的n-1个盘借助A移到C上 这样处理后,问题的规模减少1。当n=1的时候,就可以直接处理了。

穷举演算 n = 3 A B C A B C A B C A B C ( 1 ) ( 2 ) A TO C (4) C TO B ( 3 ) A TO B

穷举演算(续) A B C A B C A B C A B C ( 5 ) A TO C ( 6 ) B TO A (8 ) A TO C (7 ) B TO C

梵塔问题:子程序 /* 测试用主函数 */ main() { hanoi(N, 'A', 'B', 'C'); } /* 程序HANOI.C: 梵塔问题-*/ #include <stdio.h> #define N 3 void move(int from, int to) { printf("From %c to %c\n", from, to); } void hanoi(int n, int p1, int p2, int p3) { if(n==1) move(p1, p3); else { hanoi(n-1, p1, p3, p2); hanoi(n-1, p2, p1, p3); /* 测试用主函数 */ main() { hanoi(N, 'A', 'B', 'C'); }

当n=64时,移动次数=?花费时间=? h(n)=2h(n-1)+1 需要移动盘子的次数为: …… =2nh(0)+2n-1+…+22+2+1 = 2n-1+…+22+2+1=2n-1 需要移动盘子的次数为: 264-1=18446744073709551615

假定每秒移动一次,一年有31536000秒,则僧侣们一刻不停地来回搬动,也需要花费大约5849亿年的时间。 假定计算机以每秒1000万个盘子的速度进行搬迁,则需要花费大约58490年的时间。 这样的问题也称为难解问题,虽然理论上可以解决,但是在n值比较大的情况下,计算时间太大。对于此类问题,人类也一直在寻找是否有更快的计算算法。

2.3 算法复杂性中的难解性问题、P类问题和NP类问题 算法复杂性包括算法的空间以及时间两方面的复杂性问题,梵天塔问题主要讲的是算法的时间复杂性。

关于梵天塔问题算法的时间复杂度,可以用一个指数函数O(2n)来表示,显然,当n很大(如10000)时,计算机是无法处理的。相反,当算法的时间复杂度的表示函数是一个多项式,如O(n2)时,则可以处理。因此,一个问题求解算法的时间复杂度大于多项式(如指数函数)时,算法的执行时间将随n的增加而急剧增长,以致即使是中等规模的问题也不能求解出来,于是在计算复杂性中,将这一类问题称为难解性问题。人工智能领域中的状态图搜索问题(解空间的表示或状态空间搜索问题)就是一类典型的难解性问题。

在计算复杂性理论中,将所有可以在多项式时间内求解的问题称为P类问题,而将所有在多项式时间内可以验证的问题称为NP类问题。由于P类问题采用的是确定性算法,NP类问题采用的是非确定性算法,而确定性算法是非确定性算法的一种特例,因此,可以断定PNP。

2.4 证比求易算法 为了更好地理解计算复杂性的有关概念,我国学者洪加威曾经讲了一个被人称为“证比求易算法”的童话,用来帮助读者理解计算复杂性的有关概念,大致内容如下。 从前,有一个酷爱数学的年轻国王艾述向邻国一位聪明美丽的公主秋碧贞楠求婚。公主出了这样一道题:求出48 770 428 433 377 171的一个真因子。若国王能在一天之内求出答案,公主便接受他的求婚。

国王回去后立即开始逐个数地进行计算,他从早到晚,共算了三万多个数,最终还是没有结果。国王向公主求情,公主将答案相告:223 092 827是它的一个真因子。国王很快就验证了这个数确能除尽48 770 428 433 377 171。公主说:“我再给你一次机会,如果还求不出,将来你只好做我的证婚人了。”

国王立即回国,并向时任宰相的大数学家孔唤石求教,大数学家在仔细地思考后认为这个数为17位,则最小的一个真因子不会超过9位, 他给国王出了一个主意:按自然数的顺序给全国的老百姓每人编一个号发下去,等公主给出数目后,立即将它们通报全国,让每个老百姓用自己的编号去除这个数,除尽了立即上报,赏金万两。

顺序算法和并行算法 国王最先使用的是一种顺序算法,其复杂性表现在时间方面, 后面由宰相提出的是一种并行算法,其复杂性表现在空间方面。 直觉上,我们认为顺序算法解决不了的问题完全可以用并行算法来解决,甚至会想,并行计算机系统求解问题的速度将随着处理器数目的不断增加而不断提高,从而解决难解性问题,其实这是一种误解。 当将一个问题分解到多个处理器上解决时,由于算法中不可避免地存在必须串行执行的操作,从而大大地限制了并行计算机系统的加速能力。

阿达尔定律 设f为求解某个问题的计算存在的必须串行执行的操作占整个计算的百分比,p为处理器的数目,Sp为并行计算机系统最大的加速能力,则 串行执行操作仅占全部操作1%,解题速度最多也只能提高一百倍。 对难解性问题而言,提高计算机系统的速度是远远不够的,而降低算法复杂度的数量级才是最关键的问题。

2.5 P= NP ? P类问题——存在多项式时间的算法的一类问题; P=NP?如果P=NP,则所有在多项式时间内可验证的问题都将是在多项式时间内可求解(或可判定)的问题。 要证明P≠NP,目前还无法做到这一点 。

NP完全问题 在P=?NP问题上,库克(S.A.Cook)等人认为NP类中的某些问题的复杂性与整个类的复杂性有关,当这些问题中的任何一个存在多项式时间算法时,则所有这些NP问题都是多项式时间可解的,这些问题被称为NP完全性问题。 多达数千个的NP完全性问题。有代表性的有:哈密尔顿回路问题、旅行商问题(也称货郎担问题)、划分问题、带优先级次序的处理机调度问题、顶点覆盖问题等。