目录
引语2
步骤2
正文1:基本数据结构3
线性表3
1. 线性表介绍3
2. 顺序表:向量4
3. 链表4
栈,队列7
1. 栈虚基类(Stack.h)7
2. 顺序栈和链式栈(Stack.cpp)8
3. 顺序队列9
4. 链式队列10
正文2:图背景11
历史(摘自wiki)11
柯尼斯堡的七桥11
骑士周游问题11
环游世界游戏12
四色问题13
应用14
正文3:图的表示14
图定义14
图术语14
邻接矩阵17
邻接表17
图的抽象数据结构18
具体代码实现参见参考18
参考19
图代码24
凡事没有绝对,一切皆有可能
组员:陈锦瀚 何游敏 苏江吟 方桂凯
(排名不分先后)
时间:2014年3月18日图算法讲义
引语
一切的理论都是为现实服务的。计算机的出现解决了人脑的限制,人脑不够快!《人脑与机器》说:机器的智慧不会超过人的智慧。机器就是人造的,我们用一道程序来模拟我们的思考并求出结果。人脑异常复杂,经常有第六感等超自然感觉,还可以并行地做好几件事,如:可以眼睛一边看电视,一边在洗脚,一边还在吃花生,更重要的是他竟然在和同学说话,脑袋里却在想他的女朋友。无疑,人类是有想法的很聪明的懒人:一:计算机代替人,可以提高工作效率。二:换句话,你就解放了,可以翘着腿喝咖啡,等结果。
但是!机器不知怎么做,你要教他,而且还要教得很好,故有了程序。第一:程序应该达到预期的结果,不能出错。第二:必须很快得到结果,否则你就要喝咖啡好几百年了,因为一个坏的教导会不停运行直到地老天荒。怎么办?答案:想好的算法,好的算法又要好的数据结构。
人是不能满足的高等动物,渴望我要快,更快,再快的节奏!于是,一代代又一代人研究算法,给出各种算法复杂度分析:渐进符号,程序测试等,励志突破前人,名垂千古。当然,说白了,他们是没什么事做,也只能做那件事,这就是所谓的社会分工。不要鄙视程序猿!一个不调侃自己的程序猿不是好的程序猿,一个不直面惨淡程序的程序猿也不是好的程序猿。好吧,让我们来挠腮抓头吧,进入今天的图讲解。图高端,大气,上档次,所以会讲很长很长,还会提供c++代码支持。提供c++代码原因:第一:类c,面向对象,群众基础深。第二:我喜欢。(我自己喷自己,建议改为JAVA).
一部图论就是一部计算机的心酸苦难史。所以,由我们组来讲解有关图的各种复杂关系,让我们来一场心与心的碰撞吧!以下讲义以大白话为主,不喜勿喷。
步骤
程序=算法+数据结构。我们由该公式开始讲解。
图论背景:图论来源于现实的抽象,把一些东西(object)当成点,以线连接点,这就是连小孩子都会理解的图论。为了便于解决问题:如走迷宫问题,旅行商旅行问题,找最短旅行路径问题,找最便宜旅行路径问题,找你祖宗十几代问题,考试安排问题,座位协调问题,手机无线电通讯问题,水资源调运问题,最重要的是找女朋友问题。所以,图论被扩充,定义了很多的术语,目的就是解决相应的问题。注:术语该出现的时候他自然会出现。
数据结构:为了便于在计算机中实现程序,所以要编程。从机器语言到汇编语言,再到高级语言,这些语言指导计算机做事。有一种病叫做:代码恐惧症,但是你一直会看到代码!一幅图怎么用计算机表示?抽象!怎么抽象?邻接表和邻接矩阵,而邻接矩阵和邻接表由数组和指针实现。所以有必要先介绍线性表:向量和链表,然后介绍栈和队列。而树结构,树实际上是一种特殊的图,而图也就成为最顶层的数据结构,其重要性不言而喻。以下将会用代码讲述各种数据结构,这是讲图算法的基础,超级啰嗦,不喜勿喷。
算法:实现了伟大的数据结构后,还要会用这些数据结构。Dijkstra算法(单源最短路径),Floyd算法(多源最短路径),Prim算法,Kruskal算法(最小生成树MST)已经吓退你了吧!我们会利用DFS(深度搜索)和BFS(广度搜索)以及构造的拓扑排序来实现这些算法。DFS和BFS由栈和队列实现,采用递归方法。
授课人群:接受过九年义务教育,有基本的理性和一点点的感性(可以喷我),喜欢数学(这个学科需要思维灵敏,不喜欢数学,没问题!不过,不喜欢,可以去爱嘛!)的广大的计算机爱好者。借用俺母校校训:勤奋,活泼,求实,向上。
授课基础:计算机科学导论(知道计算机基本结构),数学(一年级到十二年级),程序设计(C,C++,JAVA,PYTHON,VB,会打码),数据结构,英语(过了四级就好),心理学(心里素质必须硬)。
惨无人道的授课开始,进入正文1或者跳到正文3!都是讲数据结构的!
正文1:基本数据结构
线性表
数据的组织形式!
1. 线性表介绍
线性表是由有限节点集N,以及定义在N上的线性关系r所组成的线