ARTS-第6周-190422

Algorithm
ARTS系列的算法题目都来自 LeetCode 网站,LeetCode 网站现在也有中文版,如果忘记把链接地址放到文章中,可以到网站搜索对应的题目。
链接:https://leetcode.com/problems/container-with-most-water/
Container With Most Water
Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.
ARTS-第6周-190422_第1张图片

The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
Example:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

个人理解翻译为中文,仅供参考:
标题:最多装多少水(求最大面积)
题目内容:在2维坐标轴中,x轴的取值为正整数,输入的数组为y轴的值,x轴的取值从1开始,如果输入时 [1,8,6],在坐标轴上对应的坐标就是(1,1),(2,8),(3,6)。以这些点画柱状图,将每根柱子比作一个挡板,选取两个挡板作为装水的容器,求最大能装水的面积。默认输入数组长度>=2。
解题思路:从第1个点开始,逐一计算第一个点和其他点组成容器的面积,取最大值。可以通过循环,也可以递归,时间复杂度是 (n-1+1)(n-1)/2,O(n2)。在计算以某个点作为起始点的最大面积时可以做一些小的判断,加快寻找的速度。
实现代码:

static public int MaxArea(int[] height)
{
   int area = 0;
   for (int i = 0; i < height.Length-1; i++)
   {
       for (int s = 1; (i+s) < height.Length; s++)
       {
           int min_h = (height[i] < height[i + s]) ? height[i] : height[i+s];
           if (min_h*s> area)
           {
               area = min_h * s;
           }
       }
   }
   return area;
}

运行的时间上的表现很一般,在原文链接总有另一种解决方式,以数组的两边起始点开始向数组的中间遍历。计算面积的时候是x的距离乘以起始点中较小的y,这么遍历是从x间距最大开始遍历。前后两个边界的移动策略是,那个点的y值小,就向中间移动哪个边界。这种方式的时间复杂度O(n)。

static public int MaxArea(int[] height)
{
    int area = 0;
    int start_i = 0;
    int stop_i = height.Length - 1;
    while (start_i < stop_i)
    {
        if ((height[start_i] < height[stop_i]))
        {
            if ((stop_i - start_i) * height[start_i] > area)
            {
                area = (stop_i - start_i) * height[start_i];
            }
            start_i++;
        }
        else
        {
            if ((stop_i - start_i) * height[stop_i] > area)
            {
                area = (stop_i - start_i) * height[stop_i];
            }
            stop_i--;
        }
    }
    return area;
}

Review
Visual Studio 2019 Launch: Docker all the things! 链接:https://www.youtube.com/watch?v=Tlswgxl_Xyk
文章介绍了 Visual Studio 2019 新的特性,这里把视频后面的总结翻译一下:
Visual studio 2019 新的容器工具 Ecosystem。有很多的相关的images:
.NET Core, .NET Framework
ASP.NET, WCF, Console
Linux, Windows
Alpine(新), Debian, Ubuntu 等
可以只使用Dockerfile实现简单的服务,也可以通过kubernet和Helm来发布应用。
在 Visual Studio 2019 中,运行的容器内,云上的kubernets 和 Azure Dev 环境下的 debug 很方便。
可以无缝切换运行环境:native IIS, console, Docker, Compose, or Kubernets/AKS
有兴趣的可以尝试下,新功能感觉不错。

Tips&Share
最近做了一些实验性的工作:RDS for MySQL 物理备份文件恢复到自建数据库
下面两个链接是阿里云官网上的相关介绍:
https://help.aliyun.com/knowledge_detail/41817.html?spm=5176.11065259.1996646101.searchclickresult.75cf6ef3eycF9g
https://help.aliyun.com/video_detail/54686.html?spm=5176.11065259.1996646101.searchclickresult.75cf6ef3eycF9g (视频)
这里解决的问题是:备份是类型是实例备份,下载到本地,然后恢复到本地数据库。
涉及到使用 Percona XtraBackup 软件。Percona XtraBackup 官网:https://www.percona.com
安装Percona XtraBackup:
https://www.percona.com/doc/percona-xtrabackup/8.0/installation/yum_repo.html
通过yum安装或者下载 rpm 文件进行安装。我使用yum安装:

  1. 通过root用户或者sudo运行以下命令安装Percona yum存储库
    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    启用存储库:percona-release enable-only tools release
    提示:如果Percona XtraBackup只是用来和MySQL一起使用,只需要启用 tools 存储库:percona-release enable-only tools
  2. 安装 Percona XtraBackup : yum install percona-xtrabackup-80
    提示:libev 在安装 Percona XtraBackup 之前,一定要安装。实践中执行命令 yum install percona-xtrabackup-80,自动提示安装依赖库libev。

卸载 要完全卸载Percona XtraBackup,需要删除所有已安装的软件包:yum remove percona-xtrabackup,(正确的命令好像是:yum remove percona-xtrabackup-80)

执行yum命令的时候遇到yum被占用的情况:

Another app is currently holding the yum lock; waiting for it to
exit… 另一个应用程序是:PackageKit

提示yum处于锁定状态,解决方法:

vim /etc/yum/pluginconf.d/langpacks.conf 将第一行:enable=1改为enable=0
PackageKit 是一个离线更新服务,这个操作就是禁用这个服务。 参考网站:
https://www.linuxidc.com/Linux/2019-02/157044.htm (详细)
https://www.cnblogs.com/progor/p/8664622.html (只有操作过程)

在Linux系统中下载,使用如下命令:
wget -c ‘<数据备份文件下载地址>’ -O <自定义文件名>.tar.gz
-c:启用断点续传模式。
-O:将下载的结果保存为指定的文件名(使用URL中包含的文件名后缀 .tar.gz 或者 .xb.gz)。
下载地址有多个参数时建议为下载地址添加单引号,避免下载失败。

目前物理备份集文件有3种格式:
tar 压缩包 (.tar.gz 后缀)
xbstream 压缩包 (.xb.gz 后缀)
xbstream 文件包 (_qp.xb 后缀)

说明 2019年2月20日后创建的MySQL 5.6实例,数据备份文件的格式为xbstream文件包 (_qp.xb 后缀)。
对于tar 压缩包 (.tar.gz 后缀),使用命令:tar -izxvf <数据备份文件名>.tar.gz -C /home/mysql/data
对于xbstream 压缩包 (.xb.gz 后缀),使用命令:gzip -d -c <数据备份文件名>.xb.gz | xbstream -x -v -C /home/mysql/data
对于xbstream 文件包 (_qp.xb 后缀),使用命令:
解包
cat <数据备份文件名>_qp.xb | xbstream -x -v -C /home/mysql/data
解压
innobackupex --decompress --remove-original /home/mysql/data

最后发现我在windows下直接点击下载的文件就是rar文件,解压出来也不是文件夹,是一个没有后缀的文件。之前下载过一个文件,解压以后是文件夹,所以遇到问题了,继续找答案。
发现在linux环境下下载的没有问题。

又遇到麻烦了,发现 docker 中通过 volumn 连接到解压出来的mysql数据文件夹,没能成功在本地恢复mysql数据库。
仔细看了下官方文档,发现还有步骤没执行完,呵呵,不能自以为是。

执行如下命令,恢复解压好的备份文件。
innobackupex --defaults-file=/root/docker/ag4008copy/backup-my.cnf --apply-log /root/docker/mysql_ag4008
发现提示错误没有 innobackupex 这个命令,难道是安装的时候出问题了。
发现问题了,居然是安装的percona-xtrabackup版本太新了,没有包含 innobackupex 工具
安装2.4版本。
yum install percona-xtrabackup-24

如果查看不同版本中的工具包:
在 percona-xtrabackup 的官网界面,选择对应的版本(Percona XtraBackup 8.0):
ARTS-第6周-190422_第2张图片
选择右边的 User’s Manual,看到8.0的工具包里面确实没有 innobackupex
ARTS-第6周-190422_第3张图片
找到 2.4 版本的 User‘s Manual,里面包含 innobackupex。
ARTS-第6周-190422_第4张图片
如果是早期的 centos 5 版本:

  1. 需要下载包以后手动安装 rpm
$ wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ rpm -ivH percona-release-latest.noarch.rpm
  1. 查看包中的库
yum list | grep percona
  1. 安装
yum install percona-xtrabackup-24

xtrabackup的使用还没能搞清楚,学习效率太低。

你可能感兴趣的:(ARTS-第6周-190422)