复习(10)实验的代码

学而忘言是学习的最高境界,却是产出的最劣手段,所学的东西都在心里,说不出来?
也许记忆是最棒的资本,但是诉诸载体也未尝不是一个好的方法

用最后开始复习一下这个学期做过的实验的代码


复习(10)实验的代码_第1张图片
image.png

每次访问数组太过麻烦,并且不好处理(在小根堆的时候),所以用所有图中的数据对这个结构体中的对象进行初始化


复习(10)实验的代码_第2张图片
image.png

element是用来记录并查集的
复习(10)实验的代码_第3张图片
image.png

感觉在编程的时候一个很难受的点就是始终不明白怎么样才能将对象和变量嵌进一个使用方式中去,其实就是要有模板意识,不管是什么样子的变量或是变量都用模板t来替代,出现问题再解决


复习(10)实验的代码_第4张图片
image.png

小根堆是储存在一个数组中的
复习(10)实验的代码_第5张图片
image.png

总是从当前可以查询的第一个父子关系开始,并且i是可以变化的点,如果父母比当前的点还要大的话,就要改变,将父母的值赋给i,然后将i上移,对应的父母也要上移,
复习(10)实验的代码_第6张图片
image.png

删除是从上至下,所以根据i设定child,插入是从下到上,所以是根据i设定parent
复习(10)实验的代码_第7张图片
image.png

复习(10)实验的代码_第8张图片
image.png

首先将所有的点和对应的代价用来初始化带权边,然后将其压入,依次取出,并且用带权边的两个顶点来建立并查集,用带权边(实际上是带权边的权重)来初始化小根堆,然后将最小值依次取出,如果已经处在同一个并查集,那么就是加进去会成为环,补补课,否则挑选进入,并且进行合并并查集,然后将对应的结果加到权重之总和上


复习(10)实验的代码_第9张图片
image.png

同样还是带权边的声明
image.png

声明数组来储存
image.png

复习(10)实验的代码_第10张图片
将带权边中的权重插进去

复习(10)实验的代码_第11张图片
将对应的边置为对应的空值

复习(10)实验的代码_第12张图片
image.png

迪杰斯特拉算法是用来求取一个点到其他所有点之间的最短距离。
首先要记录各个点到当前这个点所最近的距离,这个距离是通过赋值实现的,对于s来说,一开始的最短距离就是自己
同时还要建立一个是否被用过的数组,每次遍历就是从所有的距离中选出一个最小的,并且将其标记为已经用过,然后用这个最小距离来对所有的两点之间进行初始化,复杂度差不多是n2
复习(10)实验的代码_第13张图片
image.png

迭代器的结构跟具体的类还是不一样的,可以使用共通的结构,也可以不是
复习(10)实验的代码_第14张图片
image.png

也就是如果这个点所形成的边不是想象中的话,那么就要继续遍历,如果是的话,那么移动到下面一个,然后进行赋值和返回
复习(10)实验的代码_第15张图片
image.png

复习(10)实验的代码_第16张图片
image.png

再复习一下关于迭代器的内容,那就是必须是拥有跟原类结构相通的数据成员,并且能够进行相应的遍历和访问(本质上是同一地址),然后在类内定义返回类型为迭代器指针的函数,并且用相应的顶点来进行初始化,初始化之后返回

调用形式一般有两种,一个是通过设定end和start,实现数据的访问(设定成比较指针也可以),一个是通过next的访问直接返回下一个对应节点和地址指针的数值
一种方式是直接引用,因为最终我们是对值操作,只要能够返回值就可以了,对于这个题目来说,迭代器就是一种选择


复习(10)实验的代码_第17张图片
image.png

复习(10)实验的代码_第18张图片
image.png

复习(10)实验的代码_第19张图片
image.png

复习(10)实验的代码_第20张图片
image.png

复习(10)实验的代码_第21张图片
image.png

邻接链表,通过若干个链表的数组组合而成
复习(10)实验的代码_第22张图片
image.png

总体来说,其实一个邻接链表使用单点带权就可以表示了,即——每一个点的内容都是从顶点到当前点的距离以及对应的每个点的数字,通过传导进去的带权边,分别取定对应的起始点和终结点,并且将两个点对应地赋进去一个邻接链表中,
image.png

最好的方法就是,保持传导的变量的形式,在每一次函数的开始都对对应的变量进行转换
邻接链表可以说是从链表数组和带权边派生过来的
复习(10)实验的代码_第23张图片
image.png

也就是说,对应的节点的元素本身就是从一开始记录的,不存在第一个节点就是顶点的情况
任何一个值都有可能是具体的数据结构之一
复习(10)实验的代码_第24张图片
image.png

只要是压入的肯定是没有访问的,压入之后就要访问,从访问取出来的肯定已经被压入过了
复习(10)实验的代码_第25张图片
image.png

构造函数,初始化函数,是最常用的函数
复习(10)实验的代码_第26张图片
image.png

复习(10)实验的代码_第27张图片
共通之处

区分弗洛伊德和迪杰斯特拉算法——前者是用所有的点对所有的两点重复调整n遍,后者是设定一个取用值,用每个点对一个点到另外一个点的距离最小值进行调整
复习(10)实验的代码_第28张图片
image.png

复习(10)实验的代码_第29张图片
image.png

复习(10)实验的代码_第30张图片
image.png

复习(10)实验的代码_第31张图片
image.png

复习(10)实验的代码_第32张图片
image.png

复习(10)实验的代码_第33张图片
image.png

复习(10)实验的代码_第34张图片
image.png

复习(10)实验的代码_第35张图片
image.png

复习(10)实验的代码_第36张图片
image.png

复习(10)实验的代码_第37张图片
image.png

复习(10)实验的代码_第38张图片
image.png

复习(10)实验的代码_第39张图片
image.png

复习(10)实验的代码_第40张图片
一种选择排序

选择排序——每次选取当前插入点,再选取应插入点,若是不能插入,则直接退出,若是可以,就退换
冒泡排序——依次将最大的元素冒上去,若是有一次失败则退出
插入排序——依次进行将一个点插入到前方的序列中的操作
复习(10)实验的代码_第41张图片
image.png

复习(10)实验的代码_第42张图片
image.png

复习(10)实验的代码_第43张图片
image.png

复习(10)实验的代码_第44张图片
image.png

复习(10)实验的代码_第45张图片
众所周知pairnode是一个字典对,而散列表是对于字典对来进行操作的

复习(10)实验的代码_第46张图片
image.png

复习(10)实验的代码_第47张图片
image.png

哈希表,也就是链表,是为了实现字典对的存储


复习(10)实验的代码_第48张图片
image.png

复习(10)实验的代码_第49张图片
image.png

复习(10)实验的代码_第50张图片
image.png

删除的具体操作就是将删除节点之后的一个节点删除,并将这个节点移动过来(删除后面节点的过程又涉及到删除的重复,原则是,首先移动的地方不能比自己的起始桶还往前,还有往后移动到新的空值处,)
image.png

找到了一个当时为了糊弄助教特意弄出来的一个函数,哈哈哈哈说多了都是泪
复习(10)实验的代码_第51张图片
image.png

最后说一下及时终止的选择排序的关键,其实就是找到选择排序什么时候终止,其实所有的终止都只有有序这一个条件,对于冒泡,就是始终没有交换(那就是每一次交换看看都有没有发生),而选择排序是没有交换这个过程的,所以就要用到每次比较,由于选择排序是选定了一个终点之后从最开始到最后选取最大值,因此在这个过程中,当前已经选定的最大值跟下一个遍历点要是具有不大于的关系,就肯定不是有序的(对于最大值的选取来说,对于一个有序数组,每次遍历都会改变一次才是对的,如果没有发生改变那就是无序的,虽然不用交换max,但是至少说明下一次交换是有必要进行的了,否则的话在右边已经排好序的基础上,这时的节点如果是经过每次比较都要交换的结果产出的,那就没有必要交换(理解:如果一个点从左到右遍历,按照取较大者的原则每次都要涉及到交换的话,必然就是有序的,只要有一次没交换,那就是前面的元素大于后面的元素,就不接受,这时必须要通过排序手段来使其有序,而这只是一个过程,而不是决定之后执行到底的一个))

你可能感兴趣的:(复习(10)实验的代码)