第二次寒假作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2022OOP |
---|---|
这个作业的要求 | https://edu.cnblogs.com/campus/fzu/2022OOP/homework/12442 |
这个作业的目标 | 匹配 |
作业正文 | ...... |
其他参考文献 | ....... |
一开始的时候就是读题有点懵吧,然后后来读懂了题目,主要是感觉进制的转换非常的麻烦,先把点分十进制中的分点的各个数化成八位二进制小数再连起来再化成十进制数,一开始我看到匹配,而且是规则与数据的最佳匹配,感觉更多的可能是想到二分图匹配,然后后来写完了发现是可以多配一,不一定是一个与一个相配,然后我们数据包的规格是5乘10000左右,规则集是1*1000,其实用单纯的for语句并不会超时,我们只需要检验哪一个规则集符合数据包就可以了,但是感觉可以有更好的复杂度,因为我们for语句的作用其实就是为了查找,就可以想到先将规则集按关键字进行排序,例如先排原ip,原ip相同的情况下我们再排目标ip,再排协议,然后接下来我们的规则集就是有一定顺序的,顺序就代表可以使用二分查找,但是排序的时候一定要把原来的规则编号记以下,然后可以做在线查找,进来一个数据集,我们直接查找规则集中第一个比数据集原ip小的,再找第一个比数据集目标ip小的,再找第一个比数据集协议小的,这三个取一个max,然后从这个max开始,去找符合端口的第一个就可以了。
以上就是我的思路,sort的复杂度顶多就nlogn,然后后面的查找差不多是n*(logn)三次方,而logn不会超过5,算下来复杂度优秀了许多,但是实现能力有点小烂,而且是临近ddl才想着写一下这个想法,调试出了很多问题,贴出来的代码是个半成品,在ddl后我会争取把这个改好。
接下来贴一些比较关键的代码
第一是排序
第二是三次二分查找
github的网址 https://github.com/Grind7/Grind7 求别被鞭尸