/*****************************************************
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. Toast 使用方法大全

    原文地址:http://daikainan.iteye.com/blog/1405575 Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户, ...

  2. PHP基础知识总结(四) 留言板例子 知识应用

    1.留言板显示页面:note.php <?php $host = "127.0.0.1"; $user = "root"; $pwd = "zs ...

  3. PostgreSQL9.6的新特性并行查询

    PostgreSQL在2016年9月发布了9.6版本,在该版本中新增了并行计算功能,目前PG支持的并行查询主要是顺序扫描(Sequencial Scans),并且支持部分链接查询(join)和聚合(a ...

  4. HDU3450_Counting Sequences

    题意: 让你从所给的序列中找到他的子序列,使他们相邻之间差距不超过d,问有多少个转移的子序列 这题第一眼大概就知道是状态转移,sum[i]表示以前i个中有多少个,那么sum[i+1]比sum[i] 多 ...

  5. Cocos2d-x之Layer

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. Layer是处理玩家事件响应的Node子类.与场景不同,层通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸,加速度 ...

  6. 一张图搞清楚Java异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

  7. leetcode.矩阵.240搜索二维矩阵II-Java

    1. 具体题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性:每行的元素从左到右升序排列:每列的元素从上到下升序排列. 示例: 现有矩阵 ...

  8. NOIp2018 爆零记

    几个月没动博客了,原以为NOIp之后能有个喜报让我重新更博的 我就讲讲自己的爆零经历吧 Day 0: 洛谷签到第99天,明天签到第100天, 吉利得很(flag已立) 去年第一次参加NOIp,那次Da ...

  9. Javascript连续赋值

    Javascript对象属于引用类型,将对象赋值给变量相当于将对象地址赋值给变量 let a = {n: 1}; let b = a; a.x = a = {n: 2}; //运算符的优先级 cons ...

  10. java虚拟机规范(se8)——java虚拟机结构(六)

    2.11 指令集简介 java虚拟机指令由一个字节的操作码,接着时0个或多个操作数组成,操作码描述了执行的操作,操作数提供了操作所需的参数或者数据.许多指令没有操作数只包含一个操作码. 如果忽略异常处 ...