第二次作业补充

第二次作业补充

前言

这篇文章只能算是对第二次作业的一个补充和完善,与第三次作业要求的优化算法没啥关系,确实没怎么优化。

一、 第二次作业遗留问题

这些东西其实应该在第二次作业中完成,但一拖再拖拖到了第三次作业来完成。

1、CIDR地址块

上次作业中,因为没有考虑到CIDR地址块问题,选择直接将数据集的十进制IP地址直接转换成点分十进制后进行匹配,导致测试数据时有部分数据答案不正确。这次了解了CIDR地址块的相关知识后,选择将规则集的IP地址转换。

转换IP地址思路:先把四个十进制数字转换成32位的二进制数字(四个十进制数字分别转换为8位的二进制字符串后拼接成32位),再根据网络前缀所占位数,把后面的数字全变为0或者1,然后再转换成十进制,求出IP地址上下限。(主要代码如下

之后的部分与第二次的代码大致相同。

2、运行时间

测试运行时间的这段代码是我直接在网络上复制粘贴下来的,其实有点疑惑,因为每次显示的时间好像都不同

3、遇到的问题及解决方案

①开始不知道怎么将十进制数字转换成二进制的字符串,经过搜索之后,发现有iota函数,但是要转换成八位的二进制字符串,又涉及到0不够的问题,好在后续解决了这个问题(代码如上图所示)。

②因为开始写代码的时候,就一骨碌直接往下写,没有分成一个个区域,导致最后check的时候发现部分答案不对时很难找出问题所在,得重新一个一个部分进行输出,真的很麻烦,看看是否与预期结果相同(其实主要就是转换IP地址的问题,中间测试过程中因为变量涉及太多,而且源IP地址和目的IP地址转换的代码时一样,于是复制粘贴的时候忘记修改部分变量,导致最后有部分答案并不正确,通过比对助教所给的答案和我自己输出的答案,发现有305组不同)

不过最后通过一个一个部分进行检查,解决了这个问题(检查匹配结果时出现0是真的很开心,终于对了!!)

③上面说到的运行时间问题,我一直认为会是一个固定值,但是每次的运行时间貌似都不相同,不知道是计算运行时间的方法出现了问题,还是本来就应该是这样,网上给出的答案如下图

二、第三次作业相关

1、测试失败

果然,人不能高兴的太早。当我用第三次作业提供的数据进行测试的时候,它失败了,因为它的数据量很庞大,接近50万,而我第二次所设定的数组大小远远不够,我试图将数组改大一些,发现并没有用,还是失败,事实证明,我的这段代码只适用于比较少的数据,庞大的数据是没有办法解决的……
但是后面发现,数据集的读入完全没有必要用数组读入(真的好蠢呐),只需要读入一组数据匹配一组数据就好,这时候就可以成功匹配较为庞大的数据了。
修改前:

修改后:

2、论文

提供的三篇参考论文,我只看了这篇hicuts,甚至没有看完就放弃了,论文真的很难啃。所以我打算按自己的思路看看哪里能修改优化。

3、优化思路

第一次的代码很冗长且变量很多很多,可读性其实不强,而且当代码出现问题的时候想要找出问题或者修改起来都很困难。

所以,我的优化思路非常简单粗暴:

①分模块(也是作业所要求的),减少代码量。比如说规则集中源IP地址和目的IP地址转换的过程是一模一样的,但是我第一次是直接将IP地址转换的代码两次放入整个代码中。

②cidr地址块的问题,是按照原来的代码直接将规则集中的每一条IP地址转换为32位的二进制字符串后再转换成十进制数字,还是根据网络前缀所占位数来分类讨论,将\32和其他分开来,\32的直接转换成十进制,而省去转成二进制字符串的过程。

两个优化思路还在实施中……所以第三次的作业基本上可以说是没动。

4、问题

上面思路中,优化的过程总是存在这样那样的问题,大一上的C语言确实后面学的马马虎虎,导致运用起来有点吃力。

三、参考文献

(51条消息) CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)_phpduang的博客-CSDN博客_cidr地址划分方法

(51条消息) C语言测试代码运行时间_JxufeCarol的博客-CSDN博客_c语言测试代码运行时间

posted @ 2022-02-18 23:58  seven47  阅读(28)  评论(0编辑  收藏  举报