Levenshtein distance

概念

莱文斯坦距离Levenshtein distance)是将一个单词更改为另一个单词所需的最少编辑操作次数。莱文斯坦距离允许的编辑操作包括单个字符的 替换/插入/删除。

实例

给定字符串kittensitting,前者可以通过以下步骤变换成后者:

  1. kitten → sitten (将k替换为s)

  2. sitten → sittin (将e替换为i)

  3. sittin → sitting (在尾部插入g)

无法通过更少的步骤完成替换,故两者的莱文斯坦距离为3

算法

请输入图片描述

实现

def levenshteinDistance(s1, s2):
    m = len(s1)
    n = len(s2)
    dt = []

    # 初始化距离表
    for i in range(m+1):
        temp = []
        for j in range(n+1):
            if i==0:
                temp.append(j)
            elif j==0:
                temp.append(i)
            else:
                temp.append(0)
        dt.append(temp)

    
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s1[i-1] == s2[j-1]:
                dt[i][j] = dt[i-1][j-1]
            else:
                dt[i][j] = min(dt[i-1][j], dt[i][j-1], dt[i-1][j-1]) +1 
    return dt[m][n]

A站视频信息分析

1.使用scrapy框架重写了一下a站的视频爬虫,共爬取895,799条视频信息。爬取了包括标题、播放量、弹幕数、评论数、收藏数、香蕉数量、作者信息、视频类别等信息。

2.各类别视频数量

各类别视频数量统计图

3.播放量TOP20视频(TOP1有点假,刷的)

播放量TOP20视频

4.播放量区间统计

('1-10', 9),
('10-100', 807),
('100-1k', 58297),
('1k-10k', 716989),
('10k-100k', 98948),
('100k-1m', 19524),
('1m-10m', 1164),
('10m-100m', 58),
('>100m', 3);

请输入图片描述

A站视频数据-201902-可用phpMyAdmin导入.sql

Oracle硬解析与软解析

概述

  • 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个Server process生成,来对该客户进程服务。Server process得到SQL语句之后,对SQL语句进行Hash运算,然后根据Hash值到library cache中查找,如果存在,则直接将library cache中的缓存的执行计划拿来执行,最后将执行结果返回该客户端,这种SQL解析叫做软解析;如果不存在,则会对该SQL进行解析parse,然后执行,返回结果,这种SQL解析叫做硬解析。

硬解析

  1. 对SQL语句进行语法检查,看是否有语法错误。比如select from where 等的拼写错误,如果存在语法错误,则退出解析过程;
  2. 通过数据字典(row cache),检查SQL语句中涉及的对象和列是否存在。如果不存在,则退出解析过程
  3. 检查SQL语句的用户是否对涉及到的对象是否有权限。如果没有则退出解析;
  4. 通过优化器创建一个最优的执行计划。这个过程会根据数据字典中的对象的统计信息,来计算多个执行计划的cost,从而得到一个最优的执行计划。这一步涉及到大量的数据运算,从而会消耗大量的CPU资源;(library cache最主要的目的就是通过软解析来减少这个步骤);
  5. 将该游标所产生的执行计划,SQL文本等装载进library cache中的heap中。

软解析

  • 所谓软解析,就是因为相同文本的SQL语句存在于librarycache中,所以本次SQL语句的解析就可以去掉硬解析中的一个或多个步骤。从而节省大量的资源的耗费。

测试数据

请输入图片描述

JAVA代码

pstmt = conn.prepareStatement(sql);
pstmt.setString(1, value1);
pstmt.setString(2, value2);
rs = pstmt.excuteQuery();
...
sql语句中变量用?代替

配置ss代理

  1. pip3 install https://github.com/shadowsocks/shadowsocks/archive/master.zip 安装shadowsocks

  2. ssserver --version 查看版本 3.0.0

  3. sudo mkdir /etc/shadowsocks 新建文件夹

  4. sudo nano /etc/shadowsocks/config.json 配置json文件

    {
            "server":"服务器ip",
            "server_port":12121,
            "local_address": "127.0.0.1",
            "local_port":1080,
            "password":"password",
            "timeout":300,
            "method":"aes-256-cfb",
            "fast_open": false
    }
  1. ssserver -c /etc/shadowsocks/config.json 运行ss服务,建议放在screen中
tips: 遇到pip3报错:

 Traceback (most recent call last):   File "/usr/bin/pip", line 9, in <module>
     from pip import main ImportError: cannot import name main 
 解决方法:编辑文件,改为 
 from pip import __main__ if __name__ == '__main__':
     sys.exit(__main__._main())