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已上传可供下载 ...
随机推荐
- redis shell命令
APPEND key value追加一个值到key上 AUTH password验证服务器 BGREWRITEAOF异步重写追加文件 BGSAVE异步保存数据集到磁盘上 BLPOP key [key ...
- 漫谈C语言结构体【转】
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- VMware里克隆出来的CentOS Linux device eth0 does not seem to be present, delaying initialization
解决办法:1.ifconfig eth1 确定新网卡的MAC地址.nmcli con 确定新网卡的UUIDvim /etc/udev/rules.d/70-persistent-net.rules把原 ...
- DataFrame读取CSV文件
读取csv的代码: print pd.read_csv("ex1.csv") print "\n" print "Can also use read ...
- openstack部署安装
OpenStack实战 准备环境 controller 10.0.0.11 compute1 10.0.0.31 常用服务端口 mariadb:3306 memcached:11211 消息队列:56 ...
- Java不可变对象
在创建状态后无法更改其状态的对象称为不可变对象.一个对象不可变的类称为不可变类.不变的对象可以由程序的不同区域共享而不用担心其状态改变. 不可变对象本质上是线程安全的. 示例 以下代码创建了不可变类的 ...
- 防止重复提交 aspx.net
:服务器控制.后台生成一个token,存入session或者其他缓存里面.渲染表单时,给form一个隐藏的token(令牌).用户提交表单时:先判断表单里面的token是否存在,不存在拒绝接受此数据: ...
- __user表示是一个user mode的pointer,所以kernel不可能直接使用。
__user表示是一个用户空间的指针,所以kernel不可能直接使用. #ifdef __CHECKER__# define __user __attribute__((noderef, addres ...
- Excel解析工具POI
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx 对于不同版本的EXCEL文 ...
- jsp 内置对象HTTP协议
有些对象不用声明就能够在JSP页面的脚本部分使用,这就是JSP的内置对象. JSP的内置对象有:request .response.session.application.out. 下面我们将一一介绍 ...