图算法讲义

图算法讲义


引语


一切的理论都是为现实服务的。计算机的出现解决了人脑的限制,人脑不够快!《人脑与机器》说:机器的智慧不会超过人的智慧。机器就是人造的,我们用一道程序来模拟我们的思考并求出结果。人脑异常复杂,经常有第六感等超自然感觉,还可以并行地做好几件事,如:可以眼睛一边看电视,一边在洗脚,一边还在吃花生,更重要的是他竟然在和同学说话,脑袋里却在想他的女朋友。无疑,人类是有想法的很聪明的懒人:一:计算机代替人,可以提高工作效率。二:换句话,你就解放了,可以翘着腿喝咖啡,等结果。



但是!机器不知怎么做,你要教他,而且还要教得很好,故有了程序。第一:程序应该达到预期的结果,不能出错。第二:必须很快得到结果,否则你就要喝咖啡好几百年了,因为一个坏的教导会不停运行直到地老天荒。怎么办?答案:想好的算法,好的算法又要好的数据结构。



人是不能满足的高等动物,渴望我要快,更快,再快的节奏!于是,一代代又一代人研究算法,给出各种算法复杂度分析:渐进符号,程序测试等,励志突破前人,名垂千古。当然,说白了,他们是没什么事做,也只能做那件事,这就是所谓的社会分工。不要鄙视程序猿!一个不调侃自己的程序猿不是好的程序猿,一个不直面惨淡程序的程序猿也不是好的程序猿。好吧,让我们来挠腮抓头吧,进入今天的图讲解。图高端,大气,上档次,所以会讲很长很长,还会提供c++代码支持。提供c++代码原因:第一:类c,面向对象,群众基础深。第二:我喜欢。



一部图论就是一部计算机的心酸苦难史。所以,由我们组来讲解有关图的各种复杂关系,让我们来一场心与心的碰撞吧!以下讲义以大白话为主,不喜勿喷。



步骤


程序=算法+数据结构。我们由该公式开始讲解。



图论背景:图论来源于现实的抽象,把一些东西(object)当成点,以线连接点,这就是连小孩子都会理解的图论。为了便于解决问题:如走迷宫问题,旅行商旅行问题,找最短旅行路径问题,找最便宜旅行路径问题,找你祖宗十几代问题,考试安排问题,座位协调问题,手机无线电通讯问题,水资源调运问题,最重要的是找女朋友问题。所以,图论被扩充,定义了很多的术语,目的就是解决相应的问题。术语省略,该出现的时候他自然会出现。



数据结构:为了便于在计算机中实现程序,所以要编程。从机器语言到汇编语言,再到高级语言,这些语言指导计算机做事。有一种病叫做:代码恐惧症,但是你一直会看到代码!图怎么用计算机表示?抽象!怎么抽象?邻接表和邻接矩阵,而邻接表和矩阵由顺序表和链表实现,顺序表和链接表又用数组和指针实现。实现之后又出现了栈,队列,优先队列,树,树实际上是一种特殊的图,而图也就成为最顶层的数据结构,其重要性不言而喻。以下将会用代码讲述各种数据结构,这是讲图算法的基础,超级��嗦,不喜勿喷。



算法:实现了伟大的数据结构后,还要会用这些数据结构。Dijkstra算法(单源最短路径),Floyd算法(多源最短路径),Prim算法,Kruskal算法(最小生成树MST)已经吓退你了吧!我们会利用DFS(深度搜索)和BFS(广度搜索)以及构造的拓扑排序来实现这些算法。DFSBFS由栈和队列实现,采用递归方法。



授课人群:接受过九年义务教育,有基本的理性和一点点的感性(可以喷我),喜欢数学(这个学科需要思维灵敏,不喜欢数学,没问题!不过,不喜欢,可以去爱嘛!)的广大的计算机爱好者。借用俺母校校训:勤奋,活泼,求实,向上。


授课基础:计算机科学导论(知道计算机基本结构),数学(一年级到十二年级),程序设计(C,C++,JAVA,PYTHON,VB,会打码),数据结构,英语(过了四级就好),心理学(心里素质必须硬)。



惨无人道的授课开始,进入正文!


正文1


数据结构引入


数据的组织形式!图算法必备如下:


1. 线性表是由有限节点集N,以及定义在N上的线性关系r所组成的线性结构(有序的)。


直白一点就是说所有节点可以按关系r排列成一个线性序列:n0->n1->n2->...-nk(有前趋后驱)。


抽象数据结构组成:取值空间(可能取值的集合),运算集。


存储结构:1.定长:一般数组。2.变长:动态数组,链接结构.....


spacer.gif














以下为:顺序表-向量(vector), 链表:单链表,双链表,循环单链表,循环双链表。



2. 向量


算法2.1: 插入操作


时间开销:spacer.gif,其中元素个数为k,各位置插入概率为p



spacer.gif










算法2.2:删除操作


spacer.gif











3. 链表:



spacer.gif


spacer.gif








算法3.1:查找单链表第i个结点



spacer.gif











算法3.2:插入算法



spacer.gif












spacer.gif



















算法3.3:删除算法


spacer.gif








spacer.gif











算法3.4:求长度算法


spacer.gif






spacer.gif


spacer.gif


双链表操作如右图
















主要链表:


spacer.gif



瀚哥总结:向量又称顺序表没有使用指针,可以节省计算机存储空间,而且直接下标访问数组,很容易懂!就现在随便就几G内存来说,应该是不必省空间,事实上,是要看情况的!数组固定了长度,而链表不必提前确定长度,而且还可以变长度,并且插元素,删元素不必像数组一样整排移动。所以,这两种方式只是想引起你的思考,如何权衡,学会两方面看问题。


栈,队列




你可能感兴趣的:(一代人,第六感)