Skip to content

Commit 45f0fb9

Browse files
添加成员函数空指针调用
1 parent 6b969a5 commit 45f0fb9

File tree

5 files changed

+189
-27
lines changed

5 files changed

+189
-27
lines changed

Linux/linux_command.adoc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ ifdef::rootpath[]
1515
:srcdir: {rootpath}../src/
1616
endif::rootpath[]
1717

18-
ifndef::rootpath[]
19-
:rootpath: ../
20-
:srcdir: {rootpath}{path}../src/
21-
endif::rootpath[]
2218

2319

2420
== Linux命令
24.4 KB
Loading

src/main.cpp

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,43 +18,32 @@
1818
#include <condition_variable>
1919
#include <algorithm>
2020
#include <unordered_map>
21-
21+
#include <list>
2222

2323
using namespace std;
2424

2525

26-
const char * const SubStatusStr[] = {"init", "subscribe", "subscribed", "deleteting", "firstSub"};
2726

28-
class MyClass {
29-
public:
30-
MyClass(int value) : data(value) {}
3127

32-
virtual void printData() const {
33-
//std::cout << data << std::endl;
34-
}
3528

36-
private:
37-
int data;
38-
};
3929

40-
class MyClass1 {
41-
public:
42-
MyClass(int value) : data(value) {}
30+
int main() {
31+
4332

44-
virtual void printData() const {
45-
//std::cout << data << std::endl;
33+
std::set<int> setAlices{1};
34+
std::set<int> setAlices2{2};
35+
std::set<int> setRet{};
36+
37+
std::set_difference(setAlices2.begin(), setAlices2.end(),
38+
setAlices.begin(), setAlices.end(), std::inserter(setRet, setRet.begin()));
39+
40+
for (const auto& index : setRet) {
41+
std::cout << index << std::endl;
4642
}
4743

48-
private:
49-
int data;
50-
};
5144

5245

53-
int main() {
54-
MyClass *lpObj = new MyClass(1);
5546

56-
// 调用成员函数
57-
lpObj->printData(); // 静态绑定调用
5847

5948
return 0;
6049
}

utils/技术文档写作模板.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ Mapnik -- 用于将经纬度信息渲染成图片
4949
GraphHopper - 用于实现路径规划
5050

5151

52+
== f.lux
53+
54+
用于去除电脑蓝光,长时间工作不累
55+
56+
5257

5358

5459

算法/forward_error_correction.adoc

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
:toc:
2+
3+
// 保证所有的目录层级都可以正常显示图片
4+
:path: 算法/
5+
:imagesdir: ../image/
6+
7+
// 只有book调用的时候才会走到这里
8+
ifdef::rootpath[]
9+
:imagesdir: {rootpath}{path}{imagesdir}
10+
endif::rootpath[]
11+
12+
== Forward Error Correction
13+
14+
15+
=== Error Detection vs. Forward Error Correction
16+
17+
常见的错误检测
18+
19+
- Parity(奇偶校验)
20+
- Checksum(校验和)
21+
- Cyclic redundancy check(CRC)
22+
23+
但是这些检测只能用来发现错误,并不能用于校正错误,一旦发生了错误只能使用重传进行解决。
24+
25+
但是在一些系统中是无法进行重传的
26+
27+
1. HDTV中连接是单向通讯
28+
2. BER(Bit Error Rate)非常高的连接中, stem:[\mathrm{BER}=\frac{\text { Number of bits received incorrectly }}{\text { Total number of bits transmitted }}]
29+
3. 如果连接中具有高时延的场景,比如卫星通讯中。
30+
31+
FEC是通过发送冗余数据来实现发现错误时通过用于数据来修正异常数据,或者解决数据丢失的情况。
32+
33+
=== 码率(Code Rate)
34+
35+
在通信和信息理论中,特别是涉及信道编码时,是指信息数据比特数与总传输比特数(即编码后的比特数)之比。用公式表示就是 \( r = \frac{k}{n} \),其中 \(k\) 是未经编码的信息比特数,\(n\) 是编码之后的比特数(即码字的长度)。码率 \(r\) 总是小于或等于 1。
36+
37+
例如,在一个 (5,2) 的块编码中,每两个信息比特被编码成五个比特的码字,因此码率为 \( r = \frac{2}{5} \)。
38+
39+
在编码时,接受者和发送者都共同持有同一份码表(codebook),码表就是将数据从k-bit的数据编码为n-bit编码数据的表。
40+
41+
|===
42+
|Data Block |Codeword
43+
44+
|00 |00000
45+
|01 |00111
46+
|10 |11001
47+
|11 |11110
48+
49+
|===
50+
51+
码率反映了编码方案的效率。码率越高,意味着添加的冗余越少,信息传输的效率越高,但错误检测和纠正的能力可能也会随之减弱。相反,码率越低,意味着添加的冗余越多,虽然传输效率下降,但是可以提高错误检测和纠正的能力。
52+
53+
在实际应用中,码率的选择取决于通信链路的特性。例如,在高噪声环境下,可能需要较低的码率以增强抗噪能力;而在带宽受限的情况下,则可能需要较高的码率以提高传输效率。
54+
55+
码率的概念对于评估和设计前向纠错(FEC, Forward Error Correction)编码方案非常重要。FEC 在无线通信、卫星通信等领域有着广泛的应用,尤其是在那些重传请求不可行或延迟很高的环境中。通过增加适当的冗余,FEC 允许接收端在不需要重发的情况下检测并纠正错误。
56+
57+
=== 汉明距离(Hamming Distance)
58+
59+
衡量两个等长字符串之间的差异的一种方式。具体来说,它是指两个字符串对应位置的不同字符的数量。汉明距离在许多领域都有应用,如信息论、编码理论、密码学、生物信息学等。
60+
61+
不仅可以检测错误,还可以定位并纠正单比特错误
62+
63+
设有两个等长的字符串 \(x\) 和 \(y\),它们的长度为 \(n\)。汉明距离 \(d_H(x, y)\) 被定义为 \(x\) 和 \(y\) 中不同字符的数目。
64+
65+
假设我们有两个二进制字符串 \(x = 1011101\) 和 \(y = 1001001\),我们可以逐位比较这两个字符串:
66+
67+
1. 第1位:1 vs 1 → 相同
68+
2. 第2位:0 vs 0 → 相同
69+
3. 第3位:1 vs 0 → 不同
70+
4. 第4位:1 vs 1 → 相同
71+
5. 第5位:1 vs 0 → 不同
72+
6. 第6位:0 vs 0 → 相同
73+
7. 第7位:1 vs 1 → 相同
74+
75+
因此,这两个字符串之间的汉明距离为 \(d_H(x, y) = 2\)。
76+
77+
.应用
78+
****
79+
- **编码理论**:在编码理论中,汉明距离用于衡量错误检测和纠正的能力。码字之间的最小汉明距离决定了它可以纠正或检测的最大错误数量。
80+
- **密码学**:汉明距离有时也被用来分析加密算法的安全性。
81+
- **生物信息学**:在基因组研究中,汉明距离可以用来比较DNA序列,找出突变点。
82+
****
83+
84+
错误纠正的能力和汉明距离是直接相关的,一个n-bit位的码字\(v_1\)和\(v_2\)定义如下:
85+
86+
[stem]
87+
++++
88+
d(v_(1),v_(2))=sum_(ℓ=0)^(n-1)XOR(v_(1)(ℓ),v_(2)(ℓ))
89+
++++
90+
91+
汉明距离最小值定义:
92+
stem:[d_(min)=min_(i!=j)d(v_(i),v_(j))]
93+
94+
在前向纠错(FEC,Forward Error Correction)编码中,汉明距离(Hamming Distance)和冗余(Redundancy)是两个非常重要的概念,它们各自在错误检测与纠正中发挥着不同的作用。
95+
96+
汉明距离(Hamming Distance)
97+
98+
汉明距离是衡量两个等长字符串之间差异的一种度量方式。具体而言,汉明距离是指两个字符串中不同位的数量。在块编码(block coding)中,汉明距离直接关系到错误纠正的能力。例如,两个码字 \(v_1\) 和 \(v_2\) 的汉明距离 \(d(v_1, v_2)\) 定义为两个码字中异或结果为 1 的位数。*汉明距离越大,码字间区分度越高,纠错能力越强*。
99+
100+
最小汉明距离 \(d_{\text{min}}\) 是指所有码字之间汉明距离的最小值。对于某些正整数 \(t_c\),如果一个码字的最小汉明距离满足 \(d_{\text{min}} \geq 2t_c + 1\),那么该码字可以纠正最多 \(t_c\) 个比特错误。换言之,可纠正的错误数量 \(t_c\) 由公式 \(t_c = \left\lfloor \frac{d_{\text{min}} - 1}{2} \right\rfloor\) 给出,其中 \(\left\lfloor x \right\rfloor\) 表示向下取整。
101+
102+
每个Codeword的检测错误能力计算方式如下:
103+
104+
stem:[t_(d)=d_(min)-1]
105+
106+
- 如果d~min~等于错误比特数e,可能有无法检测的错误,因为其检测能力是 (d~min~ - 1)
107+
- 如果d~min~大于错误比特数e,可以检测到错误,但是不能保证纠正错误,比如错误比特数为e= d~min~ - 1,而此时纠错能力为 \(t_c = \left\lfloor \frac{d_{\text{min}} - 1}{2} \right\rfloor\)
108+
109+
冗余(Redundancy)
110+
111+
冗余指的是在编码过程中引入的额外信息量,它是相对于原始信息量的一个比例。冗余可以用来提高编码的鲁棒性,使得接收端能够在接收到错误的码字后仍然能够恢复出原始数据。冗余的程度可以用冗余度来描述,冗余度定义为 \( \text{redundancy} = \frac{n - k}{k} \),其中 \(n\) 是码字的长度,\(k\) 是原始数据的长度。码率 \(r\) 定义为 \(r = \frac{k}{n}\),码率越接近 1,表示冗余越少;反之,码率越小,表示冗余越多。
112+
113+
114+
汉明距离与冗余的关系
115+
116+
在设计编码方案时,通常希望 \(d_{\text{min}}\) 越大越好,这样可以提高错误检测和纠正的能力。然而,增加 \(d_{\text{min}}\) 往往意味着需要增加冗余,即需要更多的比特来表示每个数据比特。因此,存在一个内在的权衡:提高 \(d_{\text{min}}\) 以增强错误检测和纠正能力的同时,必须接受更高的冗余(更低的码率)。
117+
118+
示例
119+
120+
假设我们有一个 (5,2) 的块码,其中 \(n=5\),\(k=2\),码率为 \(r=\frac{2}{5}\)。这个码的冗余度为 \(\frac{5-2}{2} = \frac{3}{2}\)。码字之间的汉明距离为:
121+
122+
- \(d(v_1, v_2) = 3\)
123+
- \(d(v_1, v_3) = 3\)
124+
- \(d(v_1, v_4) = 4\)
125+
- \(d(v_2, v_3) = 4\)
126+
- \(d(v_2, v_4) = 3\)
127+
- \(d(v_3, v_4) = 3\)
128+
129+
因此,\(d_{\text{min}} = 3\),这意味着这个码可以纠正最多 \(t_c = \left\lfloor \frac{3 - 1}{2} \right\rfloor = 1\) 个比特错误。
130+
131+
.总结
132+
****
133+
汉明距离和冗余是编码方案设计中两个关键的因素。汉明距离决定了编码的错误检测和纠正能力,而冗余则体现了为了实现这一能力所付出的成本。在实际应用中,设计者需要在提高 \(d_{\text{min}}\) 和保持较小的冗余之间做出权衡。
134+
****
135+
136+
=== Decoding invalid Codewords
137+
138+
.Decoding invalid Codewords
139+
image::network/image-2024-10-09-13-05-14-005.png[]
140+
141+
假设我们要传输一个00,使用(5,2)块码表编码,我们将会得到00000,通过channel进行传输时,接收端得到的结果是00100(一个bit在传输过程中发生错误),接收端应该怎么办?或者说接收端应该怎样根据现有条件校正错误的数据?
142+
143+
为了对错误数据进行校正,就需要用到汉明距离了,当收到一个错误的数据,我们取出码表,然后找出码表中和异常数据的最小汉明距离。
144+
145+
.Our (5, 2)example code again
146+
|===
147+
|Data Block |Codeword
148+
149+
|00 |v~1~ = 00000
150+
|01 |v~2~ = 00111
151+
|10 |v~3~ = 11001
152+
|11 |v~4~ = 11110
153+
|===
154+
155+
我们接收的事 \(00100\),和码表的汉明距离计算如下:
156+
157+
- \(d(00100, v_1) = 1\)
158+
- \(d(00100, v_2) = 2\)
159+
- \(d(00100, v_3) = 4\)
160+
- \(d(00100, v_3) = 3\)
161+
162+
校正数据的过程就是取最小汉明距离的过程,这里计算结果显示,v~1~ 和错误数据的汉明距离最小,因此选用v~1~的 Data block作为正确的数据。
163+
164+
因此这个 (5,2) 的编码表,能够保证错一位的数据总是被正确的校正回来。
165+
166+
167+
168+
169+
170+
171+
172+

0 commit comments

Comments
 (0)