C++数据结构与算法先修概要(MOOC-邓俊辉)

C++语言程序设计基础:

1. 类(Class):
类是面向对象编程中的基本概念,用于封装数据和操作。它是一种用户自定义的数据类型,包含了数据成员和成员函数。数据成员表示类的属性,成员函数表示类的行为。通过实例化类创建对象,可以使用对象来访问和操作类的成员。

例如,下面是一个表示学生的类的示例:

class Student {
  private:
    string name;
    int age;
  
  public:
    void setName(string n) {
        name = n;
    }
  
    void setAge(int a) {
        age = a;
    }
  
    void display() {
        cout << "Name: " << name << endl;
        cout << "Age: " << age << endl;
    }
};

2. 继承(Inheritance):
继承是一种面向对象编程的机制,用于创建新类并从现有类派生。通过继承,子类可以继承父类的属性和方法,并可以添加自己的属性和方法。继承可以实现代码的重用和类之间的层次关系。

例如,考虑以下的继承关系:

class Animal {
  public:
    void eat() {
        cout << "Animal is eating" << endl;
    }
};

class Dog : public Animal {
  public:
    void bark() {
        cout << "Dog is barking" << endl;
    }
};

在上述例子中,Dog类继承自Animal类,继承了它的eat()方法。Dog类还添加了自己的方法bark()。

3. 重载(Overloading):
重载是一种在同一个作用域内定义多个具有相同名称但参数列表不同的函数或操作符的机制。通过重载,可以根据参数的不同来选择调用相应的函数或操作符。

例如,下面是一个重载的加法函数的示例:

int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

在上面的例子中,有两个名为add()的函数,但参数类型不同。根据调用时传递的参数类型,编译器会选择相应的函数来执行加法运算。

4. 重写(Override):
重写是在派生类中重新定义基类中已有的虚函数的机制。派生类可以提供自己的实现,覆盖基类中的虚函数。

例如,考虑以下的重写关系:

class Animal {
  public:
    virtual void makeSound() {
        cout << "Animal is making a sound" << endl;
    }
};

class Dog : public Animal {
  public:
    void makeSound() override {
        cout << "Dog is barking" << endl;
    }
};

在上述例子中,Dog类重写了基类Animal中的虚函数makeSound(),提供了自己的实现。

5. 虚方法(Virtual Method):
虚方法是在基类中声明为虚函数的方法。虚函数允许在派生类中进行重写。通过基类的指针或引用调用虚函数时,程序会根据指针或引用所指向的对象来选择正确的版本。

例如,考虑以下的虚方法的示例:

class Animal {
  public:
    virtual void makeSound() {
        cout << "Animal is making a sound" << endl;
    }
};

class Dog : public Animal {
  public:
    void makeSound() override {
        cout << "Dog is barking" << endl;
    }
};

int main() {
    Animal* animal = new Dog();
    animal->makeSound(); // 打印 "Dog is barking"
  
    return 0;
}

在上述例子中,Animal类中的makeSound()方法被声明为虚函数。在main函数中,使用基类的指针animal指向派生类Dog的对象。通过调用animal->makeSound(),编译器会根据animal指向的Dog对象选择正确的版本,即Dog类中重写的makeSound()方法。

6. 模板(Template):
模板是一种通用的编程工具,用于创建泛型类或函数。通过模板,可以编写可重用的代码,在不同类型上使用相同的操作。

例如,下面是一个模板函数的示例:

template <typename T>
T maximum(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    int maxInt = maximum<int>(3, 5); // 使用int类型
    double maxDouble = maximum<double>(3.14, 2.5); // 使用double类型
  
    return 0;
}

在上述例子中,maximum()是一个模板函数。它可以接受任意类型的参数,并返回其中较大的值。通过在调用时指定具体的类型,如maximum<int>(3, 5),模板函数会实例化成对应的函数。

离散数学基础:

1. 集合(Set):
集合是由一组互不相同的元素组成的对象。集合中的元素可以是任何类型的对象,如数字、字符、字符串等。集合中的元素没有特定的顺序,并且每个元素只能在集合中出现一次。

例如,以下是一个表示整数集合的示例:

S = {1, 2, 3, 4, 5}

2. 偏序集(Partial Order Set):
偏序集是集合上的一种二元关系,表示元素之间的偏序关系。在偏序集中,元素之间可以进行比较,但并不一定能够比较出大小关系。比如,对于两个元素a和b,在偏序集中可以有a ≤ b 或 a ≥ b,或者两者之间没有比较关系。

例如,以下是一个表示整数集合的偏序集的示例:

S = {1, 2, 3, 4, 5}
≤: {(1, 1), (1, 2), (1, 3), (2, 2), (2, 4), (3, 3), (4, 4), (5, 5)}

3. 良序(Well-Ordering):
良序是对集合的一种特殊偏序关系,保证集合中的每个非空子集都存在最小元素。良序集合可以看作是按照字典序或大小顺序进行排列的集合。

例如,以下是一个良序的整数集合的示例:

S = {1, 2, 3, 4, 5}
≤: {(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 2), (2, 3), (2, 4), (2, 5), (3, 3), (3, 4), (3, 5), (4, 4), (4, 5), (5, 5)}

4. 数学归纳法(Mathematical Induction):
数学归纳法是一种用于证明某个性质在自然数集上成立的数学推理方法。它包括两个步骤:基础步骤和归纳步骤。基础步骤证明性质在最小的自然数上成立,然后通过归纳步骤证明如果性质在一个自然数上成立,那么它在下一个自然数上也成立。

例如,使用数学归纳法证明所有正整数的和公式:

基础步骤:当n=1时,1 = (1*(1+1))/2 成立。
归纳步骤:假设n=k时公式成立,即 1 + 2 + ... + k = (k*(k+1))/2 成立。
我们需要证明当 n=k+1 时公式也成立,即 1 + 2 + ... + k + (k+1) = ((k+1)*((k+1)+1))/2 成立。

5. 级数(Series):
级数是由一个无穷多个数的和组成的数列。级数可以是无限递增或递减的,用于表示一系列数的总和。

例如,以下是一个级数的示例:

S = 1 + 2 + 4 + 8 + ...

6. 递归(Recursion):
递归是一种在函数或算法中调用自身的技术。递归可以在解决问题时将大问题分割为更小的子问题,并通过递归调用来解决每个子问题,最终达到解决整个问题的目标。

例如,以下是一个使用递归的计算阶乘的示例:

int factorial(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

7. 递推(Recurrence):
递推是一种根据已知条件或初始条件来计算后续项的方法。递推式定义了每个项与前几个项之间的关系,通过逐步推导计算后续的项。

例如,以下是一个使用递推求斐波那契数列的示例:

fib(0) = 0
fib(1) = 1
fib(n) = fib(n-1) + fib(n-2)

通过递推式,可以计算出斐波那契数列的每个项。例如,fib(2) = fib(1) + fib(0) = 1 + 0 = 1。

概率基础:

随机分布是指一组随机变量的可能取值及其对应的概率分布。概率则是用来描述随机事件发生的可能性的数值。

伯努利实验是指只有两种可能结果(成功或失败)的随机试验。

数学期望是指随机变量的平均值,表征变量取值的中心位置。

期望值的线性律则是指若两个随机变量X和Y,以及常数a和b,有E(aX + bY) = aE(X) + bE(Y),即期望值可以按比例相加。

举例来说,考虑一个公平的硬币投掷的伯努利实验,其中结果为正面的概率为0.5,结果为反面的概率也为0.5。假设成功事件为X,失败事件为Y,我们可以计算X和Y的期望值分别为E(X) = 0.5和E(Y) = 0.5。

现在考虑另外一个随机变量Z,表示连续抛掷3次硬币正面出现的次数。我们可以将Z表示为Z = X1 + X2 + X3,其中Xi表示第i次抛掷结果为正面的指示变量。根据期望值的线性律,我们可以计算E(Z) = E(X1) + E(X2) + E(X3) = 0.5 + 0.5 + 0.5 = 1.5。这表示在连续抛掷3次硬币的过程中,正面出现的平均次数为1.5次。

这个例子展示了随机分布中的概率、伯努利实验的概念,以及如何使用期望值和期望值的线性律来计算随机变量的平均值。

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值