分配内存
同单链表的节点类似,数组的每一个元素都保存了两个值,数据和游标,游标类似于指针,其值是后继元素的下标。 静态链表的下标并不像普通数组那样代表顺序,而是每一个元素的cursor代表着顺序,比如要找到第二个元素,并不是下标为2的元素,而是第一个元素的cursor,这个cursor代表着第二个元素的下标值。 既然是数组,那么在分配内存的时候,内存大小是会大于数组大小的,为了防止数组的溢出,所以在静态链表中,有备用链表这么一说,没有保存数据的元素就是备用链表的一员
Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。Dijkstra算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 问题:有N个节点,M条边,求某节点到另一节点的最短距离 输入:先输入N(从0开始)代表N个节点,M条边,随后跟随N行,p1p2d,最后输入起始点st和终点ed 输出:求最短距离 例: 算法描述: ① 初始化,将图edge数组以及距离数组dis所有值置为极大量,表示不可访问,标记数组置为false 算法最多需要更新N个点才能得到最短路径,每次遍历节点也需要查询N遍其他节点与该节点的关系,所以空间复杂度应该是O(n^2);我们使用了N*N邻接表储存边,所以空间复杂度是O(n^2) 邻接矩阵实现简单,但是浪费很多空间,在稀疏图中就更加严重了
C++容器:forward_list C++中的forward_list是一种前向链表,是一种序列容器,可以在任何位置高效地插入和删除元素,它和list的区别是它只有前向指针,对于只需要单向迭代器就能完成的操作,使用forward_list比list有较高的存储效率。C++中的list是一个双向链表,也是一种序列容器,它可以在任何位置高效地插入和删除元素,支持正向迭代和反向迭代。在list中,每个元素保存在一个结点中,相邻的结点使用指针连接起来(前一个结点的后向指针指向后一个结点,后一个结点的前向指针指向前一个结点)
此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。如果分配成功则返回指向被分配内存的指针),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放
java中的final有最终的、无法改变的意思。final可以修饰非抽象类,非抽象类成员方法和变量。 1.final类不能被继承,因此final类中的方法不能被重写,默认是final类型的
操作系统的内存管理是系统中的一个重要组成部分。在计算机的运行过程中,内存是计算机的基础设施。而操作系统的任务之一就是有效地管理内存资源,以便为用户提供所需的计算能力
在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方 面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能
首先来了解Java方法中的形参和实参。 形参:用来接收调用方法时传递的参数,在被调用时才分配内存空间,一旦调用结束,就释放内存空间,所以形参只在当前方法内有效。等同于变量的定义格式例如:int number 实参:方法调用中的参数,传递值给被调用方法
最近看到了不少文章[1]都在讨论字符串之间比较的问题,问题的讨论似乎可以更深入一些。请看以下代码: 我一直都以为以上的四个布尔表达失的结果都应该是false,然后事实上只有最后两个是false。对于String这样的引用类型,"=="操作符自然是比较两个操作数是否引用同一个对象,在C#中,由于"=="运算符被重载了,使用"=="实际上是调用了Equals方法,因此需要将string进行显式类型转换为object后再进行操作
I/O多路复用这个概念被提出来以后, select是第一个实现 (1983 左右在BSD里面实现)。其函数原型如下: 该函数第一个参数表明我们要监听的文件描述符的最大值,中间的三个参数?readfds writefds exceptfds指向描述符集最后一个参数是超时时间。 它所需要的fd_set类型其实是一个__FD_SETSIZE长度bit的数组