Redis Pipelining

最近在看python rq的源码,发现它使用了redis pipeline的功能,下面通过文档入手,学习它的原理。

redis网络模型

redis使用的是client-server类型的网络模型,client每个请求便会阻塞等待server响应,server收到请求、处理请求、发送响应给client。很多时候是需要取回多个key,如果client请求1K次,每次的RTT(Round Trip Time)是20ms,那么需要20s才能完成。

阅读全文

Vscode Remote Ssh初体验

目前(2019.5.18)Vscode remote功能还不是正式的功能,需要下载vscode insiders版本。
下载链接:https://code.visualstudio.com/insiders/

阅读全文

Python线程实现源码分析

建立多线程环境

python只有在运行module thread的start_new_thread方法后会启动多线程模式,即创建GIL锁。start_new_thread对应的实现是threadmdule.c里的thread_PyThread_start_new_thread,这个函数首先完成下面操作:

阅读全文

460. LFU Cache

题目解析

题目要求实现一个LFU Cache,提供put、get两个操作。LFU就是 Least Frequently Used,也就是对每个key都会对它的操作进行计数count,但容器满了以后,把count最小的那个数删掉(如果最小的count有两个元素,那么按LRU来选择,即最早添加的删除)。
之所以它是hard,主要是因为它要求get和put的操作为O(1)。在LRU那道题里面使用一个list来保存所有的元素,使用unordered_map来保存key对应的list节点。现在需要保存key对应的count,以及根据count快速找到list节点。

阅读全文

1032. Stream of Characters

https://leetcode.com/problems/stream-of-characters/description/

阅读全文

使用Android手机抓包

前期准备

  1. 一台root的安卓手机
  2. android版的tcpdump,下载地址:https://www.androidtcpdump.com/android-tcpdump/downloads

阅读全文

1031. Maximum Sum of Two Non-Overlapping Subarrays

https://leetcode.com/problems/maximum-sum-of-two-non-overlapping-subarrays

阅读全文

1035. Uncrossed Lines

题目解析

这道题是LCS(最长公共子序列)的数组版本,LCS资料都很多,本题的状态转移公式是:
dp[i][j] = dp[i-1][j-1]+1 while A[i] == B[j] or dp[i][j] = max(dp[i-1][j], dp[i][j-1]) while A[i] != B[j]

阅读全文

1034. Coloring a Border

题目解析

这道题最难的地方我觉得是题目意思不好理解- -,题目的意思的就是给你一个用数字代表颜色的地图,然后再给你一个坐标[row, col],把坐标所在格子连通的其他格子看成一整块(component),把这个整块的边界变为新的颜色。

阅读全文

1027. Longest Arithmetic Sequence

题目解析

题目的意思是给一个数组,找到里面最长的等差数列(子序列, 不要求紧邻)。

解答

既然是等差数列,那么首先要找到的是差值d,这个差值需要两个数的差值,那么用两个for来遍历所有可能的d,然后再使用这个d来找到之后的数(也就是再用一个for),因为这样时间复杂度比较高,故使用unordered_set来保存所有数,之后的数可以直接查询到
时间复杂度O(n^3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
int longestArithSeqLength(vector<int>& A) {
unordered_set<int> a;
int result = 0;
for (int i = 0; i < A.size(); i++) {
a.insert(A[i]);
}
for (int i = 0; i < A.size()-1; i++) {
for (int j = i+1; j < A.size(); j++) {
int d = A[j] - A[i];

result = max(result, 2);
int temp = A[j] + d;
if (a.count(temp) == 0) continue;
int temp_count = 2;

for (int k = j+1; k < A.size(); k++) {
if (A[k] == temp) {
temp_count++;
temp += d;
}
}
result = max(temp_count, result);
}
}
return result;
}
};

阅读全文