From 41176bb717340873fb412ccfdac6b4f5b109d7ca Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 26 Jul 2018 23:12:25 +0800 Subject: [PATCH] auto commit --- notes/Java 容器.md | 44 ++++++-- notes/Linux.md | 14 +-- notes/一致性.md | 2 +- notes/分布式问题分析.md | 4 +- notes/剑指 offer 题解.md | 94 ++++++++++-------- notes/数据库系统原理.md | 6 +- pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png | Bin 0 -> 18432 bytes 7 files changed, 103 insertions(+), 61 deletions(-) create mode 100644 pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 9e6e2ac3..9918979a 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -8,6 +8,7 @@ * [三、源码分析](#三源码分析) * [ArrayList](#arraylist) * [Vector](#vector) + * [CopyOnWriteArrayList](#copyonwritearraylist) * [LinkedList](#linkedlist) * [HashMap](#hashmap) * [ConcurrentHashMap](#concurrenthashmap) @@ -25,23 +26,23 @@ ### 1. Set -- HashSet:基于哈希实现,支持快速查找,但不支持有序性操作,例如根据一个范围查找元素的操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的; +- HashSet:基于哈希实现,支持快速查找,但不支持有序性操作,例如根据一个范围查找元素的操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 -- TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN); +- TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN)。 - LinkedHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序。 ### 2. List -- ArrayList:基于动态数组实现,支持随机访问; +- ArrayList:基于动态数组实现,支持随机访问。 -- Vector:和 ArrayList 类似,但它是线程安全的; +- Vector:和 ArrayList 类似,但它是线程安全的。 - LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 ### 3. Queue -- LinkedList:可以用它来支持双向队列; +- LinkedList:可以用它来实现双向队列。 - PriorityQueue:基于堆结构实现,可以用它来实现优先队列。 @@ -85,14 +86,14 @@ java.util.Arrays#asList() 可以把数组类型转换为 List 类型。 public static List asList(T... a) ``` -如果要将数组类型转换为 List 类型,应该注意的是 asList() 的参数为泛型的变长参数,因此不能使用基本类型数组作为参数,只能使用相应的包装类型数组。 +应该注意的是 asList() 的参数为泛型的变长参数,不能使用基本类型数组作为参数,只能使用相应的包装类型数组。 ```java Integer[] arr = {1, 2, 3}; List list = Arrays.asList(arr); ``` -也可以使用以下方式生成 List。 +也可以使用以下方式使用 asList(): ```java List list = Arrays.asList(1,2,3); @@ -235,12 +236,12 @@ public synchronized E get(int index) { } ``` -### 2. ArrayList 与 Vector +### 2. 与 ArrayList 的区别 - Vector 是同步的,因此开销就比 ArrayList 要大,访问速度更慢。最好使用 ArrayList 而不是 Vector,因为同步操作完全可以由程序员自己来控制; - Vector 每次扩容请求其大小的 2 倍空间,而 ArrayList 是 1.5 倍。 -### 3. Vector 替代方案 +### 3. 替代方案 为了获得线程安全的 ArrayList,可以使用 `Collections.synchronizedList();` 得到一个线程安全的 ArrayList。 @@ -255,7 +256,15 @@ List synList = Collections.synchronizedList(list); List list = new CopyOnWriteArrayList<>(); ``` -CopyOnWriteArrayList 是一种 CopyOnWrite 容器,从以下源码看出:读取元素是从原数组读取;添加元素是在复制的新数组上。读写分离,因而可以在并发条件下进行不加锁的读取,读取效率高,适用于读操作远大于写操作的场景。 +## CopyOnWriteArrayList + +### 读写分离 + +写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。 + +写操作需要加锁,防止同时并发写入时导致的写入数据丢失。 + +写操作结束之后需要把原始数组指向新的复制数组。 ```java public boolean add(E e) { @@ -264,7 +273,7 @@ public boolean add(E e) { try { Object[] elements = getArray(); int len = elements.length; - Object[] newElements = Arrays.copyOf(elements, len + 1); + Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; @@ -276,13 +285,26 @@ public boolean add(E e) { final void setArray(Object[] a) { array = a; } +``` +```java @SuppressWarnings("unchecked") private E get(Object[] a, int index) { return (E) a[index]; } ``` +### 适用场景 + +CopyOnWriteArrayList 在写操作的同时允许读操作,大大提高了读操作的性能,因此很适合读多写少的应用场景。 + +但是 CopyOnWriteArrayList 有其缺陷: + +- 内存占用:在写操作时需要复制一个新的数组,使得内存占用为原来的两倍左右; +- 数据不一致:读操作不能读取实时性的数据,因为部分写操作的数据还未同步到读数组中。 + +所以 CopyOnWriteArrayList 不适合内存敏感以及对实时性要求很高的场景。 + ## LinkedList ### 1. 概览 diff --git a/notes/Linux.md b/notes/Linux.md index 27094e5c..705b9b0d 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -871,7 +871,9 @@ $ ls -al /etc | less ## 提取指令 -cut 对数据进行切分,取出想要的部分。切分过程一行一行地进行。 +cut 对数据进行切分,取出想要的部分。 + +切分过程一行一行地进行。 ```html $ cut @@ -891,7 +893,7 @@ root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16) $ last | cut -d ' ' -f 1 ``` -示例 2:将 export 输出的讯息,取出第 12 字符以后的所有字符串。 +示例 2:将 export 输出的信息,取出第 12 字符以后的所有字符串。 ```html $ export @@ -906,7 +908,7 @@ $ export | cut -c 12 ## 排序指令 -**sort** 进行排序。 +**sort** 用于排序。 ```html $ sort [-fbMnrtuk] [file or stdin] @@ -1204,7 +1206,7 @@ pid_t wait(int *status) 如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。 -参数 status 用来保存被收集的子进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: +参数 status 用来保存被收集的子进程退出时的一些状态,如果对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: ```c pid = wait(NULL); @@ -1218,7 +1220,7 @@ pid_t waitpid(pid_t pid, int *status, int options) 作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。 -pid 参数指示一个子进程的 ID,表示只关心这个子进程的退出 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。 +pid 参数指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。 options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。 @@ -1238,7 +1240,7 @@ options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 w 系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。 -要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时所有的僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 +要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 # 参考资料 diff --git a/notes/一致性.md b/notes/一致性.md index 7209dccf..b00de8ff 100644 --- a/notes/一致性.md +++ b/notes/一致性.md @@ -91,7 +91,7 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE 主要用于实现分布式事务,分布式事务指的是事务操作跨越多个节点,并且要求满足事务的 ACID 特性。 -通过引入协调者(Coordinator)来调度参与者的行为,,并最终决定这些参与者是否要真正执行事务。 +通过引入协调者(Coordinator)来调度参与者的行为,并最终决定这些参与者是否要真正执行事务。 ## 运行过程 diff --git a/notes/分布式问题分析.md b/notes/分布式问题分析.md index 4f019525..dfeb7691 100644 --- a/notes/分布式问题分析.md +++ b/notes/分布式问题分析.md @@ -216,7 +216,9 @@ HTTP 重定向负载均衡服务器收到 HTTP 请求之后会返回服务器的 ### 2. DNS 重定向 -使用 DNS 作为负载均衡器,根据负载情况返回不同服务器的 IP 地址。大型网站基本使用了这种方式做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。 +使用 DNS 作为负载均衡器,根据负载情况返回不同服务器的 IP 地址。 + +大型网站基本使用了这种方式做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。 缺点: diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 6f786cbe..e1655922 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -90,12 +90,20 @@ ## 题目描述 -在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5},那么对应的输出是第一个重复的数字 2。 +在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 -要求复杂度为 O(N) + O(1),也就是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。牛客网讨论区这一题的首票答案使用 nums[i] + length 来将元素标记,这么做会有加法溢出问题。 +```html +Input: +{2, 3, 1, 0, 2, 5} + +Output: +2 +``` ## 解题思路 +要求复杂度为 O(N) + O(1),也就是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。牛客网讨论区这一题的首票答案使用 nums[i] + length 来将元素标记,这么做会有加法溢出问题。 + 这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素放到第 i 个位置上。 以 (2, 3, 1, 0, 2, 5) 为例: @@ -158,7 +166,11 @@ Given target = 20, return false. ## 解题思路 -从右上角开始查找。因为矩阵中的一个数,它左边的数都比它小,下边的数都比它大。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间。 +从右上角开始查找。矩阵中的一个数,它左边的数都比它小,下边的数都比它大。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间。 + +当前元素的查找区间为左下角的所有元素,例如元素 12 的查找区间如下: + +

复杂度:O(M + N) + O(1) @@ -261,25 +273,14 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` -### 使用 Collections.reverse() - -```java -public ArrayList printListFromTailToHead(ListNode listNode) { - ArrayList ret = new ArrayList<>(); - while (listNode != null) { - ret.add(listNode.val); - listNode = listNode.next; - } - Collections.reverse(ret); - return ret; -} -``` - ### 使用头插法 利用链表头插法为逆序的特点。 -头结点和第一个节点的区别:头结点是在头插法中使用的一个额外节点,这个节点不存储值;第一个节点就是链表的第一个真正存储值的节点。 +头结点和第一个节点的区别: + +- 头结点是在头插法中使用的一个额外节点,这个节点不存储值; +- 第一个节点就是链表的第一个真正存储值的节点。 ```java public ArrayList printListFromTailToHead(ListNode listNode) { @@ -302,6 +303,20 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` +### 使用 Collections.reverse() + +```java +public ArrayList printListFromTailToHead(ListNode listNode) { + ArrayList ret = new ArrayList<>(); + while (listNode != null) { + ret.add(listNode.val); + listNode = listNode.next; + } + Collections.reverse(ret); + return ret; +} +``` + # 7. 重建二叉树 [NowCoder](https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) @@ -322,22 +337,23 @@ inorder = [9,3,15,20,7] 前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。 ```java -private Map inOrderNumsIndexs = new HashMap<>(); // 缓存中序遍历数组的每个值对应的索引 +// 缓存中序遍历数组的每个值对应的索引 +private Map inOrderNumsIndexs = new HashMap<>(); public TreeNode reConstructBinaryTree(int[] pre, int[] in) { for (int i = 0; i < in.length; i++) inOrderNumsIndexs.put(in[i], i); - return reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1); + return reConstructBinaryTree(pre, 0, pre.length - 1, 0, in.length - 1); } -private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, int inL, int inR) { +private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int inL, int inR) { if (preL > preR) return null; TreeNode root = new TreeNode(pre[preL]); int inIndex = inOrderNumsIndexs.get(root.val); int leftTreeSize = inIndex - inL; - root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, in, inL, inL + leftTreeSize - 1); - root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, in, inL + leftTreeSize + 1, inR); + root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, inL, inL + leftTreeSize - 1); + root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, inL + leftTreeSize + 1, inR); return root; } ``` @@ -350,16 +366,6 @@ private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 -## 解题思路 - -① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; - -

- -② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 - -

- ```java public class TreeLinkNode { int val; @@ -373,6 +379,16 @@ public class TreeLinkNode { } ``` +## 解题思路 + +① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; + +

+ +② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 + +

+ ```java public TreeLinkNode GetNext(TreeLinkNode pNode) { if (pNode.right != null) { @@ -398,7 +414,7 @@ public TreeLinkNode GetNext(TreeLinkNode pNode) { ## 题目描述 -用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。队列中的元素为 int 类型。 +用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 ## 解题思路 @@ -442,7 +458,7 @@ public int pop() throws Exception {

-递归方法是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,避免重复求解子问题。 +递归是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。 ```java public int Fibonacci(int n) { @@ -521,11 +537,11 @@ public int JumpFloor(int n) { ```java public int JumpFloor(int n) { - if (n <= 1) + if (n <= 2) return n; - int pre2 = 0, pre1 = 1; - int result = 0; - for (int i = 1; i <= n; i++) { + int pre2 = 1, pre1 = 2; + int result = 1; + for (int i = 2; i < n; i++) { result = pre2 + pre1; pre2 = pre1; pre1 = result; diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 87d210a9..cabc2f97 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -70,7 +70,7 @@ 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 -可以通过数据库备份和恢复来实现,在系统发生奔溃时,使用备份的数据库进行数据恢复。 +可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。 ---- @@ -79,9 +79,9 @@ - 只有满足一致性,事务的执行结果才是正确的。 - 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时要只要能满足原子性,就一定能满足一致性。 - 在并发的情况下,多个事务并发执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。 -- 事务满足持久化是为了能应对数据库奔溃的情况。 +- 事务满足持久化是为了能应对数据库崩溃的情况。 -

+

## AUTOCOMMIT diff --git a/pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png b/pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png new file mode 100644 index 0000000000000000000000000000000000000000..fdefb823686a563cdfb94cce17494f004af3cc18 GIT binary patch literal 18432 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 literal 0 HcmV?d00001