DGIM算法
/*****************************************************
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算法的更多相关文章
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- 虚拟dom与diff算法 分析
好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- 神经网络、logistic回归等分类算法简单实现
最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
随机推荐
- thinkcmf5 pc切换手机
1.在simplewind\cmf\common.php 里找到“获取当前主题名”添加 if(cmf_is_mobile()){ $theme = config('cmf_mobile_default ...
- ajax请求在参数中添加时间戳
ajax请求在参数中添加时间戳 参考网址
- jumpserver3.0安装
由于来源身份不明.越权操作.密码泄露.数据被窃.违规操作等因素都可能会使运营的业务系统面临严重威胁,一旦发生事故,如果不能快速定位事故原因,运维人员往往就会背黑锅.几种常见的运维人员背黑锅场景:1)由 ...
- pytest-Allure安装
mac安装allure brew install allure---安装 brew info allure---查看信息 mac端需要配置环境变量 win安装: windows/mac通用安装 • h ...
- python之命名元组的好处
collections.namedtuple() 命名元组的一个主要用途是将你的代码从下标操作中解脱出来举例使用 # 使用 from collections import namedtuple Sub ...
- JAVA求解质因数
/** * 求质因数 * @param n * @return */ public static List<Integer> generatePrimeFactors(int n){ Li ...
- Input标签文件上传,使用详解
1.html添加标签按钮 <button ion-button (click)="selectVideo()">添加</button> <input ...
- 2018-2-13-win10-uwp-hashcash
title author date CreateTime categories win10 uwp hashcash lindexi 2018-2-13 17:23:3 +0800 2018-2-13 ...
- JS window对象 Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。
Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本. 对象属性: 查看浏览器的名称和版本,代码如下: <script type=" ...
- 前端学习(十)初识js(笔记)
js事件(公有属性) onclick="" 当点击...时! onmouseover="" 当鼠标移入...时!onmouseout="" ...