/*****************************************************
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. LG1010 幂次方

    题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) ...

  2. 20175203 2018-2019-2《Java程序设计》第五周学习总结

    20175203 2018-2019-2<Java程序设计>第五周学习总结 第六章:接口与实现 本周学习了<Java程序设计>第六章的内容:接口与实现,以下为本周学习总结. 知 ...

  3. CTO 技能图谱skill-map

    # CTO 技能图谱 ### 岗位职责* 建立技术团队文化* 规划技术发展路线* 落地产品研发成果* 宣传公司技术品牌* 吸引优秀技术人才 ### 基本素质* 正直诚实的道德修养* 谦虚谨慎的工作态度 ...

  4. iOS之CAReplicatorLayer属性简介和使用

    1.CAReplicatorLayer简介 CAReplicatorLayer用于对图层进行复制,包括图层的动画也能复制!可以看着将某一段事务进行重复! #import <QuartzCore/ ...

  5. 这里ajax需要改成同步

    var flag = true; var title = $("#modal").find("input[name=groupname]").val(); /* ...

  6. 高水线 High water mark(HWM)

    所有的Oracle表都有一个容纳数据的上限(很像一个水库历史最高的水位),我们把这个上限称为“High water mark"或HWM.这个HWM是一个标记(专门有一个数据块来记录高水标记等 ...

  7. python3_列表(修改,添加和删除元素操作)

    前言:列表的定义:列表是由一系列按特定顺序排列的元素组成.即列表是一个有序集合. 1.修改列表元素 由前言知列表是一个有序集合,因此在修改列表元素时我们需指定列表名和要修改的元素的索引,再指定该元素的 ...

  8. EOJ 1127. 多边形面积(计算几何)

    题目链接:1127. 多边形面积(计算几何) 题意 按逆时针顺序给出 \(n\) 个点的坐标,求这些点围成的多边形的面积. 思路 选择多边形上的一个点,然后每次枚举之后的两个点,计算叉积,注意要保留符 ...

  9. upc组队赛2 Super-palindrome【暴力枚举】

    Super-palindrome 题目描述 You are given a string that is consisted of lowercase English alphabet. You ar ...

  10. shell awk匹配字符串(从配置文件)

    配置文件 config.properties xxx_yyy_lib_path="路径" xxx_yyy_bin_path="路径" 想通过shell来读入路径 ...