学习记录第十四天

快速排序

void qSort(int *begin,int *end)    //快速排序
{
    if(begin >= end)
    {
        return;
    }
    int t = *begin;
    int *p = begin;
    int *q = end;
    while(p < q)
    {
        while(p < q && *q >= t)
        {
            --q;
        }
        while(p < q && *p <= t)
        {
            ++p;
        }
        swap(p,q);
    }
    swap(begin,q);
    qSort(begin,q - 1);
    qSort(q + 1,end);
}

字符指针表示字符串
字符指针是一个变量,其值为字符类型数据的地址。可以使用字符指针来指向字符串的首字符,从而间接访问整个字符串。例如:

char *str = "Hello, World!";

这里 str 是一个字符指针,它指向字符串字面量 "Hello, World!" 的起始位置。
字符数组表示字符串
字符数组是一种特殊的数组,其元素类型为 char。字符串常量可以用来初始化字符数组,并且在初始化时,编译器会自动在字符串末尾添加空字符 '\0' 作为终止标记。例如:

char strArray[] = "Hello, World!";

在这个例子中,strArray 是一个字符数组,包含了字符串 "Hello, World!" 的所有字符,包括结尾的空字符 '\0'。

指向函数的指针
声明函数指针
函数指针的声明需要指定函数的返回类型和参数类型,其语法类似于函数声明,但需要在类型前加上 * 符号来表示这是一个指针。例如:

int *funcPtr(int, int);

迭代器

用 *begin表示数组的第一个元素,用 *end表示数组的最后一个元素

例如,用迭代器实现选择排序:

void choiceSort(int *begin,int *end)
{
    while(begin < end)
    {
        int *p = begin + 1;
        while(p <= end)
        {
            if(*begin > *p)
            {
                swap(begin,p);
            }
            ++p;
        }
        ++begin;
    }
}

const:

const是一个类型限定符,用于表示对象不可修改。当应用于变量时,const关键字告诉编译器和程序员这个变量的值在初始化后不应该也不可以被改变。这有助于提高代码的可靠性和可读性,同时也可以避免意外修改变量的值,从而减少程序中的错误。
  1.你可以使用const来定义变量,这些变量在程序执行过程中不会改变。例如:const int MAX = 100;

  2.函数参数保护:当你传递参数给函数时,可以使用const关键字来保护这些参数不被函数修改。例如:

void print(const char *str) 
{
    // str不能在函数内部被修改
    printf("%s\n", str);
}

  3.数组和指针:const也可以用于指针,可以指定指针所指向的内容不能改变,或者指针本身不能改变(不能指向其他位置)。例如:

const int arr[] = {1, 2, 3};
int const *ptr = arr; // ptr指向的值不能改变,但ptr可以指向其他位置
int * const ptr2 = arr; // ptr2不能指向其他位置,但ptr2指向的值可以改变

动态内存分配:动态内存分配是指在程序运行时根据需要请求分配内存空间的过程。

malloc:用于分配指定大小的内存空间,并返回指向该空间的指针。如果分配失败,返回NULL。
realloc:用于调整已分配内存的大小,可以增加或减少内存块的大小。
free:用于释放由malloc、calloc或realloc分配的内存空间。

动态内存分配的注意事项
使用动态内存分配时,需要注意以下几点:
  1.避免内存泄漏:确保每次分配的内存在不再需要时都被释放。
  2.防止野指针:释放内存后,应将指针设置为NULL,以防止野指针的出现。
  3.注意内存越界:在操作动态分配的内存时,不得超出分配的范围。
  4.正确处理错误:检查malloc、calloc和realloc的返回值,以确保内存分配成功。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴听到你正在学习《机器学习》这本经典的教材,下面我为你提供第十四章概率图模型的Python实现学习笔记。 ## 1. 朴素贝叶斯分类器 ### 1.1 数据准备 在本章中,我们将使用著名的鸢尾花数据集进行分类。首先,我们可以从sklearn库中导入该数据集。 ```python from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` ### 1.2 朴素贝叶斯分类器实现 接下来,我们可以使用sklearn库中的朴素贝叶斯分类器进行分类,具体实现如下: ```python from sklearn.naive_bayes import GaussianNB from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) gnb = GaussianNB() gnb.fit(X_train, y_train) y_pred = gnb.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` ### 1.3 结果分析 运行上述代码后,我们可以得到该模型在测试集上的准确率,结果如下所示: ``` Accuracy: 1.0 ``` 可以看出,该模型在鸢尾花数据集上表现出色,准确率达到了100%。 ## 2. 隐马尔可夫模型 ### 2.1 数据准备 在本节中,我们将使用一个简单的例子来介绍隐马尔可夫模型的实现。假设我们有一个长度为100的序列,每个位置上的值都是0或1,其中0和1出现的概率分别为0.6和0.4。我们可以使用numpy库生成这个序列。 ```python import numpy as np np.random.seed(42) sequence = np.random.choice([0, 1], size=100, p=[0.6, 0.4]) ``` ### 2.2 隐马尔可夫模型实现 接下来,我们可以使用hmmlearn库中的隐马尔可夫模型进行序列建模,具体实现如下: ```python from hmmlearn import hmm model = hmm.MultinomialHMM(n_components=2) model.fit(sequence.reshape(-1, 1)) logprob, states = model.decode(sequence.reshape(-1, 1)) print('Sequence:', sequence) print('States:', states) ``` ### 2.3 结果分析 运行上述代码后,我们可以得到该模型对序列的建模结果,结果如下所示: ``` Sequence: [0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] States: [1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] ``` 可以看出,模型对序列进行了建模,并输出了每个位置上的状态,其中0表示“假”,1表示“真”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值