您的位置:首页 > 其它

统计攻击ip

2012-10-23 10:09 211 查看
http://topic.csdn.net/u/20081224/16/23041dbb-b0b9-46c5-9ff7-3a4dede2a6e3.html

给你1亿个ip地址和每个ip访问的时间(00:00:00=<时间<=23:59:59,并且已经按照时间排好序了),然后给定一段时间X,定义在X内如果某IP的访问次数超过Y次,则判定该IP为攻击IP。要求输出所有攻击IP。只有一组测试用例。第一行输入IP记录数(即10万),时间X(10=<X<=120秒),次数Y(2=<Y<=100)。输出按访问的时间顺序输出,IP重复不再输出。

输入示例:(为了方便,只给出8个,意思意思)

8 10 2

10.254.82.126 00:00:39

10.85.124.135 00:00:40

10.254.82.126 00:00:44

10.254.82.126 00:00:44

10.1.82.125 00:00:45

10.85.124.135 00:00:48

10.254.82.126 00:00:48

10.254.82.126 00:00:49

输出示例:

10.254.82.126

10.85.124.135

struct ipChain{

char ip[16];

char date[16];

}ipArray[100000];

在这个ipArray上 维持 2个动态标记: head 初始为0 tail为的index为 ipArray[tail].date - ipArray[head].date <= X 并且 ipArray[tail+1].date - ipArray[head].date > X。

将 tail - head + 1个元素 进行散列,加下每个ip的 count 大于Y的直接 可以输出

以后 tail++, 查看先加入的元素是否 使 ipArray[tail].date - ipArray[head].date > x, 大于 则 head++,且 散列表中其count--,一旦为0,删除之。然后 将新加入的ipArray[tail] 加入散列表 查看是否 count > Y。

这样的话 算法 应该比 O(n)差不了多少。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: