/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/ #include <stdio.h>
#include <stdlib.h> typedef struct
{
unsigned int count;
unsigned int time_stamp;
}BARR;//桶的属性
/*函数声明*/
int accurate(int *wins);
void merge(BARR*, int);
int estimate(BARR*);
void judge_file_pointer_null(FILE *fp); int window;//窗口大小
int size = ;//桶的个数 int main()
{
//BARR barrel[276];
BARR *barrel = (BARR *)malloc( * sizeof(BARR));
int i = ;
int data;//接收0 1
int *wins;//分配窗口大小的数组 printf("please input window size:\n");
scanf("%d", &window);
wins = (int *)malloc(window * sizeof(int)); //FILE *fp = fopen("./01stream.txt", "r");//打开文件
FILE *fp = fopen("./01stream_sample.txt", "r");//打开文件 judge_file_pointer_null(fp);//文件打开是否失败 int win_count = ;//窗口计数 while (!feof(fp))//扫描流中的数据
{
fscanf(fp, "%d", &data);
win_count++; if (win_count < window)
{
wins[win_count] = data;
}
else//大于窗口时
{
wins[win_count % window] = data;//数组下标求模
}
#if 1
if (data == )//放入桶中
{
barrel[size].time_stamp = win_count;
barrel[size].count = ;
size++;
merge(barrel, size);
}
#endif
}
printf("1 estimate count :%d\n", estimate(barrel));
printf("1 accurate count :%d\n", accurate(wins)); fclose(fp);
free(wins);
free(barrel);
system("pause");
return ;
} /*合并桶*/
void merge(BARR barrel[], int length)
{
int i, j;
int count = ;//记录最多可以存在几个相同
int tmp;
#if 1
//判断有没有桶过期
if ((barrel[length - ].time_stamp > window))
{
for (i = ; i < length - ; i++)
{
if (barrel[i].time_stamp < (barrel[length - ].time_stamp - window))//
{
barrel[i].count = ;
}
}
}
#endif //合并
for (i = ; i < length ; i++)
{
count = ;//记录窗口中的相同大小的桶的个数
for (j = i + ; j < length ; j++)
{
if (barrel[i].count == barrel[j].count && (barrel[i].count != ))
{
count++;
if (count == )
{
tmp = j;//保存时间较久的桶的下标
}
}
}//end of inner for
if (count == )//如果窗口中有三个相同大小的桶则合并时间最久的两个桶
{
barrel[i].count = ;//时间戳小的舍弃,置零
barrel[tmp].count *= ;
}
}//end of external for
} /*DGIM估计窗口中1的数目*/
int estimate(BARR *barrel)
{
int i;
int estimate_count = ; //打印窗口中的桶
for (i = ; i < size; i++)
{
if (barrel[i].count != )
{
printf("%d, %d\n",barrel[i].time_stamp, barrel[i].count);
}
} int count = ;//计数第一个窗口内的值
for (i = ; i < size; i++)
{
if (barrel[i].time_stamp >= - window && barrel[i].count != )
{
count++;
if (count == )
{
estimate_count += 0.5 * barrel[i].count;//最小时间戳的桶值*0.5
}
else
{
estimate_count += barrel[i].count;
}
}
} return estimate_count;
} /*精确计数窗口中1的数目*/
int accurate(int *wins)
{
int accurate_count = ;
for (int i = ; i < window; i++)
{
if (*(wins + i) == )
{
accurate_count++;
}
}
return accurate_count;
} /*判断文件指针是否为空*/
void judge_file_pointer_null(FILE *fp)
{
if (fp == NULL)
{
printf("file open failed!\n");
exit();
}
}

DGIM算法的更多相关文章

  1. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  2. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  3. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  4. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  5. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  6. 虚拟dom与diff算法 分析

    好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM

  7. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  8. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  9. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

随机推荐

  1. 跨主机网络-overlay(18)

    docker overlay跨主机网络 .环境 docker版本 Docker version -ce, build fc4de44 3台主机 192.168.55.51 host1 192.168. ...

  2. [CSP-S模拟测试]:金(king)(高精度+模拟)

    题目传送门(内部题36) 输入格式 第一行一个整数$T$,表示数据组数. 接下来$T$行,每行两个空格隔开的整数$n,m$. 输出格式 对于每组数据,输出一行$"Yes"$或$&q ...

  3. SpringBoot之Spring@Value属性注入使用详解

    在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Va ...

  4. Spring MVC请求参数绑定 自定义类型转化 和获取原声带额servlet request response信息

    首先还在我们的框架的基础上建立文件 在domian下建立Account实体类 import org.springframework.stereotype.Controller; import org. ...

  5. linux命令行光标移动技巧

    看一个真正的专家操作命令行绝对是一种很好的体验-光标在单词之间来回穿梭,命令行不同的滚动.在这里强烈建立适应GUI节目的开发者尝试一下在提示符下面工作.但是事情也不是那么简单,还是需要知道“如何去做” ...

  6. ubuntu16安装,配置前端开发环境

    1.安装ubuntu    使用usio制作U盘安装工具 2.安装搜狗输入法 3.安装QQ 4.安装nodejs node-v0.12.4 node-v0.12.4.tar.gz root@ubunt ...

  7. Centos7防火墙使用

    修改时区 Centos7 #修改时区 timedatectl set-timezone Asia/Shanghai 开启防火墙 #添加一条规则 firewall-cmd --zone=public - ...

  8. 粗糙的区别prepareStatement:(为Statement的子类)与Statement

    区别: prepareStatement:(为Statement的子类) conn = DBFactory.getInstance().getImpl().getConnection(); //方式一 ...

  9. CSS3中的transform转换属性

    属性 transition-property 定义对象中参与过度的属性 transition-delay 延迟 transition-duration 持续时间 transition-timing-f ...

  10. 移动端(视口(meta),像素比,二倍图(图片,背景图,精灵图),css初始化(normalize.css),特殊样式,常见屏幕尺寸)

    1. 视口:(布局视口(layout viewport),视觉视口(visual viewport),理想视口(ideal viewport)) meta 视口标签 <meta  name = ...