摘要: Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组d. 阅读全文
posted @ 2012-12-19 21:41 helloyu 阅读(848) 评论(0) 推荐(0) 编辑
摘要: 今天在编程珠玑中看到了断言assert的用法,所以就找了篇文章详细的看了一下她的用法。我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句:if(假设成立){ 程序正常运行;}else{ 报错&&终止程序!(避免由程序运行引起更大的错误) } 但是这样写的话,就会有无数个if语句,甚至会出现,一个if语句的括号从文件头到文件尾,并且大多数... 阅读全文
posted @ 2012-12-17 22:02 helloyu 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 上一节末尾提到了一个问题,在顺序数组中找到t值第一次出现的位置。其实这也是一种二分搜索的变形。思路如下:我仍然使用l和u作为数组的边界值,t就包含在l和u指示的数组范围中。但不变关系式变为x[l]<t<=x[u]和l<u,此时,我们假设n>=0,x[-1]<t以及 x[n]>=t(程序中并没有这两个元素)。二分搜索的代码如下 1 int binarySearch(int a[],int n,int t)//n为a数组的长度,t为寻找的元素 2 { 3 4 if(n<=0) 5 { 6 return -1; 7 ... 阅读全文
posted @ 2012-12-16 20:15 helloyu 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 编程珠玑中提到了 二分搜索,这也是各大公司面试和笔试的常考题,乍看一下此题很简单,用递归和循环都可以做出来,但是却隐藏了对程序员编写代码能力的考察,以及考虑事情范围的全面性。下面看一下二分搜索的循环代码 1 int binarySearch(int low , int high,int z,int a[]) 2 { 3 4 if((low>high)||low<0||high<0) 5 { 6 return -1;// 分析输入参数... 阅读全文
posted @ 2012-12-16 16:24 helloyu 阅读(184) 评论(0) 推荐(0) 编辑