zoukankan      html  css  js  c++  java
  • DGIM算法

      1 /*****************************************************
      2 copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
      3 File name:
      4 Author:Jerey_Jobs    Version:0.1    Date: 
      5 Description:
      6 Funcion List: 
      7 *****************************************************/
      8 
      9 #include <stdio.h>
     10 #include <stdlib.h>
     11 
     12 
     13 typedef struct
     14 {
     15     unsigned int count;
     16     unsigned int time_stamp;
     17 }BARR;//桶的属性
     18 /*函数声明*/
     19 int accurate(int *wins);
     20 void merge(BARR*, int);
     21 int estimate(BARR*);
     22 void judge_file_pointer_null(FILE *fp);
     23 
     24 int window;//窗口大小
     25 int size = 0;//桶的个数
     26 
     27 int main()
     28 {
     29     //BARR barrel[276];
     30     BARR *barrel = (BARR *)malloc(150000 * sizeof(BARR));
     31     int i = 0;
     32     int data;//接收0 1
     33     int *wins;//分配窗口大小的数组
     34 
     35     printf("please input window size:
    ");
     36     scanf("%d", &window);
     37     wins = (int *)malloc(window * sizeof(int));
     38     
     39     //FILE *fp = fopen("./01stream.txt", "r");//打开文件
     40     FILE *fp = fopen("./01stream_sample.txt", "r");//打开文件
     41 
     42     judge_file_pointer_null(fp);//文件打开是否失败
     43 
     44     int win_count = 0;//窗口计数
     45 
     46     while (!feof(fp))//扫描流中的数据
     47     {
     48         fscanf(fp, "%d", &data);
     49         win_count++;
     50 
     51         if (win_count < window)
     52         {
     53             wins[win_count] = data;
     54         }
     55         else//大于窗口时
     56         {
     57             wins[win_count % window] = data;//数组下标求模
     58         }
     59 #if 1
     60         if (data == 1)//放入桶中
     61         {
     62             barrel[size].time_stamp = win_count;
     63             barrel[size].count = 1;
     64             size++;
     65             merge(barrel, size);
     66         }
     67 #endif
     68     }
     69     printf("1 estimate count :%d
    ", estimate(barrel));
     70     printf("1 accurate count :%d
    ", accurate(wins));
     71 
     72     fclose(fp);
     73     free(wins);
     74     free(barrel);
     75     system("pause");
     76     return 0;
     77 }
     78 
     79 /*合并桶*/
     80 void merge(BARR barrel[], int length)
     81 {
     82     int i, j;
     83     int count = 0;//记录最多可以存在几个相同
     84     int tmp;
     85 #if 1
     86     //判断有没有桶过期
     87     if ((barrel[length - 1].time_stamp > window))
     88     {
     89         for (i = 0; i < length - 1; i++)
     90         {
     91             if (barrel[i].time_stamp < (barrel[length - 1].time_stamp - window))//
     92             {
     93                 barrel[i].count = 0;
     94             }
     95         }
     96     }
     97 #endif
     98 
     99     //合并
    100     for (i = 0; i < length ; i++)
    101     {    
    102         count = 0;//记录窗口中的相同大小的桶的个数
    103         for (j = i + 1; j < length ; j++)
    104         {
    105             if (barrel[i].count == barrel[j].count && (barrel[i].count != 0))
    106             {
    107                 count++;
    108                 if (count == 1)
    109                 {
    110                     tmp = j;//保存时间较久的桶的下标
    111                 }
    112             }
    113         }//end of inner for
    114         if (count == 2)//如果窗口中有三个相同大小的桶则合并时间最久的两个桶
    115         {
    116                 barrel[i].count = 0;//时间戳小的舍弃,置零
    117                 barrel[tmp].count *= 2;
    118         }
    119     }//end of external for
    120 }
    121 
    122 /*DGIM估计窗口中1的数目*/
    123 int estimate(BARR *barrel)
    124 {
    125     int i;
    126     int estimate_count = 0;
    127 
    128     //打印窗口中的桶
    129     for (i = 0; i < size; i++)
    130     {
    131         if (barrel[i].count != 0)
    132         {
    133             printf("%d, %d
    ",barrel[i].time_stamp, barrel[i].count);
    134         }
    135     }
    136 
    137     int count = 0;//计数第一个窗口内的值
    138     for (i = 0; i < size; i++)
    139     {
    140         if (barrel[i].time_stamp >= 1000 - window && barrel[i].count != 0)
    141         {
    142             count++;
    143             if (count == 1)
    144             {
    145                 estimate_count += 0.5 * barrel[i].count;//最小时间戳的桶值*0.5
    146             }
    147             else
    148             {
    149                 estimate_count +=  barrel[i].count;
    150             }
    151         }
    152     }
    153 
    154     return estimate_count;
    155 }
    156 
    157 /*精确计数窗口中1的数目*/
    158 int accurate(int *wins)
    159 {
    160     int accurate_count = 0;
    161     for (int i = 0; i < window; i++)
    162     {
    163         if (*(wins + i) == 1)
    164         {
    165             accurate_count++;
    166         }
    167     }
    168     return accurate_count;
    169 }
    170 
    171 /*判断文件指针是否为空*/
    172 void judge_file_pointer_null(FILE *fp)
    173 {
    174     if (fp == NULL)
    175     {
    176         printf("file open failed!
    ");
    177         exit(0);
    178     }
    179 }
  • 相关阅读:
    PHP 使用 GET 传递数组变量
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
  • 原文地址:https://www.cnblogs.com/SimonKly/p/6838813.html
Copyright © 2011-2022 走看看