有两个算法最近用到的,非常好,简直舍不得分享了:)。
1)如何判断IP段和IP的关系
通过将IP段的开始IP和结束IP转成long,然后作为一个线段,将需要判断的IP转成一个点,然后判断点和线段的关系即可。这个是网上来的,不是我独创。
2)如何判断多个IP段和另外一个多个IP段的关系
两个策略来说,源地址是多个地址段或ip,目标地址也是多个地址段或多个ip,相当于知道了单个元素的关系,如何判断两个集合的关系,这个说实话有点难度,自己想了很久,开始是简单的if判断,导致代码很乱,还可能判断错。
后面设计的逻辑如下:
将两个集合元素,每个都单独进行比较,比如A集合为三个IP或IP段;
B集合有四个IP或IP段,那么就得到了一个3*4的矩阵信息。
每个元素的结果用aij标示 i标示是A的第i个元素,j标示是B的第j个元素。
假设元素e包含f的返回值为2,f包含e的返回值是3。
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a11 = a1 * b1
a12 = a1 * b2
a13 = a1 * b3
a14 = a1 * b4
两个集合的关系目前来说只有几种:
1)没有关系,在矩阵上标示为数字均为0 ,这个通过循环相加结果为0得到没有关系。
2)A集合包含B集合:
如果a11 为2,则说明B集合中的第一个被包含了;
如果a22 为2 ,则说明B集合中的第二个包包含了;
如果a13为2,则说明B集合中的第三个元素被包含了;
如果a14为2 ,则说明B集合中的第四个元素被包含了;
这样说明B集合的所有元素均被A集合包含,所以判断规则就是
所有元素中等于2个个数,且二维下标不同的和B的集合大小相同。
3) 如果是B集合包含A结合
则有类似的值:
a11 = 3
a22 =3
a31 =3
所有元素中等于3的个数,且一维下标不同的和A的集合大小相同。
网友评论