ARTS 打卡第七周

    技术2022-07-10  151

    ARTS 打卡week07

    每周完成一个 ARTS: Algorithm: 每周至少做一个 LeetCode 的算法题 Review: 阅读并点评至少一篇英文技术文章 Tips: 学习至少一个技术技巧 Share: 分享一篇有观点和思考的技术文章

    Algorithm

    序号题目名称掌握程度0098验证二叉搜索树10035二叉搜索树的最近公共祖先10036二叉树的最近公共祖先100%

    验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索 树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。

    示例:

    示例一: 输入: 2 / \ 1 3 输出: true 示例二: 输入: 5 / \ 1 4 / \ 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。

    解析:

    0098_validate_BST.go

    /* ** in-ordering traverse binary search tree slice is a ordered slice ** using that propertity could validate binary search tree */ type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func isValidBST01(root *TreeNode) bool { treeNodeValue, treeNodeStack := []int{}, []*TreeNode{} if root == nil { return true } if root.Left == nil && root.Right == nil { return true } // inorder_travering for root != nil || !isEmpty(treeNodeStack) { for root != nil { // push treeNodeStack = append(treeNodeStack, root) root = root.Left } if !isEmpty(treeNodeStack) { // pop tempNode := treeNodeStack[len(treeNodeStack)-1] treeNodeStack = treeNodeStack[:len(treeNodeStack)-1] treeNodeValue = append(treeNodeValue, tempNode.Val) root = root.Right } } for i := 0; i < len(treeNodeValue) - 1; i++ { if treeNodeValue[i] >= treeNodeValue[i+1] { return false } } return true } func isEmpty(stack []*TreeNode) bool { if len(stack) == 0 { return true } else { return false } } /* ** using recursion realize binary search tree validation */ const ( MAX = 1 << 32 - 2 MIN = -1 << 32 - 1 ) func isValidBST02(root *TreeNode) bool { return recur(MIN, MAX, root) } func recur(min, max int, root *TreeNode) bool { if root == nil { return true } return min < root.Val && max > root.Val && recur(min, root.Val, root.Left) && recur(root.Val, max, root.Right) }

    二叉搜索树的最近公共祖先

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

    示例:

    示例一: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点 2 和节点 8 的最近公共祖先是 6。 示例二: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出: 2 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。 说明: 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。

    解析:

    0235_lowestCommonAncestor.go

    package leetCode type TreeNode struct { Val int Left *TreeNode Right *TreeNode } // using binary search tree property: // root.value > left.value && root.value < right.value // if root.value > ( p.value && q.value ), ancestor in left subtree // if root.value < ( p.value && q.value ), ancestor in right subtree // if root.value > p.value && root.value < q.value, ancestor is root // if root.value < p.value && root.value > q.value, ancestor is root // if root.value == left.value || root.value == right.value, ancestor is root func lowestCommonAncestor02(root, p, q *TreeNode) *TreeNode { if root == nil || root == p || root == q { return root } if root.Val > p.Val && root.Val > q.Val { return lowestCommonAncestor02(root.Left, p, q) } else if root.Val < p.Val && root.Val < q.Val { return lowestCommonAncestor02(root.Right, p, q) } else { return root } return nil }

    二叉树的最近公共祖先

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

    示例:

    # 1 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。 # 2 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。 说明: 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉树中。

    解析:

    0236_lowestCommonAncestor.go

    package leetCode type TreeNode struct { Val int Left *TreeNode Right *TreeNode } // this question is find node in binary in actually // according to p and q position, figure out their first ancestor node func lowestCommonAncestor01(root, p, q *TreeNode) *TreeNode { // exist condition if root == nil || root == p || root == q { return root } // search nodes p and q in left subtree // if p and q in left subtree, right == nil, recurs left subtree // if p and q not in left subtree, left == nil, recurs right subtree // if p or q in left subtree, left != nil && right != nil, // first ancestor is root left := lowestCommonAncestor(root.Left, p, q) right := lowestCommonAncestor(root.Right, p, q) if left != nil && right != nil { return root } if left == nil { return right } if right == nil { return left } return nil }

    Review

    Tips

    MySQL源码安装(转载)

    MySQL源码安装

    MySQL源码安装,本例以在CentOS7上安装MySQL5.7为例

    下载地址

    https://dev.mysql.com/downloads/mysql/5.7.html#downloads

    安装依赖包

    CentOS:

    yum -y install gcc gcc-c++ cmake bison bison-devel ncurses ncurses-devel openssl-devel

    Ubuntu:

    apt-get install cmake libncurses5-dev pkg-config openssl libssl-dev

    创建用户和组

    groupadd mysql useradd -g mysql -s /sbin/nologin -M mysql

    创建文件目录

    mkdir -p /usr/local/mysql mkdir -p /usr/local/boost mkdir -p /data/mysql

    修改目录权限:

    chown -R mysql:mysql /usr/local/mysql chown -R mysql:mysql /data/mysql

    预编译

    cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql \ -DSYSCONFDIR=/etc \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ -DDOWNLOAD_BOOST=1 \ #若boost已经下载更改为0即可 -DWITH_BOOST=/usr/local/boost /* 注意: 1、编译过程需要较长的时间,需耐心等待。 2、重新cmake时,由于cmake生成临时文件CMakeCache.txt,需要先删除CMakeCache.txt文件,避免不必要的错误,即 rm CMakeCache.txt */

    编译之后安装

    make install

    配置环境变量

    # 可编辑/etc/profile,增加内容: PATH=$PATH:/usr/local/mysql/bin export PATH

    初始化

    # –initialize-insecure 不会生成密码 # -–initialize 会生成一个随机密码 # -–datadir 目标目录下不能有数据文件 # 初始化命令: mysqld --defaults-file=/etc/my.cnf \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/data/mysql \ --initialize # 如果需要重新初始化,清空datadir即可: rm -fr /data/mysql/* # 备注:5.7之前的版本采用mysql_install_db初始化

    配置mysql服务

    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

    启动服务

    service mysql status/start/stop 或者 systemctl enable mysql systemctl status/start/stop mysql # 如果启动失败,查看/etc/my.cnf文件: [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid

    修改/etc/my.cnf文件,配置见【配置关键参数】

    配置root登录密码

    mysql_secure_installation

    执行时出现”Can’t connect to local MySQL server through socket”错误时,尝试增加配置:

    [client] socket = /tmp/mysql.sock

    创建远程访问用户

    grant select, insert, update, delete on jasonhzy.* to 'test'@'%' identified by 'test'; flush privileges;

    配置关键参数

    [client] port = 3306 socket = /tmp/mysql.sock default-character-set = utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] # 监听的TCP/IP端口 port = 3306 # mysql安装路径 basedir = /usr/local/mysql # 数据文件位置 datadir = /data/mysql # mysql socket连接文件 socket = /tmp/mysql.sock # mysql进程的文件 pid-file = /data/mysql/mysql.pid # 错误日志文件 log-error = /data/mysql/mysql-error.log # 字符集 character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # init_connect = 'SET NAMES utf8mb4' # skip-character-set-client-handshake = true # 禁用自动提交方式 # autocommit=0 # explicit_defaults_for_timestamp = true # 设置时区 # default-time-zone = '+8:00' # 库名、表名是否区分大小写。默认为0区分大小写。设置1不区分大小写,创建的表、数据库都以小写形式存放磁盘 # lower_case_table_names = 0 # 不在tcp/ip端口上进行监听,所有的连接都是通过本地的socket文件连 # skip-networking # 禁用DNS查询,不能在mysql的授权表中使用主机名,只能使用IP,例如: # grant all on test.* to root@localhost 这是不行的 skip-name-resolve # 默认存储引擎 default-storage-engine = InnoDB # MySQL支持4种事务隔离级别,他们分别是: # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE # 若未指定,mysql默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED transaction_isolation = REPEATABLE-READ # 是否开启慢查询日志,1表示开启,0表示关闭 slow-query-log = 1 # 慢查询日志文件位置 slow-query-log-file= /data/mysql/mysql-slow.log # 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询. # long_query_time = 10 # 日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。 # log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。 # MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。 # 日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志, # 又需要能够获得更高的系统性能,那么建议优先记录到文件 # log_output=FILE # 指定mysql服务所允许的最大连接进程数,若访问时经常出现"Too Many Connections"的错误提示,则需要增大该参数值。 max_connections = 1000 # 每个主机连接允许异常中断的次数,当超过该次数mysql服务将禁止该主机的连接请求。若让禁止的host仍可连接,方法如下: # 1、重启mysql服务 2、flush hosts 3、mysqladmin flush-hosts -hlocalhost -P 3306 -uroot -p max_connect_errors = 1000000 # 服务器标识id(用于主从复制) server-id = 10 # 二进制日志存放路径 log_bin = mysql-bin log_bin_index = /data/mysql/mysql-bin.index # binlog格式,复制有3种模式STATEMENT,ROW,MIXED binlog_format = row # 如果你在使用链式从服务器结构的复制模式 (A->B->C), # 你需要在服务器B上打开此项. # 此选项打开在从线程上重做过的更新的日志, # 并将其写入从服务器的二进制日志. # log_slave_updates # 独立表空间,每个表的数据和索引单独存放在以表命名的.ibd文件中,最好在安装数据库就设置,使用之后再设置可能无法重启 # 节省空间/提升性能,但单表增加过大 innodb-file-per-table = 1 # 缓冲池大小,对Innodb表来说非常重要,一般设置为主机内存的70~80% innodb_buffer_pool_size = 6G # 1)为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行. 当事务提交时,不做日志写入操作。 # 当MySQL Crash和OS Crash或者主机断电之后,可能会丢失上一秒的事务数据 # 2)为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去。最安全的设置,能够保证不论 # 是MySQL Crash还是OS Crash或者是主机断电都不会丢失任何已经提交的数据 # 3)为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下MySQL # 会每秒定时执行一次flush(刷到磁盘)操作。MySQL Crash并不会造成数据的丢失,但是OS Crash或者是主机断电后可能丢失 # 简单说来,可选值的安全性从0->2->1递增,分别对应于mysqld进程crash可能丢失 -> OS crash可能丢失 -> 事务安全。 innodb_flush_log_at_trx_commit = 2 #开启gtid gtid_mode=ON enforce-gtid-consistency=ON [mysqldump] max_allowed_packet = 256M # mysqldump导出大表时很有用,强制从服务器查询取得记录直接输出,而不是取得所有记录后将它们缓存到内存中。 quick

    注:本文转载自http://jasonhzy.github.io/2019/02/01/mysql-compile-install/

    Share

    算法面试学习资源: https://greyireland.gitbook.io/algorithm-pattern/Linux中rz和sz命令用法详解 https://blog.csdn.net/magaiou/article/details/80322060
    Processed: 0.014, SQL: 9