DGIM算法(python)

这是来自一个课程的实验,要求如下:

使用自己所擅长的程序语言编写DGIM算法(近似计算窗口中1-bit的个数的算法)。

1、以01stream.txt文件为自己所写程序的输入,读取中文件中的01数据流;

2、设定窗口大小1000,以不超过50%的相对误差回答任意时刻,当前窗口中有多少个1-bit;

3、设定窗口大小2000,以不超过10%的相对误差回答任意时刻,当前窗口中有多少个1-bit;

4、编写一个精确计算当前窗口中1-bit个数的精确程序,比较精确程序在运行时间和空间和DGIM算法的差异。

基本原理就不再赘述,可以参考有关资料,简单理解就是不断弃桶、建桶、合并桶的过程,如此往复循环,最终读完所有数据,取当前时间戳在窗口中的桶,并且对最早的桶的桶大小的一半值和其他在窗口的桶的桶大小所有值求和,就是估计值。采用Python3语言

import time

bucket_n=[]#桶的列表

n_max_bucket=int(input("请输入最大相同桶的数量:"))

size_window=int(input("请输入窗口的大小:"))

time_location=int(input("请输入当前时刻(从1开始):"))



def Count_bit_act():

    bit_sum=0#统计1-bit个数

    start_time=time.time()

    with open('01stream.txt', 'r') as f:

        f.seek(0 if time_location<=size_window else 2*(time_location-size_window))#跳转到窗口大小之前行位置

        for i in range(time_location if time_location<=size_window else size_window):

            temp=f.readline()#读取值

            if temp and int(temp.strip('\n'))==1:

                bit_sum+=1

return bit_sum,time.time()-start_time



def Is_due(time_now):

    if len(bucket_n)>0 and time_now-size_window==bucket_n[0]['timestamp']:#最左边的桶的时间戳等于当前时间减去窗口大小,到期了

        del bucket_n[0]

def Merge():

    for i in range(len(bucket_n)-1,n_max_bucket-1,-1):

        if bucket_n[i]['bit_sum']==bucket_n[i-n_max_bucket]['bit_sum']:

            #存在n_max_bucket个大小相同的桶

            bucket_n[i-n_max_bucket]['bit_sum']+=bucket_n[i-n_max_bucket+1]['bit_sum']

            bucket_n[i-n_max_bucket]['timestamp']=bucket_n[i-n_max_bucket+1]['timestamp']

            del bucket_n[i-n_max_bucket+1]



def Count_bit():

    bit_sum=0

    flag_half=1

    start_time=time.time()

    with open('01stream.txt', 'r') as f:

        for i in range(time_location):

            temp=f.readline()#读取文件的值

            if temp:

                Is_due(i+1)#判断是否有桶到期

                if int(temp.strip('\n'))==1:

                    bucket={"timestamp":i+1,"bit_sum":1}#桶的结构

                    bucket_n.append(bucket)

                    Merge()#合并大小相同的桶

    for i in range(len(bucket_n)):

        bit_sum+=bucket_n[i]['bit_sum']

    bit_sum-=bucket_n[0]['bit_sum']/2

return bit_sum if len(bucket_n)>0 else 0,time.time()-start_time



bit_sum,bit_time=Count_bit()

bit_act_sum,bit_act_time=Count_bit_act()

print("当前窗口中1的估计个数为:%d,运行时间为:%f"%(bit_sum,bit_time))

print("当前窗口中1的精确个数为:%d,运行时间为:%f"%(bit_act_sum,bit_act_time))

print("误差值:",abs((bit_act_sum-bit_sum)/bit_act_sum))

附上运行结果:

这里的最大相同桶就是允许存在的最大相似桶个数,一旦超过这个数就开始合并桶,并且每次只合并时间戳最小的两个(最早的桶)

文件流类型为:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖人称王某人的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值