暑期第三次作业
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2023summer |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2023summer/homework/12997 |
| 这个作业的目标 | 学习判断是否存在heavy-hitters(大流),并找到频数最大的k条流(Top-k问题) |
1.检测出数据集中的heavy-hitters并解决Top-k问题
我首先定义了一个Count-Min Sketch类,用于创建Count-Min Sketch。Count-Min Sketch使用一个二维矩阵来存储计数信息,其中宽度和深度由参数width和depth指定。
接着打开捕获文件(题目的数据集有两个文件,我这里就选取第一个文件来作为数据集。),并创建Count-Min Sketch实例。然后,遍历每个数据包,检查是否具有IP层,并获取源IP地址。接下来,调用Count-Min Sketch的update方法来更新计数。在遍历结束后,关闭捕获文件。
然后,进行重要元素的检测。设置了top_k变量来指定要获取的前k个重要元素,count_threshold变量来设置计数的阈值,暂定为1000。使用Counter对象来存储重要元素及其计数。再次遍历捕获文件中的数据包,检查是否具有IP层,并获取源IP地址。然后,调用Count-Min Sketch的query
代码如下:
import pyshark
from collections import Counter
# 创建Count-Min Sketch数据结构
class CountMinSketch:
def __init__(self, width, depth):
self.width = width # Count-Min Sketch的宽度
self.depth = depth # Count-Min Sketch的深度
self.sketch = [[0] * width for _ in range(depth)] # 初始化Count-Min Sketch矩阵
def update(self, item):
# 更新Count-Min Sketch
for i in range(self.depth):
hash_value = hash((i, item)) % self.width # 使用哈希函数生成哈希值
self.sketch[i][hash_value] += 1 # 对应位置计数加1
def query(self, item):
# 查询项的最小计数
min_count = float('inf')
for i in range(self.depth):
hash_value = hash((i, item)) % self.width # 使用哈希函数生成哈希值
min_count = min(min_count, self.sketch[i][hash_value]) # 更新最小计数
return min_count
# 打开捕获文件(这里我把数据集保存到了桌面,复制它的链接即可)
cap = pyshark.FileCapture('C:/Users/z/Desktop/trace1.pcap')
# 创建Count-Min Sketch实例
cms = CountMinSketch(width=1000, depth=5)
# 遍历每个数据包
for pkt in cap:
# 检查数据包是否具有IP层
if 'IP' in pkt:
# 获取源IP地址
src_ip = pkt['IP'].src
# 更新Count-Min Sketch
cms.update(src_ip)
# 关闭捕获文件
cap.close()
# 检测重要元素
top_k = 10 # 获取前10个重要元素
count_threshold = 1000 # 设置计数阈值
counter = Counter()
for pkt in cap:
if 'IP' in pkt:
src_ip = pkt['IP'].src
# 查询Count-Min Sketch的计数
count = cms.query(src_ip)
if count >= count_threshold:
counter[src_ip] = count
# 打印最高频率流
print("最高频率流 (Top 10):")
for ip, count in counter.most_common(top_k):
print(f"IP地址: {ip}, 计数: {count}")
结果显示:


浙公网安备 33010602011771号