• ARTS打卡第四周之删除链表倒数第几个节点、gdb start命令、扩散模型、如何学习分享


    Algorithm

    题目:删除链表倒数第 n 个结点
    分析:可以把通过两个结点进行标记,有一个节点需要遍历得快点,简称为快结点,有个结点遍历得慢,简称为慢结点。快结点先停在正数第 n 个结点处,然后快慢结点同时往后边遍历,直到快结点走到最后结点,那么慢结点就会走到需要删除结点的上一个结点,然后进行删除。
    代码:

    #include 
    #include 
    
    typedef struct DataNode{
        int data;
        struct DataNode* next;
    }node;
    
    int main(int argv,char *argc[]) {
        int nodeTotal = atoi(argc[1]);
        int indexOfCountBackwards = atoi(argc[2]);
        if(indexOfCountBackwards>nodeTotal){
            printf("倒数索引不能大于节点个数");
            return 0;
        }
        node* head = NULL;
        node* recordNode = NULL;
        // 创建链表
        for(int i=nodeTotal;i>0;i--){
            node* newNode = (node *)malloc(sizeof(node));;
            newNode->next = NULL;
            newNode->data = i;
            if(i==nodeTotal){
                head = newNode;
                recordNode = newNode;
            }else{
                recordNode->next = newNode;
                recordNode = recordNode -> next;
            }
        }
        node* nodeBeforeDeleting = head;
        recordNode = head;
        for(int deleteIndex=indexOfCountBackwards;deleteIndex>0;deleteIndex--){
            recordNode = recordNode->next;
        }
        while(recordNode->next!=NULL){
            recordNode = recordNode->next;
            nodeBeforeDeleting = nodeBeforeDeleting->next;
        }
        recordNode=nodeBeforeDeleting->next;
        nodeBeforeDeleting->next = nodeBeforeDeleting->next->next;
        recordNode->next = NULL;
        // 不要忘记释放删除节点所占的内存
        free(recordNode);
        recordNode = head;
    
        while(recordNode!=NULL){
            printf("%d\n", recordNode->data);
            recordNode = recordNode->next;
        }
        return 0;
    }
    
    • 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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    注意,我这段代码需要传入两个参数,链表的结点个数和需要删除结点的倒数位置。

    Review

    《start command》里边写了在gdb里边start命令的使用,我用来演示的代码gdbStart.c如下:

    #include 
    #include
    
    int main(int argc, char *argv[]) {
        for(int i=0;i<argc;i++){
            printf("%s\n",argv[i]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    gcc -g gdbStart.c -o gdbStart带有编译信息进行编译。
    在这里插入图片描述

    Technique/Tip

    DALL-E 2ImagenStable Diffusion这些大名鼎鼎的模型背后是扩散模型。扩散模型中有加噪过程和去噪过程。

    加噪过程

    对于加噪过程,每一步的加噪结果是可以根据上一步的加噪结果和当前时间步 t 计算得到的,计算公式如下所示。
    xt​= α t \sqrt{α_t} αt xt−1​+ 1 − α t \sqrt{1−α_t} 1αt ϵ
    公式中,xt−1​​ 表示第t步的加噪结果;xt−1​​ 表示第 t-1 步的加噪结果; α t \sqrt{α_t} αt 是一个预先设置的超参数,用于控制随时间步的加噪强弱,你可以理解为预先设定从 α1​ 到 α1000​ 1000 个参数;ϵ 表示一个随机的高斯噪声。

    去噪过程

    去噪的过程包括两层含义:
    1.如何根据当前时间步的噪声图预测上一步加入的噪声?
    2.如何在当前时间步的噪声图上去除这些噪声?

    关于第一层含义,主流的做法是使用深度学习算法,训练一个 UNet 模型,从而可以输入第 t 步加噪结果和时间步 t,预测从第 t-1 步到第 t 步噪声值。
    关于第二层含义:使用采样器去除噪声

    Share

    《如何学习》的总结如下:
    记忆由提取和储存两种能力组成。事情储存在大脑中就不会被遗忘。我们以为的忘记了其实是提取能力减弱。但我们回忆起快要被遗忘的事情时,这件事就会被记忆得更牢固。为了增强记忆力,我们要打断环境的一贯性,让大脑记住更多环境信息,增强提取能力。也可以拉长复习的间隔时间,或进行自我测试。面对复杂问题,我们可以采取交替学习的方式来强化自己对知识的理解。或是用打断、激活和反思来找到灵感。同时我们可以根据问题类型来选择睡眠时间来保障最良好的发挥。

  • 相关阅读:
    零基础学Linux内核之设备驱动篇(7)_字符设备_实验篇2
    【C语言 | 预处理】C语言预处理详解(二) —— #pragma指令介绍以及内存对齐、结构体大小
    函数指针
    LVS负载均衡群集NAT模式
    前端国密SM4加密代码
    计算机毕业设计ssm社区疫情防控管理系统rgb2a系统+程序+源码+lw+远程部署
    如何在linux系统中设置定时任务?
    6.1二叉树的递归遍历(LC144,LC15,LC94)
    多边形三角剖分的最小值 python
    供电企业的福音,远程抄表系统无线解决方案,让工程师告别奔波
  • 原文地址:https://blog.csdn.net/qq_42108074/article/details/132699926