What -> Why -> How -> Never

总有一个发现问题的过程让你对一个知识印象深刻,永远不要沉入固有的认知。

在版本控制系统中跨分支合并文件是一个非常复杂的过程。算法的自动合并对此会有很大帮助,但是算法也有其局限性:

  • 一是因为其基础原理可能会导致一些”错误”的合并。
  • 二是因为常用的diff3算法仅适用于分成多行的非结构化文本文档。
    对于JSON来说,有没有比diff3更优秀的merge算法呢

涉及题目包括

  • 「力扣」第 207 题:课程表(中等);
  • 「力扣」第 210 题:课程表 II(中等);
  • 「力扣」第 301 题:最小高度树(中等);
  • 「力扣」第 802 题:找到最终的安全状态(中等);
  • 「力扣」第 630 题:课程表 III(困难);
  • 「力扣」第 329 题:矩阵中的最长递增路径(困难);
  • 「力扣」第 1245 题:树的直径(中等);
  • 「力扣」第 444 题:序列重建(中等);
  • 「力扣」第 1136 题:平行课程(困难);
  • 「力扣」第 269 题:火星词典(困难)。

其中 1673 和 402、 1081 和 316 题只是换了说法而已,所以这里只有三道题。

  • 316 去除重复字母(困难)
  • 321 拼接最大数(困难)
  • 402 移掉 K 位数字(中等)
  • 1081 不同字符的最小子序列(中等)
  • 1673 找出最具竞争力的子序列(中等)

线程的安全问题

原因:操作共享数据

临界区

  • 一个程序运行多个线程本身是没有问题的
  • 问题出在多个线程访问共享资源
    • 多个线程读共享单元也没有问题
    • 在多个线程对共享资源读写操作是发生指令交错,就会出现问题
  • 一段代码块内如果存在对共享资源的多线程读写操作,

解决方法()

  • 阻塞式的解决方案:synchronized,Lock
  • 非阻塞式的解决方案原子变量

阻塞式的解决方法

synchronized实际上是使用对象锁保证了临界区内代码的原子性,代码区内的代码是不可分割的,不会被线程切换打断

1
2
3
synchronized(Object){

}

Git 属于分布式版本控制系统,而 SVN 属于集中式。

集中式版本控制只有中心服务器拥有一份代码,而分布式版本控制每个人的电脑上就有一份完整的代码。

集中式版本控制有安全性问题,当中心服务器挂了所有人都没办法工作了。

集中式版本控制需要连网才能工作,如果网速过慢,那么提交一个文件会慢的无法让人忍受。而分布式版本控制不需要连网就能工作。

分布式版本控制新建分支、合并分支操作速度非常快,而集中式版本控制新建一个分支相当于复制一份完整代码。

提高代码重用性(相同的代码,不用多次编写)

代码可读性(编程规范性,便于自己及其他程序猿的阅读和理解)

可扩展性(当需要增加新的功能的时候,非常的方便,可维护)

可靠性(程序不容易出错,可靠性高 )

使程序呈现高内聚,低耦合的特性

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯” 返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为 “回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

解决一个回溯问题,实际上就是一个决策树的遍历过程

1、路径:也就是已经做出的选择。

2、选择列表:也就是你当前可以做的选择。

3、结束条件:也就是到达决策树底层,无法再做选择的条件。

回溯算法最经典的问题是八皇后问题

问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

二分查找(非递归)

介绍

  • 二分查找分为两种:递归和非递归
  • 一般情况只适用于从有序的数列中进行查找,或者将数列进行排序后进行查找
  • 时间复杂度为O(log2n)

代码实现

数组 {1,3, 8, 10, 11, 67, 100}, 编程实现二分查找, 要求使用非递归的方式完成.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private static int binarySearch(int[] arr, int target){
//定义结果,左节点和右节点
int res = -1, left = 0, right = arr.length-1;
//使用while循环 左右节点相等时退出循环
while(left <= right){
int mid = (left + right) / 2;
if(arr[mid] == target){
return mid;
}else if(arr[mid] > target){
right = mid;
}else{
left = mid;
}
}
return res;
}

最好使用[]的区间,使用(][)

软件及版本信息

在PyTorch官网中有如下建议

We recommend you to open this project in Android Studio 3.5.1+. At the moment PyTorch Android and demo applications use android gradle plugin of version 3.5.0, which is supported only by Android Studio version 3.5.1 and higher. Using Android Studio you will be able to install Android NDK and Android SDK with Android Studio UI.

建议的Android Studio版本应该在3.5.1及以上,这里推荐使用最新版。

建议的自动化构建工具android gradle plugin of version版本应该为3.5.0,请注意,不要将gradle的版本升级至4.0.1,在开发过程中发现该版本不太稳定。

0%