Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826437
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-15 15:07:34

给你1亿个ip地址和每个ip访问的时间(00:00:00= <时间 <=23:59:59,并且已经按照时间排好序了),然后给定一段时间X,定义在X内如果某IP的访问次数超过Y次,则判定该IP为攻击IP。要求输出所有攻击IP。只有一组测试用例。第一行输入IP记录数(即10万),时间X(10= 输入示例:(为了方便,只给出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
 
 
   一看又是字符串匹配的问题,hash喽....这里说明下,我最近练习伪码的写法,所以都没有具体的代码,但是我会很详细的描述思路,如果看了不会写代码,加上你又十万火急的需要代码的话,可以联系我!!!要酬劳的哦,just joking!!! absolutely free^_^
   我先分析如下  
1.读文件的问题
  这里 fscanf(fp,"%s %s",ip_str, time_str)
      ip_str = 10.254.82.126;
    time_str = 00:00:39;
    time_str再分成m, h, s就是
   sscanf(ip_str,"%d:%d:%d",&h,&m,&s);
 一步到位:
fscanf(fp,"%s %d:%d:%d",ip_str, &hour, &minute, &second)
 
2.hash这个说过无数次了,你不会我也没办法自己去学
  HASH,add_hash
  我这里也许好需要一个delete_hash
  typedef struct hash
   {
 
    char IP[IP_MAX_LEN];
    int count;
    int times;
    struct hash* next;
   }HASH;
  需要注意的是这里的times是需要更新的
  10.254.82.126 00:00:39
  10.85.124.135 00:00:40 
  10.254.82.126 00:00:33  
  10.254.82.126 00:00:44
  如果这里你刚好是x=2你不更新就有问题了... 
3.选取合适的hash函数之后我们就可以开始了...
  方法一是:
    while(fscanf(......)!=EOF)
     {
       .....
       add_hash(ip_str, times);
     }  
 
    add_hash(char* ip_str,uint times)
     {
      count++//与ip_str相同的list里的节点都加1
      add_list_tail;
      //我这里是添加到尾,方便每次取最早的那个,以及删除
      这里如果存在 时间小于Y话 count又是==x
       就可以打印ip了    
  
      if(时间差不大于y)
        delete_early_hash()
       //删除最早的那个,与这个删除的节点相同的都需要--
      }
    这个是个比较繁琐的,1亿的数字,理论上这个是可行的,可一旦不同的ip过多,hash又不好的话,很有可能变hash为list
 
 
方法二:
   1.从第一行数据开始取的所有x时间内的数据,假设共有x_line行
      对这个x_line行做hash 
      add_hash原则相同就是
         相同的ip的所有count+1
      如果这x_line内有count=y的话,就打印了..一旦打印了为了防止一直打印这个数,可以把打印了的count--
    
     10.254.82.120 00:00:29 
     10.85.124.135 00:00:30 
     10.254.82.126 00:00:33  
     10.254.82.126 00:00:34
     10.85.124.135 00:00:35 
     
     x=5, y=2
     这样
      10.254.82.120 00:00:29 
      10.85.124.135 00:00:30 
      10.254.82.126 00:00:33  
      10.254.82.126 00:00:34
      打印10.254.82.126
   
    这样
     10.85.124.135 00:00:30 
     10.254.82.126 00:00:33  
     10.254.82.126 00:00:34
     10.85.124.135 00:00:35 
     也打印10.254.82.126
     
    
   2.再取x_line+1行的时候,第一行的数据就可以delete了,将这个   
     x_line+1的数据也好处理,之前的结构还可以用!直到取到某行的时间大于第二行的数据+x,数据内的操作如上.
   3.如此重复下去.
     
   好了说的我自己都快糊涂了,这个题目2小时搞定都有点悬....大致思路如此还有很多需要考虑的
阅读(984) | 评论(0) | 转发(0) |
0

上一篇:堆内存释放的奥秘

下一篇:八皇后问题

给主人留下些什么吧!~~