题目:删除链表倒数第 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;
}
注意,我这段代码需要传入两个参数,链表的结点个数和需要删除结点的倒数位置。
《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]);
}
}
gcc -g gdbStart.c -o gdbStart
带有编译信息进行编译。
DALL-E 2
、Imagen
、Stable Diffusion
这些大名鼎鼎的模型背后是扩散模型。扩散模型中有加噪过程和去噪过程。
对于加噪过程,每一步的加噪结果是可以根据上一步的加噪结果和当前时间步 t 计算得到的,计算公式如下所示。
xt=
α
t
\sqrt{α_t}
αtxt−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 步噪声值。
关于第二层含义:使用采样器去除噪声
《如何学习》的总结如下:
记忆由提取和储存两种能力组成。事情储存在大脑中就不会被遗忘。我们以为的忘记了其实是提取能力减弱。但我们回忆起快要被遗忘的事情时,这件事就会被记忆得更牢固。为了增强记忆力,我们要打断环境的一贯性,让大脑记住更多环境信息,增强提取能力。也可以拉长复习的间隔时间,或进行自我测试。面对复杂问题,我们可以采取交替学习的方式来强化自己对知识的理解。或是用打断、激活和反思来找到灵感。同时我们可以根据问题类型来选择睡眠时间来保障最良好的发挥。