2019雏鹰训练营第三次作业

热身

  1. VMware Workstation v15.5.1官方安装包。
    附上激活密钥: YZ718-4REEQ-08DHQ-JNYQC-ZQRD0

  2. Ubuntu 安装教程参考: https://blog.csdn.net/qq1326702940/article/details/82322079
    VMware安装Linux操作系统时提示不支持64位操作系统时解决方法: https://www.jb51.net/softjc/494576.html

    而我操作了那两种办法后,还是提示不支持,最后终于找到了原因,由于我的电脑没有安装杀毒软件,用的是自带的Windows安全中心,需要把内核隔离选项里面的保护内存完整性关闭,问题可解决。如下图:
    2019雏鹰训练营第三次作业_第1张图片
    调整虚拟机窗口大小,需要安装VMware Tools。工具安装以及设置共享文件夹教程如下: https://blog.csdn.net/love20165104027/article/details/83377758

  3. 打开gedit编辑器键入输出"hello world"的C语言代码,命名为"helloworld"并以".c"后缀格式保存。

    2019雏鹰训练营第三次作业_第2张图片

    在"helloworld.c"所在文件夹打开终端

    编译命令

    gcc -o helloworld helloworld.c

    运行程序命令

    ./helloworld

    结果如下:

    2019雏鹰训练营第三次作业_第3张图片

新技术

了解新技术

散列:英文为"Hash",又名"哈希"。通过哈希算法,把任意长度的输入转换成固定长度的输出,其输出值为散列值。因为不同的输入值有可能会散列成相同的输出值,所以根据散列值不能确定唯一的输入值。正是由于哈希算法不能逆运算,往往被用于密码加密场景中。

Sketch:一种基于散列的数据结构。设置哈希函数,将数据经过哈希算法运算后相同的输出值放在同一个桶中,达到减少空间开销的目的。

其将数据流投射在一个小的存储空间内作为整个数据流的概要, 这个小空间存储的概要数据称为概要图。相比存储数据流所有元素信息,用 Sketch 概要图来保留整个数据流所有元素的概要信息将占用更少的计算和存储资源, 因此它更适合于大数据时代的数据流计算模式。

——引自《基于 Sketch 数据结构的海量网络流量实时排名系统》

Count Min Sketch:基于Sketch的代表算法之一,是一个次线性空间的数据结构,由二维数组构成。用到分类的思想:将具有相同哈希值的数据流归为一类,并使用同一个计数器计数。因为相同的哈希值有可能对应不同的数据流,会存在一定的误差。利用多重散列等技术来减小误差。

算法过程

  1. 创建一个宽为w,深为d的二维数组,每个元素对应一个计数器,初始化值为0。

  2. 每行都有一个互不相同哈希函数(hashi)对新来的元素进行哈希映射,将其映射到该行的某一个计数器中。

  3. 当t时刻,新元素(jt,ct)到达时,表项被更新,二维数组中的每一行分别用哈希函数计算出结果,再将映射的计数器加上ct

  4. 当所有数据流全部通过此表完成更新后, 就得到了最终的二维数组。选取最小的计数器值作为频数值。

    2019雏鹰训练营第三次作业_第4张图片

实现新技术

  1. 找到搜索结果第一个基于Python的 Count Min Sketch 项目

    项目地址: https://github.com/rafacarrascosa/countminsketch

  2. 先在windows系统下试一下

    用pip命令安装 countminsketch

     pip install countminsketch

    2019雏鹰训练营第三次作业_第5张图片

    参考Usage,根据要求编写python代码如下:

    2019雏鹰训练营第三次作业_第6张图片

    运行结果如下:

    2019雏鹰训练营第三次作业_第7张图片

    遇到的问题:

    ​ 错误提示:

    NameError: name 'xrange' is not defined

    ​ 解决方法:把"countminsketch.py"里的 xrange( )函数全部换为range( ) ,共3处。
    ​ 原因: 在Python 3中,range( )与xrange( )合并为range( )

    ​ 错误提示:

     Unicode-objects must be encoded before hashing 

    ​ 解决方法:在update( )里加" .encode("utf-8") "后缀,需改两处:

    2019雏鹰训练营第三次作业_第8张图片

    ​ 原因: update( )必须指定要加密的字符串的字符编码

  3. 在Linux上运行代码

    由于Ubuntu16.04版本系统自带Python2和Python3,但是默认是Python2。为避免python2与python3代码不兼容的问题出现,需在终端上执行以下命令把默认版本为python3。

    echo alias python=python3 >> ~/.bashrc
    source ~/.bashrc

    查看结果
    2019雏鹰训练营第三次作业_第9张图片

    遇到的问题1:
    2019雏鹰训练营第三次作业_第10张图片
    解决方法:打开 'test.txt' 时后面追加 'rb' ,只读打开一个二进制文件。
    参考:https://blog.csdn.net/a6864657/article/details/84797090

    遇到的问题2:
    2019雏鹰训练营第三次作业_第11张图片
    解决方法:str类型转bytes类型
    参考:https://www.fujieace.com/python/str-bytes.html

    修改后的代码:
    2019雏鹰训练营第三次作业_第12张图片

    在Linux平台上结果如下:
    2019雏鹰训练营第三次作业_第13张图片

你可能感兴趣的:(2019雏鹰训练营第三次作业)