macOS Catalina(10.15.4)/IntelliJ IDEA 2018.3/Tomcat 9.0.33/Maven项目调试报错"Caused by: java.util.zip.ZipException: zip file is empty"

macOS Catalina(10.15.4)/IntelliJ IDEA 2018.3/Tomcat 9.0.33/Maven项目调试时报错,这个项目以前是可以正常调试的,一段时间之后,就不能正常调试之下了

继续阅读macOS Catalina(10.15.4)/IntelliJ IDEA 2018.3/Tomcat 9.0.33/Maven项目调试报错"Caused by: java.util.zip.ZipException: zip file is empty"

ubuntu 18.04系统/var/log/auth.log文件不存在

通过 /var/log/auth.log 文件可以查看一些关于 ssh 登陆、sudo 命令的信息。尤其是 denyhosts 依赖这个日志拦截非法的登陆攻击。 但是,我最近遇到了一个问题,在阿里云的一些主机上没有这个文件,或者日志文件在自动备份(比如被重命名成 /var/log/auth.log.1 )之后,没有重新生成新的 /var/log/auth.log

检查 /var/log 目录的所有者信息,如下:

这里的所有者权限信息是不正确的,缺少所有者所在组的文件创建权限,导致文件创建出现问题。因此需要如下命令:

接着手工创建日志文件,如下:

参考链接


/var/log/auth.log文件不存在

ubuntu 18.04编译OpenSCAD源代码

ubuntu 18.04编译OpenSCAD源代码,本意想研究一下如何加速 CGAL 的计算过程,目前还没完成。
 
编译过程如下:

继续阅读ubuntu 18.04编译OpenSCAD源代码

匈牙利算法

零、前言

匈牙利算法是一个经典的解决二部图最小权值匹配问题的算法。网上也有不少资料,但是看完之后总觉得有两个核心问题没有解决:算法为什么一定能得到最优匹配?算法复杂度为什么不再是指数级了?

最后读到了python的库函数scipy.optimize.linear_sum_assignment源代码里引用的文章,才算理解算法的实现,再花了一点时间弄清楚了上边两个问题。

继续阅读匈牙利算法

Munkres' Assignment Algorithm

Assignment Problem - Let C be an nxn matrix representing the costs of each of n workers to perform any of n jobs.  The assignment problem is to assign jobs to workers so as to minimize the total cost. Since each worker can perform only one job and each job can be assigned to only one worker the assignments constitute an independent set of the matrix C.

继续阅读Munkres' Assignment Algorithm

求最长公共子序列

求给出的两个序列的最长公共子序列是常见的一个问题。

需要注意的就是 最长公共子串(Longest Common Substring)与 最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序,并不要求连续。

解法如下:

参考链接


最长递增子序列(Longest Increasing Subsequence)

最长递增子序列的解法,可以转化为 求最长公共子序列,也就是生成从目标序列从小到大排序之后的新序列,然后计算原始序列与新序列的 最长公共子序列但是遇到重复数字的时候,会出现问题也就是这个解法只能解决无重复数字的最长递增子序列

另外需要注意的就是 最长公共子串(Longest Common Substring)与 最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序,并不要求连续。

整个的求解过程其实很好理解:

  • 假定要计算的序列为 K = {K1,K2,K3,……,Kn,Kn+1,……,Km}
  • 初始化计数数组 N = {N1,N2,N3,……,Nn,Nn+1,……,Nm} ,(计数数组跟序列的长度相同,Kn 的最长递增子序列长度计数对应于 Nn)用来记录最长递增子序列的长度,每个项的初始化值都设置为 1即使最小的项,项本身也算一个长度,因此最小的长度是 1
  • 必须从头部(K1)开始遍历
  • 当计算 Kn 结尾的最长递增子序列的时候,只要遍历序列 K 的前 [0 ~ n-1] 个项,找到数值 小于(或者小于等于Kn必须遍历,Kn 之前的最长递增子序列不一定是 Kn-1 对应的 Nn-1 ),并且在计数数组 N 中对应的计数最大的项 Ni ,然后 Nn = Ni + 1

本方法的时间复杂度是 O(n2)

例子:

设数组 K = { 2, 5, 1, 5, 4, 5 }  那么求最长递增子序列的代码如下:

第二个测试用例的数据如下:

涉及到的面试题目如下类型:

 
梅花桩问题

合唱队问题

合唱队问题其实是 求最长递增子序列 与 最长递减子序列 的 和 最大。

最长递减子序列的求法其实就是把原始序列反序,然后 求最长递增子序列 然后把最后的结果反序即可。

代码如下:

解法介绍

参考链接