ARTS-week28

Algorithms

Isomorphic Strings
思路:使用哈希表

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:
bool isIsomorphic(string s, string t) {
if(s.length()!=t.length()) {
return false;
}

unordered_map<char,char> res;
for(int i=0; i<s.length(); i++) {
if(res.find(s[i]) == res.end()) {
res[s[i]] = t[i];
} else if(res[s[i]] != t[i]) {
return false;
}
}

unordered_map<char,char> tmp;
for(int i=0; i<t.length(); i++) {
if(tmp.find(t[i]) == tmp.end()) {
tmp[t[i]] = s[i];
} else if(tmp[t[i]] != s[i]) {
return false;
}
}
res.clear();
tmp.clear();
return true;
}
};

在网上看到使用256大小的数组来代替哈希表的方法:

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
bool isIsomorphic(string s, string t) {
int m1[256] = {0}, m2[256] = {0}, n = s.size();
for (int i = 0; i < n; ++i) {
if (m1[s[i]] != m2[t[i]]) return false;
m1[s[i]] = i + 1;
m2[t[i]] = i + 1;
}
return true;
}
};

Reverse Linked List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head) {
return head;
}
ListNode *newHead = NULL;
while (head) {
ListNode *ptr = head->next;
head->next = newHead;
newHead = head;
head = ptr;
}
return newHead;
}
};

Review

本周阅读英文文章 Is It Natural To Upload Consciousness?

Technique

在阅读《UNIX网络编程卷一》一书时,对listen函数的backlog参数有了新的认识,该参数应该指定某个给定套接字上内核为之排队的最大已完成连接数,对于已完成连接数作出限制的目的在于:在监听某个给定套接字的应用进程(不论什么原因)停止接受连接的时候,防止内核在该套接字上继续接受新的连接请求。

1
2
3
#include <sys/socket.h>
int listen(int sockfd, int backlog);
返回:若成功则为0,若出错则为-1

内核为任何一个给定的监听套接字维护两个队列:
1)未完成连接队列(incomplete connection queue),每个这样的SYN分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三次握手过程。这些套接字处于SYN_RCVD状态。
2)已完成连接队列(completed connection queue),每个已完成TCP三次握手过程的客户对应其中一项。这些套接字处于ESTABLISHED状态。

backlog参数曾被规定为这两个队列总和的最大值。
源自Berkeley的实现给backlog增设了一个模糊因子(fudge factor): 把它乘以1.5得到未处理队列最大长度。举例来说,通常指定为5的backlog值,实际上允许最多8项在排队。

当一个客户SYN到达时,若这些队列是满的,TCP就应该忽略该分节,也就是不发送RST,这么做是因为这种情况是暂时的,客户TCP将重发SYN,期望不久就能在这些队列中找到可用空间。要是服务器TCP立即响应以一个RST,客户的connect调用就会立即返回一个错误,强制应用进程处理这种情况,而不是让TCP的正常重传机制来处理。另外,客户无法区别响应SYN的RST究竟意味着”该端口没有服务器在监听”还是”该端口由服务在监听,但队列已满”。

Share

实时网络日志分析器和交互式查看器GoAccess:https://goaccess.io/

我在Nginx中体验了一下,感觉是十分强大的,dashboard打开以后也很酷