0%

1.定义链表节点的结构体时,C 和 C++ 写法的差异

2.初始化链表,带不带头节点

头指针
尾指针

首节点
尾节点

With 头节点
操作同一

Without 头节点
链表合并方便

头插法

尾插法

实现两个带头节点的链表 L1 和 L2进行连接,L2 连接到 L2 末尾。

将两个有序链表合并为一个有序链表。

数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。

基本数据类型

C++ 定义了一套包括 算数类型 和 空类型 在内点基本数据类型。其中 算术类型 包括 字符、整数型、布尔值和 浮点数。空类型不对应具体的值,仅用于一些特殊点场合,例如最常见点是,当函数不返回任何值时使用空类型作为返回类型。

在 C++ 中初始化是一个异常复杂的问题。

在 C++ 中 初始化 和 赋值 是两种完全不同的操作。

列表初始化

1
2
3
4
int unit_num = 0;
int unit_num = {0};
int unit_num{0};
int unit_num(0);

作为 C++11 新标准的一部分,用花括号初始化变量的到来全面的应用。

复合类型

引用和指针

2.6 自定义数据结构

预处理器

确保头文件多次包含仍然能正常工作的常用技术是预处理器(Preprocessor),它由 C++ 语言从 C语言中继承而来。

在 C++ 中,我们通过定义一个 类(Class)来定义自己的数据结构。一个定义的一种数据类型,以及相关联的一组操作。类机制是 C++ 中最重要的特性之一。实际上, C++ 在设计之初的考虑就是能够定义使用上如同内置类型一样自然的 类类型(Class Type)。每一个类实际上都定义了一种新的类型,其类型名就是类名。

类的定义一般放在头文件中,通常使用.h作为头文件的后缀。标准库头文件一般不带后缀。

对于 #include 指令,包含来自标准库的头文件时,用尖括号 (<>) 包围头文件名。对于不属于标准库的头文件,则用双引号 ("") 包围。

文件重定向:将标准输入和标准输出与命名文件相关联起来。

1
$ addItem <input_file >output_file

成员函数(member function)定义为类的一部分的函数,有时候也被称为方法(Method)。

点运算符 .

调用运算符 ()

在使用神经网络进行分类和预测的时候,使用 Cross Entropy Error 来 evaluate 模型比使用 classification error 和 mean squared error 能取得更好的效果。为什么呢?让我来解释一下。基本的 idea 是非常简单的,但是目前有很多对其 main idea 存在误解的看法。首先说明一下我们正在用一个神经网络模型来进行分类任务,比如通过性别、年龄、年收入等预测一个人的党派属性(属于民主党、共和党或者其他党派)。我们不是在用神经网络进行回归任务(其预测值为数值型),或者一个时间序列的神经网络,又或者是其他的什么神经网络。

现在假设你有三个训练数据的样本。你的神经网络在输出层使用 softmax 激活函数将输出值转换为概率。假设神经网络的输出值和样本的实际值如下所示:

1
2
3
4
5
| computed       |      targets         | correct? |
| -------------- |----------------------|----------|
| 0.3 0.3 0.4 | 0 0 1 (democrat) | yes |
| 0.3 0.4 0.3 | 0 1 0 (republican) | yes |
| 0.1 0.2 0.7 | 1 0 0 (other) | no |

这个神经网络的分类误差为 $\frac{1}{3} = 0.33$ ,其对应的分类准确率为 $\frac{2}{3}=0.67$ 。注意到这个神经网络仅仅将前两个样本分类正确,在第三个样本上却错的离谱。现在来看看另外一个神经网络:

1
2
3
4
5
computed       | targets              | correct?
-----------------------------------------------
0.1 0.2 0.7 | 0 0 1 (democrat) | yes
0.1 0.7 0.2 | 0 1 0 (republican) | yes
0.3 0.4 0.3 | 1 0 0 (other) | no

这个神经网络的分类误差也是 $\frac{1}{3} = 0.33$ 。但是这个神经网络的表现要比第一个要好,因为它预测正确分类的概率值要大,且对于第三个样本也仅仅是差一点就预测对了,不像第一个预测的那么离谱。由此看来,分类误差是一个很“粗暴”的误差度量指标。

现在我们看看 cross-entropy error。第一个神经网络对于第一个样本的交叉熵误差为:

注意到在这个神经网络分类中,计算有一点“怪异”,因为除了一项以外都是 0 。(网络上几个讲如何计算交叉熵的解释还不错。)所以,第一个神经网络的平均交叉熵误差计算如下:

第二个神经网络的平均交叉熵误差为:

Notice that the average cross-entropy error for the second, superior neural network is smaller than the ACE error for the first neural network. The ln() function in cross-entropy takes into account the closeness of a prediction and is a more granular way to compute error.

本文翻译自:Why You Should Use Cross-Entropy Error Instead Of Classification Error Or Mean Squared Error For Neural Network Classifier Training