复习(10)实验的代码

2019-01-12  本文已影响369人  无所用心人

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

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


image.png

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


image.png
element是用来记录并查集的
image.png

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


image.png
小根堆是储存在一个数组中的
image.png
总是从当前可以查询的第一个父子关系开始,并且i是可以变化的点,如果父母比当前的点还要大的话,就要改变,将父母的值赋给i,然后将i上移,对应的父母也要上移,
image.png
删除是从上至下,所以根据i设定child,插入是从下到上,所以是根据i设定parent
image.png
image.png

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


image.png
同样还是带权边的声明
image.png
声明数组来储存
image.png
将带权边中的权重插进去
将对应的边置为对应的空值
image.png
迪杰斯特拉算法是用来求取一个点到其他所有点之间的最短距离。
首先要记录各个点到当前这个点所最近的距离,这个距离是通过赋值实现的,对于s来说,一开始的最短距离就是自己
同时还要建立一个是否被用过的数组,每次遍历就是从所有的距离中选出一个最小的,并且将其标记为已经用过,然后用这个最小距离来对所有的两点之间进行初始化,复杂度差不多是n2
image.png
迭代器的结构跟具体的类还是不一样的,可以使用共通的结构,也可以不是
image.png
也就是如果这个点所形成的边不是想象中的话,那么就要继续遍历,如果是的话,那么移动到下面一个,然后进行赋值和返回
image.png
image.png
再复习一下关于迭代器的内容,那就是必须是拥有跟原类结构相通的数据成员,并且能够进行相应的遍历和访问(本质上是同一地址),然后在类内定义返回类型为迭代器指针的函数,并且用相应的顶点来进行初始化,初始化之后返回

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


image.png
image.png
image.png
image.png
image.png
邻接链表,通过若干个链表的数组组合而成
image.png
总体来说,其实一个邻接链表使用单点带权就可以表示了,即——每一个点的内容都是从顶点到当前点的距离以及对应的每个点的数字,通过传导进去的带权边,分别取定对应的起始点和终结点,并且将两个点对应地赋进去一个邻接链表中,
image.png
最好的方法就是,保持传导的变量的形式,在每一次函数的开始都对对应的变量进行转换
邻接链表可以说是从链表数组和带权边派生过来的
image.png
也就是说,对应的节点的元素本身就是从一开始记录的,不存在第一个节点就是顶点的情况
任何一个值都有可能是具体的数据结构之一
image.png
只要是压入的肯定是没有访问的,压入之后就要访问,从访问取出来的肯定已经被压入过了
image.png
构造函数,初始化函数,是最常用的函数
image.png
共通之处
区分弗洛伊德和迪杰斯特拉算法——前者是用所有的点对所有的两点重复调整n遍,后者是设定一个取用值,用每个点对一个点到另外一个点的距离最小值进行调整
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
一种选择排序
选择排序——每次选取当前插入点,再选取应插入点,若是不能插入,则直接退出,若是可以,就退换
冒泡排序——依次将最大的元素冒上去,若是有一次失败则退出
插入排序——依次进行将一个点插入到前方的序列中的操作
image.png
image.png
image.png
image.png
众所周知pairnode是一个字典对,而散列表是对于字典对来进行操作的
image.png
image.png

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


image.png
image.png
image.png
删除的具体操作就是将删除节点之后的一个节点删除,并将这个节点移动过来(删除后面节点的过程又涉及到删除的重复,原则是,首先移动的地方不能比自己的起始桶还往前,还有往后移动到新的空值处,)
image.png
找到了一个当时为了糊弄助教特意弄出来的一个函数,哈哈哈哈说多了都是泪
image.png
最后说一下及时终止的选择排序的关键,其实就是找到选择排序什么时候终止,其实所有的终止都只有有序这一个条件,对于冒泡,就是始终没有交换(那就是每一次交换看看都有没有发生),而选择排序是没有交换这个过程的,所以就要用到每次比较,由于选择排序是选定了一个终点之后从最开始到最后选取最大值,因此在这个过程中,当前已经选定的最大值跟下一个遍历点要是具有不大于的关系,就肯定不是有序的(对于最大值的选取来说,对于一个有序数组,每次遍历都会改变一次才是对的,如果没有发生改变那就是无序的,虽然不用交换max,但是至少说明下一次交换是有必要进行的了,否则的话在右边已经排好序的基础上,这时的节点如果是经过每次比较都要交换的结果产出的,那就没有必要交换(理解:如果一个点从左到右遍历,按照取较大者的原则每次都要涉及到交换的话,必然就是有序的,只要有一次没交换,那就是前面的元素大于后面的元素,就不接受,这时必须要通过排序手段来使其有序,而这只是一个过程,而不是决定之后执行到底的一个))
上一篇下一篇

猜你喜欢

热点阅读