代码随想录算法训练营:3/60

TwinCAT3新手必看:5分钟搞定EtherCAT从站PDO动态配置(附电流变量添加技巧) 本文为TwinCAT3新手提供了EtherCAT从站PDO动态配置的快速入门指南。文章详细解析了Process Data Object(PDO)在实时数据交换中的核心作用,并分步演示了在TwinCAT3工程中扫描从站、动态添加与映射PDO(包括接收PDO和发送PDO)的完整操作流程。重点分享了如何灵活添加并监控如电机实际电流等关键工艺变量的高级技巧,并针对不同品牌驱动器的兼容性问题提供了实用的调试心法和解决方案,帮助工程师快速上手并优化工业自动化系统。 阅读详情

非科班学习算法day3 | LeetCode203: 移除链表元素,Leetcode707: 设计链表,Leetcode206: 反转链表

目录

介绍

一、基础概念补充:

1.c++中的new

基本数据类型的动态分配:

类类型的动态分配:

new与数组的动态分配:

类类型的动态分配数组:

new与有参构造函数的结合使用:

2.链表

C++链表概述

C++单向链表构建

 C++链表增删节点思路

二、LeetCode题目

1.LeetCode203: 移除链表元素

题目解析

2.Leetcode707: 设计链表

题目解析

定义结构体

 获取下标为index的节点的值

 头部添加节点

  在尾部添加节点

 在index插入节点val

 删除下标为index的节点

3.Leetcode206:反转链表

题目解析

 

总结


介绍

包含LC的两道题目,还有相应概念的补充。

相关图解和更多版本:

代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、基础概念补充:

1.c++中的new

        在C++中,new运算符用于动态地分配内存。它执行两个主要操作:首先,它从堆区域中分配一块内存,这块内存的大小足以容纳特定类型(或对象)的数据;其次,它调用该类型的构造函数来初始化这块内存中的对象(如果是类类型)

基本数据类型的动态分配:

int* p_int = new int; // 分配一个int大小的内存,并返回指向它的指针

类类型的动态分配:

// 假设有一个类MyClass
class MyClass {
public:
    MyClass() { std::cout << "Constructor called\n"; }
    ~MyClass() { std::cout << "Destructor called\n"; }
};

MyClass* p_myclass = new MyClass(); // 分配MyClass对象的内存,并调用构造函数

new与数组的动态分配:

int* arr = new int[10]; // 分配一个包含10个int的数组

类类型的动态分配数组:

// 假设有一个类MyClass
MyClass* arr_myclass = new MyClass[5]; // 分配一个包含5个MyClass对象的数组

new与有参构造函数的结合使用:

// 假设有一个类MyClass,它有一个带参数的构造函数
class MyClass {
public:
    MyClass(int value) : data(value) { std::cout << "Constructor with value: " << data << '\n'; }
    ~MyClass() { std::cout << "Destructor called\n"; }
private:
    int data;
};

MyClass* p_myclass = new MyClass(42); // 分配MyClass对象的内存,并调用带参数的构造函数

new必须与delete的配对使用,否则可能造成内存泄漏

释放单个对象的内存:

delete p_int; // 释放p_int指向的int内存
delete p_myclass; // 释放p_myclass指向的MyClass对象的内存

释放数组的内存:

delete[] arr; // 释放arr指向的int数组的内存
delete[] arr_myclass; // 释放arr_myclass指向的MyClass数组的内存

2.链表

C++链表概述

        链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C++中,链表通常通过结构体或类来实现,每个节点包含数据部分和指针部分。链表的特点是节点在内存中不连续存储,而是通过指针相互链接. 

        基本操作包括创建链表、插入节点、删除节点、查找节点和遍历链表等。插入和删除节点的时间复杂度通常为O(1),而查找节点的时间复杂度为O(n),因为需要从头节点开始逐个遍历。可以看出来频繁的插入和删除的操作用链表是有优势的。

C++单向链表构建

// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

 C++链表增删节点思路

强烈推荐统一养成虚拟头节点的方法解决问题。

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E9%93%BE%E8%A1%A8%E7%9A%84%E7%B1%BB%E5%9E%8B

二、LeetCode题目

1.LeetCode203: 移除链表元素

题目链接:203. 移除链表元素 - 力扣(LeetCode)

题目解析

        首先,采用虚拟头节点的方法。创建一个新的节点,将节点的尾部指向现在的头部(head),并且创建遍历指针。

        寻找目标值,调整链表指向。

 c++代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) 
    {
        //创建虚拟头节点,并设置为0
        ListNode* dummyhead = new ListNode(0);
        //将虚拟头节点添加到头部
        dummyhead->next = head;
        //设置循环指针指向虚拟头节点
        ListNode* cur = dummyhead;

        while(cur->next != nullptr)
        {
            if(cur->next->val == val)
            {
                //记录需要删除的节点位置
                ListNode* temp = cur->next;

                //更新链表顺序
                cur->next = cur->next->next;

                //手动释放内存
                delete temp;
            }
            else
            {
                //移动检索指针
                cur = cur->next;
            }
        }
        //返回头部节点
        head = dummyhead->next;
        delete dummyhead;
        return head;   
    }
};

注意点1:对于new出来的空间,要手动管理,所以在最后将dummyhead单独删除,防止内存泄漏;同样的,对于不需要的空间,手动删除不需要的节点temp

注意点2:关于边界的设置cur->next != nullptr,这里要注意检查的是下一个节点是否存在,cur != nullptr是检查指针指向是不是空,是完全不一样的概念

注意点3:关于cur指针,首先最后是需要返回头节点,也就是head,而head现在依靠的是dummyhead的指向,所以不要直接移动头节点,而是选择设立新的指针;其次指针重新指向的过程需要的是将cur节点的下一位替换为cur节点的下一位的下一位。

2.Leetcode707: 设计链表

题目链接:

题目解析

       主要是借助虚拟头节点,将操作统一化

 C++代码如下: 

class MyLinkedList {
public:
    //定义链表结构体
    struct LinkedNode
    {
        int val;
        LinkedNode* next;
        LinkedNode(int x):val(x),next(nullptr){}        
    };

    //初始化函数
    MyLinkedList() 
    {
        dummyhead = new LinkedNode(0);
        size = 0;
    }
    

    //获取下标为index的节点的值
    int get(int index) 
    {
        if(index < 0 || index >= size)
        {
            return -1;
        }

        //设置检索指针
        LinkedNode * cur = dummyhead->next;
        
        //搜索!
        while(index > 0)
        {
            cur = cur->next;
            index--;
        }
        return cur->val; 
    }
    
    //头部添加节点-ok
    void addAtHead(int val) 
    {
        LinkedNode * newnode = new LinkedNode(val);
        newnode->next = dummyhead->next;
        dummyhead->next = newnode;
        size++;
    }
    
    //在尾部添加节点-ok
    void addAtTail(int val) 
    {
        LinkedNode * cur = dummyhead;
        while(cur->next != nullptr)
        {
            cur = cur->next;
        }
        LinkedNode * newnode = new LinkedNode(val);
        newnode->next = nullptr;
        cur->next = newnode;
        size++;
    }
    
    //在index插入节点val-ok
    void addAtIndex(int index, int val) 
    {
        if(index > size)
        {
            return;
        }
        LinkedNode * newnode = new LinkedNode(val);
        LinkedNode * cur = dummyhead;
        while(index > 0)
        {
            cur = cur->next;
            index--;
        }
        newnode->next = cur->next;
        cur->next = newnode;
        size++;
    }
    
    //删除下标为index的节点 - ok
    void deleteAtIndex(int index) 
    {
        if(index >= size || index < 0)
        {
            return;
        }
        LinkedNode * cur = dummyhead;
        while(index > 0)
        {
            cur = cur->next;
            index--;
        }
        LinkedNode* temp = cur->next;
        cur->next = cur->next->next;
        delete temp;
        temp = nullptr;
        size--;
    }
private:
    int size;
    LinkedNode* dummyhead;
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */

定义结构体

属于常规操作

 struct LinkedNode
    {
        int val;
        LinkedNode* next;
        LinkedNode(int x):val(x),next(nullptr){}        
    };

 获取下标为index的节点的值

先对输入进行判定!如果不符合检索条件,直接返回-1;接下来首先将指针指向链表头部,因为这里的要求是,首位是0开始检索index(其实定义在dummyhead也可以写,不过个人感觉不够工整,和后面的条件也不够统一,书写过程中容易搞混乱),接下来借助于index--来进行链表的检索。

 //获取下标为index的节点的值
    int get(int index) 
    {
        if(index < 0 || index >= size)
        {
            return -1;
        }

        //设置检索指针
        LinkedNode * cur = dummyhead->next;
        
        //搜索!
        while(index > 0)
        {
            cur = cur->next;
            index--;
        }
        return cur->val; 
    }

 头部添加节点

先设置虚拟头节点,然后将新增节点的尾部指向头节点,再将虚拟头节点的尾部指向新增节点,构成新的链表,这样子做是为了防止next无法准确找到,所以一定要注意顺序。不要忘记调整链表长度便于维护。

    //头部添加节点-ok
    void addAtHead(int val) 
    {
        LinkedNode * newnode = new LinkedNode(val);
        newnode->next = dummyhead->next;
        dummyhead->next = newnode;
        size++;
    }

  在尾部添加节点

和头部添加节点的思路是一样的,不过这里显示要进行链表的遍历,先找到需要的位置,即尾部;然后再将新建节点的尾部指向空,最后添加到原有的链表中。不要忘记调整链表长度便于维护。

    //在尾部添加节点-ok
    void addAtTail(int val) 
    {
        LinkedNode * cur = dummyhead;
        while(cur->next != nullptr)
        {
            cur = cur->next;
        }
        LinkedNode * newnode = new LinkedNode(val);
        newnode->next = nullptr;
        cur->next = newnode;
        size++;
    }
    

 在index插入节点val

这一步类似于之前的总结。首先检查条件是否满足检索要求,不满足直接返回;之后遍历链表直到检索位置,新建节点,将新节点插入。同样的,插入时候注意指向的顺序。不要忘记调整链表长度便于维护。

    //在index插入节点val-ok
    void addAtIndex(int index, int val) 
    {
        if(index > size)
        {
            return;
        }
        LinkedNode * newnode = new LinkedNode(val);
        LinkedNode * cur = dummyhead;
        while(index > 0)
        {
            cur = cur->next;
            index--;
        }
        newnode->next = cur->next;
        cur->next = newnode;
        size++;
    }
    

 删除下标为index的节点

    //删除下标为index的节点 - ok
    void deleteAtIndex(int index) 
    {
        if(index >= size || index < 0)
        {
            return;
        }
        LinkedNode * cur = dummyhead;
        while(index > 0)
        {
            cur = cur->next;
            index--;
        }
        LinkedNode* temp = cur->next;
        cur->next = cur->next->next;
        delete temp;
        temp = nullptr;
        size--;

3.Leetcode206:反转链表

题目链接:206. 反转链表 - 力扣(LeetCode)

题目解析

       首先基于链表的数据结构,可以知道,反转链表可以采用逐个,更改指向。那么问题是如果我定义一个指针cur,当我用cur->next指向了cur,因为指向发生了变化,那么cur->next->next就会造成丢失或者错位!所以可以采用两个指针来进行分别的检索和保存。下面具体实现一下。

C++代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) 
    {
        //定义顺序链表的头部
        ListNode * cur1 = head;

        //定义反向链表的尾部
        ListNode * cur2 = nullptr;

        //定义临时变量
        ListNode * temp;

        while(cur1 != nullptr)
        {
            //保存顺序链表下一位
            temp = cur1->next;

            //重新指向
            cur1->next = cur2;

            //移动指针
            cur2 = cur1;
            cur1 = temp;
        }
        //返回新链表的尾部
        return cur2;
    }
};

注意点1:补充一下,这里定义temp应该指向空,防止造成野指针。

//定义临时变量
ListNode * temp = nullptr;

注意点2:cur1指向起始位置,进行链表的正向检索;cur2指向空,用来作为新链表的尾部来接受指向;想移动cur1要借助提前保存好下一位置的指针。

注意点3:最后的返回条件是cur2,因为此时,cur1已经指向了链表原来顺序的尾部(null)

更为详细的图解见:代码随想录 (programmercarl.com)

 

总结


打卡第三天,坚持!!!

SCADA|RESTful学习,Apipost通过GET获取KingSCADA实时数据 本文介绍了如何使用RESTful实现SCADA与MES系统对接。主要包括:1)对比RESTful与其他协议的性能指标;2)KingSCADA作为Server/Client的三种应用场景;3)详细演示KingSCADA3.8作为Server端的配置过程,包括端口设置和API测试。通过Apipost工具测试获取变量值及数据回写接口,其中数据回写需使用MD5加密密码。文章最后指出回写测试失败的情况,但未分析具体原因。全文以实际工程应用为导向,提供了具体操作步骤和技术细节。 阅读详情

相关推荐

网课、网页视频倍速播放简单脚本

一个简单的网页视频倍速脚本

huazn612的博客 1万+

代码随想录day19&day20打卡

最大深度已经学习过了,实质就是递归的去判断左右子节点的深度,然后对其进行返回。附加两个学习的部分:(1)使用前序遍历的方法求解(2)迭代法,使用层序遍历即只需要记录遍历的层数即可最小深度题目:在递归法当中,要注意左子树不存在或者是右子树不存在的问题,其余的按照最大深度的模版套用即可。迭代法只需增加一个条件,就是到这个节点时,左右子都为空,那么可以返回这个深度。

是阿杰啊 1092

OpenLayers源码解析1 Map.js

Map.js 父类:./PluggableMap/PluggableMap 引用:5个模块 ./renderer/Composite.js ./PluggableMap.js ./obj.js ./control.js(控件) ./interaction.js(交互) 主要功能:核心组件,渲染地图 必要参数: view layers target controls和interactions要是未指定,使用默认值 方法:createRenderer()? /** * @module ol/Map */ i

qq_45005996的博客 1898

算法速成之代码随想录

有些同学想要学习算法题,但是时间很紧,自己的基础也不是很好,想要在空余时间完全掌握所有算法题确实有点不切实际了,终于去学习了遇到难题又半途而废,于是我总结了一下刷代码随想录题目的方法先看b站视频:BV1fA4y1o715,有规划的看,每一类题可以看一到两道,看完去做题,感觉基本了解了就可以直接看代码随录博客的题目跟着做,因为看视频较为费时间,博客中的注释非常详细;写题时候,,实在无从下手就他的,看完应该都能自己写了,如果连思路都看不懂,那么就求助gpt或者去看他的视频;每周写题也要有一定的规划,

qq_63728673的博客 7032

四大AI编程工具深度对比:Claude Code、Codex、OpenCode与WorkBuddy选型指南

AI编程助手正从代码补全走向自主执行的智能体形态,其核心原理是通过“规划-执行-观察”循环让模型自主完成文件修改、命令运行与错误修复。这类工具的技术价值在于提升长任务连续性与上下文理解能力,同时通过自定义指令与技能机制沉淀团队规范,适应不同工程场景。在实际选型中,开发者常面临终端CLI与图形化工作台、模型开放程度与绑定生态之间的权衡:Claude Code强调深度Agent体验,Codex支持灵活接入OpenAI兼容模型,OpenCode以开源多模型见长,WorkBuddy则提供全流程集成环境。本文基于真实

weixin_42526166的博客 135

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用 来源:https://buuoj.cn/ 内容: 附件:https://pan.baidu.com/s/1FKkXN6JDI0QkGw-UE2crNA?pwd=grb0 提取码:grb0 答案:Y0u_hav3_r3v3rs3_1t! 总体思路 发现是虚机模拟 形成每个指令的逆向 找到加密值位置(有可能不止一个位置,该题就给了一个误导的) 找到命令执行的流程(也是不止一个) 逆向编写反向加密得到f

serfend's blog 977

代码随想录完整一刷总结——我的算法入门总结

上学的时候学过c语言课程,工作以后干过一年的C语言白盒测试,最近为了找工作自学了python(题外话code with mosh的课真心优秀),这就是之前我跟代码的所有关系了。当知道新的工作机会需要机考算法时,有点懵了,硬着头皮打开传说中的力扣,经典第一题“两数之和”看完题目后,只想问一句我是谁我在哪。。。。最终小破站搜索解决方案的时候找到了代码随想录的视频,真心适合我这种算法小白,视频思路讲解细致,网站上还有文本也方便自己过后对照整理思路和逻辑,义无反顾的上船了训练营。

yongfoot的博客 9553

从PCIe 3.0到6.0:为什么“阻抗一致性”比“绝对值”更重要?聊聊连接器与板材的选型影响

本文探讨了PCIe从3.0到6.0演进过程中,阻抗一致性相比绝对值的重要性,分析了连接器与板材选型对高速信号完整性的影响。随着速率提升至64GT/s,系统级阻抗控制和验证成为关键,文章提供了选型指南、验证方法论及工程实践建议,帮助工程师应对高速设计挑战。

weixin_42556197的博客 384

【算法】代码随想录之哈希表

跟随代码随想录,学习哈希表相关的算法题目,记录学习过程中的tips。

致力于Linux的博客 607

基于毫米波生物感知雷达+STM32设计的独居老人居家监护系统(微信小程序)(192)

当前基于STM32设计的独居老人居家监护系统为独居老人提供一种简便、实时的健康监护服务。该系统通过集成多种传感器和功能模块,能够实时监测老人的生理指标、姿态以及室内环境状况,并通过微信小程序远程显示数据,当出现异常情况时及时发出报警提醒。

1万+

使用virtuoso gds转lef操作方法

2) 然后,需要创建Pin,这里Pin的概念不同于label/text,是有实际金属的,二者的区别类似于pr中的port和terminal。1) 首先,需要画prBoundary,这个用drawing层的prBoundary画是不行的,不过建议pr阶段就把prBoundary转到gds里,在virtuoso layout中画prBoundary就比较容易。另外,用Create - Create Pin也可以创建pin,更适用于PG pin,操作时先给pg shape打label,最好放正中间。

m0_61544122的博客 1380

【代码随想录】回溯算法

77和216是一类题,39和40是一类题,这两类题虽然都是组合问题,但解决思路稍有区别,没必要太过比较。和回溯法模板不同,本题将去重和终止条件都放在了for循环里面,而不是回溯函数刚开始的时候。——为什么?

Melody_Mar的博客 1564

SwinTransformer改进(5):与CBAM结合的视觉模型

这个模型的核心思想是将Swin Transformer的强大特征提取能力与CBAM的注意力机制相结合,以提升模型对重要特征的关注度。​​CBAM模块​​:包含通道注意力和空间注意力两个子模块​​Swin Transformer主干网络​​:作为基础特征提取器​​集成结构​​:在Swin Transformer的不同阶段插入CBAM模块使用移动窗口(Moving Window)机制减少计算量层次化设计,特征图逐渐缩小,通道数逐渐增加在不同阶段使用Patch Merging进行下采样。

2401_82355416的博客 688

代码随想录算法训练营:2/60

包含LC的几道题目,还有相应概念的补充。

Dustin_c的博客 1434

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

代码随想录算法训练营:5/60

包含LC的四道题目,还有相应概念的补充。代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF打卡第5天,坚持!!!

Dustin_c的博客 1321

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

代码随想录算法训练营:1/60

包含LeetCode704: 二分查找和LeetCode27: 移除元素,还有相应概念的补充。

Dustin_c的博客 1464

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

代码随想录算法训练营第60期第四天打卡

大家好,今天刚刚参加完蓝桥杯,感觉自己要完蛋了,没几道会的题目,或许是自己的实力还不够强,或许是题目难,无论结果如何我还是继续努力把训练营布置的任务认真完成,在开始今天的题目之前我先要告诉大家一个道理,就是失败不可怕,拿不到奖更不可怕,重要的是你的精气神绝对不能丢,一定要坚持下去,那在短暂的平复心请之后,我们要开始今天的题目了,估计今天的题目对我会比较有难度,因为以前我没刷过,今天是第一次刷,那就来吧。 首先我们先来回顾一下,链表与数组是有很大的区别的,包括增删改都很不一样,同样今天的两两交换链

2401_83782806的博客 740

代码随想录-算法训练营day60(单调栈03:柱状图中最大的矩形)

单调栈03:数组中的最大矩形

weixin_61931006的博客 675

代码随想录算法训练营:15/60

包含LC的几道题目,还有相应概念的补充。

Dustin_c的博客 1568

代码随想录算法训练营第60期第七天打卡

今天来到了哈希表比较难的地方,因为似乎只用哈希表解决不了问题了,还得使用双指针,所以今天有道题目叫做三数之和被称为是很多人梦破碎的地方,究竟为啥这样说呢?其实刷完之后就会了解,三数之和的确很难,因为它是一个综合题,我们一起进入今天的题目。 首先,我们可以来看一下这一道题的思路,其实我感觉这道题其实相比于三数之和要简单,这个题还是可以通过哈希方法解决,那思路如何呢?其实我们可以先找两个数,然后再去哈希表中去寻找剩下的两个数,我说的可能比较笼统,大家看到题目的具体内容就可以明白,我们来看一下具体的题

2401_83782806的博客 1136

代码随想录算法训练营:17/60

包含LC的几道题目,还有相应概念的补充。

Dustin_c的博客 1300

代码随想录算法训练营:6/60

包含LC的四道题目,还有相应概念的补充。

Dustin_c的博客 1080

代码随想录算法训练营第二十九天

练习了动态规划和滑动窗口。

岁岁安的博客 2326

代码随想录算法训练营:4/60

包含LC的四道题目,还有相应概念的补充。

Dustin_c的博客 1076

代码随想录算法训练营:19/60

包含LC的几道题目,还有相应概念的补充。

Dustin_c的博客 795

代码随想录算法训练营第60期第十五天打卡

哈哈,怎么说呢?今天的题目说难也不算难,说简单但也绝对不简单,我想告诉大家的是,无论难还是简单,大家都务必坚持下去,以后或许越来越难,其实今天已经涉及到回溯,在后面会有一个专门的章节来讲回溯算法,在后面的图论里面也会有涉及,大家务必打好基础,其实一刷代码随想录你要看到一个题目要有自己的想法,先不着急上手写代码,这个其实一刷写不出来代码我感觉很正常,多学多刷,代码随想录一遍肯定不够我感觉要三遍以上才能真正理解这些算法,大家加油,我们明天还是二叉树章节。明天见!

2401_83782806的博客 743
上一篇: 代码随想录算法训练营:2/60
下一篇: 代码随想录算法训练营:4/60
Dustin_c
博客等级 码龄3年 391粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值