聊聊数据结构中的树,建议收藏

数据结构绪论都还没学明白?第一章喂你嘴里!(建议收藏!) 与你相识 博主介绍: – <远马神工>不是一个人的名字,它是一个团队,目前纵深学习Go语言,其它语言也有所涉猎,“远马”有“源码”的谐音,甚至和“猿”也沾点关系,我们希望能通过这个平台认识其它人,和其它人一起讨论我们所热爱的东西,在这个账号上会转发团队中投稿过来的技术文章,也欢迎您和我们交流。 引言 介绍了第一章的内容,绪论主要是解释一个问题——这一学期的数据结构在学什么? 本篇文章转发自团队成员飞飞的csdn:文章链接 目录(了解)学数据结构在学什么?(熟悉)各术语的含义... 阅读详情

【这是一猿小讲的第 81 篇原创分享】

数据结构是 10 年前大学里学的一门课程,也是我北漂唯一携带的一本书。幸运的是,书还没有被孩子给撕碎。

为了让大家都能够搞懂「树」这个苦涩而硬核的知识,今天就重拾记忆,分享一下研发人员心中那些放不下的「树」。

不过,一定要冲好咖啡、沏壶好茶,心平气和去看文。

01. 「树」现实与虚拟的抽象


在「中华姓氏树」中寻找一片属于你的叶子,探寻一下家族的来源。

在脑海里尝试画一下「家谱树」。

看完现实中的树,那来看一看计算机的文件系统组织形式。

无论是现实的姓氏树、家谱树,还是计算机的文件系统,表现形式虽然不同,但是本质上却都是树。

那到底什么是树呢?

树是由 n(n≥0)个结点组成的有限集合。

当 n = 0 时,称为空树;

当 n > 0 时,有一个特殊的节点称为根结点(root),它没有前驱结点;其它结点分为 m 棵互不相交的子树。

如图示意,(a)为空树;(b)为 1 个结点的树;(c)为 n 个结点的树。

知道了什么是树,上面「家谱树」以及「文件系统」用到的树表示法,有没有学名呢?稍微科普一下。

图示法:是树的直观表示法,主要用于描述树的逻辑结构,如上面提到的家谱树。

横向凹入表示法:是用逐层缩进方法表示结点之间的层次关系,主要用于树的屏幕显示和打印输出,如上面提到的文件系统。

知道了什么树以及树的部分表示法,但是猿有猿声,鸟有鸟语,树也有术语。

02.「树」有术语


节点 or 结点,别再傻傻分不清?

节点:线上一个节点扛不住压力,那就索性再加一个节点。所以节点一般被认为是一个有处理能力的实体,例如一台服务器;

结点:包含一个数据元素及若干指向其子树的分支,在树的图形表示中为一个圆圈,算法中的点一般指的都是结点。

有些老铁习惯用「节点」,有些喜欢用「结点」,到底用哪个?

之前也没太注意这个细节,本次分享就采用「结点」二字。

话又说回来,只要掌握了本领,打败敌人,到底用的是亢龙有悔还是飞龙在天,其实已经没啥意义啦。

父结点、孩子结点与兄弟结点?

父结点:若一个结点含有孩子结点,则这个结点称为其孩子结点的父结点;如上图所示,B、C、D 的父结点都是 A;

孩子结点:一个结点含有的子树的根结点称为该结点的孩子结点;定义还是比较拗口,还是直接看图吧,B 的孩子结点为 E、F;

兄弟节点:具有相同父结点的结点互称为兄弟结点;如上图所示,B、C、D 具有相同的父结点 A,所以 B、C、D 为兄弟结点;

什么是度?

结点的度:一个结点拥有子树的个数称为该结点的度;如上图所示,A 结点拥有 B、C、D 三棵子树,所以 A 结点的度为 3;

树的度:一棵树中,最大的结点度称为树的度;如上图所示,最大的结点度为 3,所以树的度为 3;

结点层次、树的深度或高度?

结点层次:从根开始算起,根为第 1 层,根的子节点为第 2 层,以此类推;如上图所示,E 结点层次为第 3 层;

树的深度或高度:树中结点的最大层次数;如上图所示,由于结点最大层次树为 3,所以树的深度或高度为 3;

啥是森林?

森林:由 m(m>=0)棵互不相交的树的集合称为森林。给森林加上一个根结点就变成一棵树,将树的根结点删除就变成森林。

如图所示,把根结点 A 剔除,就会变成以 B、C、D 为根的 3 棵互不相关的树组成的森林。

了解完树的术语,万里长征才算刚迈第一步,接下来就一起看看树的分类。

03. 二叉「树」


啥是二叉树?

二叉树(binary tree)是 n(n≥0)个结点组成的有限集合。

n = 0 时称为空二叉树;

n > 0 的二叉树由一个根结点和两棵互不相交的、分别称为左子树和右子树的子二叉树构成。

另外,二叉树的子树有左、右之分,所以只有一个子树也要区分是左子树还是右子树。

如上图所示,二叉树主要有以下五种形态:

(a)空二叉树;

(b)只有一个根结点的二叉树;

(c)由根结点、非空的左子树和空的右子树组成的二叉树;

(d)由根结点、空的左子树和非空的右子树组成的二叉树;

(e)由根结点、非空的左子树和非空的右子树组成的二叉树。

满二叉树与完全二叉树?

当二叉树的每一层的结点数目都达到最大值,则称为满二叉树。若对满二叉树的结点进行连续编号,约定根结点的序号为 0,从根结点开始,自上而下,每层自左至右编号,如上图(a)所示。

完全二叉树相对满二叉树而言,节点数是任意的,从形式上去看,最后那一行可能是不完整的,可能右下角某个连续的部分缺失,如上图(b)所示。

另外,满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树,区别就在最后一层上。

04. 二叉排序「树」


啥是二叉排序树(Binary sort tree)?

二叉排序树可以是一棵空树,或者是具有如下性质的二叉树:

1. 每个结点都有一个作为查找依据的关键字,而且所有结点的关键字互不相同;

2. 结点,左子树元素均小于该结点,右子树元素均大于该结点;

3. 左、右子树也是二叉排序树。

二叉排序树怎么查找?

如果要在一棵二叉排序中,查找值为 value 的结点,算法描述如下:

第一步:从根结点开始,设 p 指向根结点;

第二步:若 key == p.data,则查找成功返回;若 key < p.data,则查找 p 的左子树;否则查找 p 的右子树;

第三步:重复执行第二步,直到 p 为空,查找不成功。

假如要查找 40,那么查找路径是(54,18,36),经过叶子结点 36,查找不成功。

假如要查找 57,那么查找路径是(54,81,76,57),到达结点 57,查找成功。

聪明的小伙伴应该已经看出,在二叉排序树中,一次查找经过从根结点到某结点的一条路径,而不需要遍历整棵树,若查找成功则到达指定结点,否则经过某个叶子结点。

由于二叉排序树能够提供快速查找功能,所以二叉排序树又称为二叉查找树(Binary search tree)。

在图(a)中查找结点 1,那么查找路径为(4,2,1),但是在图(b)中的查找路径为(4,3,2,1)。

二叉排序树的查找效率与二叉树的高度有关,高度越低,查找效率越高。因此,提高二叉排序树查找效率的办法是尽量降低二叉排序树的高度,于是就有了平衡二叉树。

05. 平衡二叉「树」


啥是平衡二叉树?

平衡二叉树由两位前苏联数学家 G.M.Adel'sen-Velskii 和 E.M.Landis 于 1962 年提出,因此又被称为 AVL 树。

平衡二叉树的主要的特点:它的左子树与右子树的高度之差绝对值不超过 1;它的左子树和右子树都是平衡二叉树。

另外,结点的平衡因子 = 左子树的高度 – 右子树的高度,在平衡二叉树中任何一个结点的平衡因子只能是 -1、0 或 1。下图中每个结点旁边标出的数字是该节点的平衡因子。

如图(a)所示的二叉排序树不平衡,因为结点 81、76 的平衡因子都是 2。

如图(b)所示的二叉树是平衡二叉树,因为每个结点的平衡因子绝对值都不超过 1。

但是,聪明的你们,肯定也会想到,在面对新结点加入时,可能会使平衡二叉树不平衡,那么就需要通过旋转来达到平衡。但是,无论怎么旋转,都无外乎 LL、RR、LR 和 RL 四种情形,下面一起来旋转一下,千万别转晕喽(旋转不明白也没关系,直接往下跳着看)。

LL 型调整(左子树的左边结点)

RR 型调整(右子树的右边结点)

LR 型调整(左子树的右边结点)

RL 型调整(右子树的左边结点)

另外,若真有感兴趣的小伙伴,可以打开下面的链接去旋转,有动画的旋转。

https://www.cs.usfca.edu/~galles/visualization/AVLtree.html

虽然平衡二叉树比排序二叉树多了一个自平衡功能,可以使二叉树的高度降低,提升查询效率。

不过这个存储结构在面对大数据量存储的时候,只能分两叉,那么二叉树的高度势必会越来越高,查询效率会越来越低,地基决定了高层建筑,那该怎么办?

只见 B-Tree 已经向我们招手,不过还是先看看二叉树的存储吧。

06. 二叉树的存储结构?


面对二叉树的存储,首先能想到的,便是将一棵完全二叉树的所有结点,按结点序号进行顺序存储的结构。

如图所示,逐个对完全二叉树的结点按照从上到下,从左到右的顺序进行编号,然后进行顺序存储后的结构图。

那么,对于一般的非完全二叉树,就需要通过补充空子树的方法,先将一棵二叉树变成完全二叉树,然后再进行顺序存储。

聪明的你,肯定会想到「补充空子树,存储空间会浪费很多,不太可行」,那该怎么办呢?

于是就改变设计,采用两条链分别连接左、右孩子,每个结点有三个域:data 存储数据元素,left、right 分别指向左、右孩子结点,结构如下。

下图(a)示意了一棵 8 个结点的二叉树,对应的二叉链表存储结构,如下图(b)所示,其中 root 指向二叉链表的根结点。

但是,聪明的你肯定又会发现「采用二叉链表存储二叉树,只保存了结点到孩子结点的单向关系,而没有存储结点到父结点的关系,所以要想获得父结点,需要从根结点开始在二叉树中进行查找,那么花费的时间会较多」,那该怎么办呢?

于是,在二叉链表的基础之上,三叉链表增加一条链 parent 连接父母结点,如上图示意,这样就存储了父母结点与孩子结点的双向关系。

结论:二叉树的存储结构可以分为顺序存储和链式存储(二叉链表、三叉链表),另外二叉树通常采用链式存储结构。

07. B-Tree


B-Tree 又是啥树?

B-Tree 是多路搜索树,并不是二叉的树,是一种常见的数据结构。使用 B-Tree 结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度 —— 来自百度百科。

B-Tree 使用的场景?

1. B-Tree 索引是数据库中存取和查找记录的一种方法;

2. B-Tree 利用多个分支(称为子树)的结点,减少获取记录时所经历的结点数,从而达到节省存取时间的目的。

B-Tree 每层都存放大量的数据,这样树的高度会低,而且能够快速定位数据所在的位置,假如查找「一猿小讲」那么查询路径如下。

但是这样也存在,地基决定高层建筑的问题。由于数据存放在每层,那么范围查询虽然能支持,遍历树比较而已,但是查询起来应该相当繁琐;而且数据量较大时,也会增大查询时的磁盘 I/O 次数,进而也会影响查询效率。那该怎么办?

你看远方,B+Tree 已在向我们招手!

08. B+Tree


B+Tree 是在 B-Tree 基础上的一种改进,像 MySQL、SQLite 等数据库都使用了 B+Tree 算法来处理索引。原来重量级的「树」在这儿候着呢。

我们把同样的数据用 B+Tree 结构存一下,看看与 B-Tree 有什么不同?

蓦然发现,在 B+Tree 中与 B-Tree 明显的不同的是:所有数据都会存放在同一层的叶子节点上;并且叶子节点这层还有指向后面的指针。

这么一来,B+Tree 就能很好地进行范围查询,定位数据后,直接就可以用叶子节点那层的指针遍历了;另外也可以从根结点开始,随机查询啦。

09. 心中有「树」

平时业务研发中,很少去纠结「树」,而且这玩意看过也会忘,不过要知道「面试造火箭,入职拧螺丝」,所以建议还是多下点功夫。

当时数据结构这门课拿了快满分,那都是 10 年前的事啦。不过今天重拾一下,感觉记忆又回来啦。

最后,懂与不懂,建议都转发收藏,因为随着时间的推移,年龄的增长,我们不懂的东西会越来越少。


推荐阅读:

研发人员一定要心中有“树”

数据库核心:索引,你知道多少?

Superpowers:可编程AI协作协议与Skill工程化实践 AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P 阅读详情

相关推荐

Ubuntu 20.04下IgH EtherCAT主站部署实战

本文详细介绍了在Ubuntu 20.04系统上部署IgH EtherCAT主站的完整流程,包括环境准备、源码编译、内核模块配置、网络接口设置及实时性优化等关键步骤。通过实战案例和常见问题排查,帮助开发者快速掌握EtherCAT主站部署技巧,提升工业自动化系统的稳定性和实时性。

weixin_30596343的博客 1071

码农的逆袭

【这是一猿小讲的第 24篇原创分享】01妈咪说:要肯吃苦,才能吃上鱼和肉。小猿从小都讨大人喜欢,特别爱听他妈妈的话。于是他冒严寒顶酷暑的开始发愤图强,从小他就相信:吃得...

一猿小讲 342

ICCompiler II学习笔记(一)ICC II使用全流程 overview

学习笔记同步发布在我的个人网站上,欢迎来访查看。 个人学识有限,理解可能有误,仅供参考。 文章目录一、前言二、 ICC II 简介和 GUI2.1 Blocks 和 Design Libraries2.2 Objects2.3 Application Options三、Design Setup四、APR flow五、 课程主题:如何用 ICC II来实现最好的PPA 一、前言 现在的芯片都在追求一个极致的PPA 芯片的生成可以分为以下 5大步骤: Front-end Design:前端设计,最终产生

一名FPGA芯片设计爱好者的技术博客 2万+

7 判断给定的二叉树是否是二叉排序树---来源刘H同学

在二叉树的二叉链表存储形式建立的基础上,使用递归的程序设计方法,设计并完成判断一棵给定的二叉树是否是二叉排序树的算法。//重写遍历的visit函数,将遍历结果依次存放在顺序表A中(为避免连锁改动,将函数名由visit改为visit1)(4)递归遍历,左孩子的key比根节点的key小,右孩子的key比根节点的key大,一旦有不满足条件的就判定不是。(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;//判断是否是二叉排序树。

Ultravioletrays的博客 1953

GCJ02坐标系转WGS84坐标系(已实地测试基本无偏差)

坐标系转化,GCJ02坐标系,WGS84坐标系

Xiao_XianYu_的博客 1856

TM1621/HT1621 段码LCD驱动器

TM1621 LCD 驱动器

qq_45325304的博客 1万+

二叉排序树的判别

Description试编写程序,判别给定的二叉树是否为二叉排序树。设此二叉树以二叉链表作存储结构,且树中结点的关键字均不同。Input按先序输入二叉树各结点(结点值大于0),其中-1表示取消建立子树结点。Output若该二叉树为二叉排序树,则输出yes;否则,输出no。Sample Input 12 8 4 -1 -1 10 -1 -1 16 13 -1 -1 18 -1 -1Sample Ou...

w.here的优快云 1155

从零搭建 AI 运维 Agent:告警自动诊断 + 修复的完整技术方案

适合读者:管理 5-50 台服务器的运维/SRE 工程师、技术负责人 技术栈:FastAPI + React + PostgreSQL + Redis + DeepSeek 关键词:AI运维、AIOps、自动化运维、智能告警、告警修复、Runbook自动化、DevOps、SRE、DeepSeek运维

weixin_38359457的博客 1640

判断一颗二叉树是否是二叉排序树

1. 问题描述: 设计一个算法,判断给出的二叉树是否是二叉排序树,假设二叉排序树已经存储在二叉链表的存储结构中,树节点的个数为n,节点值为int类型 2. 思路如下: ① 判断一颗二叉树是否是二叉排序树的方法有好几种,其中最简单的方法是对给定的二叉树进行中序遍历,假如二叉树是二叉排序树那么中序遍历的结果一定是递增的,假如不是那么就不是二叉排序树 ② 基于上面的想法我们可以使用中序遍历的方法...

二哈 2万+

Pyhon在振动信号处理中的高级应用(一):振动信号特征(时域、频域)提取

文章目录一、概述二、算法原理2.1 时域统计特征三、python代码实现 一、概述 二、算法原理   这里我们借鉴西安交通大学机械学院雷教授的论文《Fault diagnosis of rotating machinery based on multiple ANFIS combination with GAs》相关研究成果。雷教授在论文中共列举了4类共24种振动信号的时域和频域特征。 2.1 时域统计特征 p1=∑n=1Nx(n)NP2=∑n=1N(x(n)−p1)2N−1p3=(∑n=1N∣x(n)∣N

白银时代的博客 1万+

matlab计算图像信噪比SNR

【代码】matlab计算图像信噪比SNR。

baidu_34971492的博客 1396

判断二叉树是否是二叉排序数的方法

方法一:先遍历根,在遍历所有的左子树,最后在遍历所有的右子树(不是前序遍历)返回0则不是二叉排序数int IsBST(BitTree T)   //返回1表示为二叉排序树,返回0表示不是 {    int flag1=0,flag2=0;    if(T-&gt;lchild!=NULL)    {        flag1=1;            if(T-&gt;lchild-&gt;da...

B_G_boy的博客 5556

基于卷积神经网络的遥感图像地物分类

AI:89-基于卷积神经网络的遥感图像地物分类 基于卷积神经网络的遥感图像地物分类是一个令人兴奋的领域,它在环境监测、城市规划、农业、国防等领域具有广泛的应用。深度学习技术为我们提供了更准确、高效的工具,有望在未来进一步提高分类性能。在本文中,我们探讨了卷积神经网络的工作原理、数据准备、模型构建、训练和评估过程,并提供了多个代码示例。此外,我们讨论了地物分类的应用和挑战,以及未来的发展趋势。

一键难忘的博客 2717

Java集合核心内容之数组和链表,大厂越来越注重基础了,建议收藏

  现在出去找工作,如果你不能很好的和面试官去聊聊Java基础里面的算法和用到的数据结构,基本是没戏的,所以本篇开始我们会给大家详细的聊聊Java集合中的相关实现涉及到的数据结构和算法实现,本文先来介绍下最最简单的数据结构,数组和链表。 一、数组   数组是我们使用到的最简单的一个数据结构,数组的使用 // 动态初始化:初始化时由程序员只指定数组长度,由系统为数组元素分配初始值 char c1[] = new char[5]; // 静态初始化: 初始化时由程序员显示置顶每个数组的初始值,由系统决定数组

波波烤鸭的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

全网最全性能优化总结!!(冰河吐血整理,建议收藏)

性能优化一般包含:数据聚合优化、资源冲突优化、算法优化、JVM优化、复用优化、计算优化和快速优化,冰河吐血整理,建议大家收藏!!

冰河的专栏 1万+

深度学习工具包 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'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('DeepLearnToolbox'));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('state',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'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',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 = 'sigm';%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, 'Too big error');```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('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';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)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';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, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 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'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 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, 'Too big error');```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('state',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, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',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, 'Too big error');%% ex3 neural net with dropoutrand('state',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, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % 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, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % 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, 'Too big error');%% 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('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % 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, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数据结构与算法--再来聊聊数组

再来聊聊数组 这篇我们来总结一下数组相关的一些算法,数组的特点在于我们能通过下标得到对应数据,时间复杂度在O(1),之前有多篇文章有数组相关的体系,一下来一个归纳: 数据结构与算法–有序数组中找出和为s的两个数字 数据结构与算法–数组中出一次的数字 数据结构与算法–数字在排序数组中出现次数 数据结构与算法–数组中的逆序对 数据结构与算法–将数组排成最小的数 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论) 数据结构与算法–数组:二维数组中查找 数据结构与算法–字符串的排列组合问题 数

0102的博客 241

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

7102-2019年技术文全套整理 | 建议收藏

很多小伙伴在后台留言要找某某文章,所以这个周末花了2个多小时整理了下公众号自开启以来的大部分推文,有需要的同学可以先操作(点赞、转发、收藏)一波。Kafka系列为了追求极...

朱小厮的博客 1666

mysql联合索引 面试_MySQL大厂面试:10分钟掌握MySQL索引面试方方面面(建议收藏)...

导读:大家肯定都知道,索引是MySQL高效查询数据的一种数据结构。而且面试也常问,因为在MySQL中占比比较重,我相信很多人对它了解也都很透彻,真的透彻吗?这篇写给最近在找工作的朋友们。MySQL在面试中的方方面面(中级水平)面试题只解答三道题,其余的大家看看会几道,不会的在评论区留言,为你解答。前几天笔者发布了几篇关于索引的一些文章,如果感兴趣可以去学习一下:下面是笔者总结出来的中级MySQL索...

weixin_29009881的博客 711

【转】超强、超详细Redis入门教程 ,建议收藏

转载自: 这篇文章主要介绍了超强、超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 【本教程目录】 1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数据结构 – strings 9.redis数据结构 – lists 10.redis数据结构 – 集合 11.redis数据结构 – 有序集合 12.redis数

houhj168的专栏 374

去面试字节前端,竟然考算法,是不是有病?算法如何刷题?全文高能!倾心整理【建议收藏!】

为什么字节跳动的前端面试需要那么难的算法题? - 知乎 昨天有个985的美女粉丝说,去面试字节的前端,竟然要考算法,搞的自己很懵逼! 插图1 面试前端,竟然要考算法!是不是脑子瓦特(water)了! 在小孟看来,这真的狠正常! 大家都知道,现在的IT行业非常的卷,都卷成啥样了,本来科班的人就很多进入了计算机行业,还有其他的专业不断的往IT行业涌入,例如生化环材一些天坑专业。 所以现在的计算机培训机构才异常的火爆!很多机构几个月竟然能把一个非科班专业的学生包装成一两年经验的开发者。 但是很多包装

程序员springmeng 8988

大佬的Java后端开发书架,建议收藏!

很多小伙伴也说让推荐一些对应的书籍瞧瞧。 推荐是没问题,但是有些话还是想聊聊看。 首先毫无疑问的是,对于「编程基础」部分,有大量经典的书籍值得阅读,每一本都是大师们若干年经验的汇聚,所以学好编程基础,对于我们普通人来说,看书是一个直接有效的方式。 很多经典书看一遍可能远远不够,正所谓「初看懵、再看迷、三看发现有点小意思」讲的就是这个道理,这事急不得,而且有些东西的确需要一个反反复复的过程,有些甚至是在工作后的实践中才会遇到,所以珍惜每一次回炉重造的过程吧。 而对于「应用框架」部分,实不相...

oldpeople_的博客 280

去面试字节前端,竟然考算法,是不是有病?算法如何刷题?全文高能!倾心整理【建议收藏

面试前端,竟然要考算法!是不是脑子瓦特(water)了!在小孟看来,这真的狠正常!大家都知道,现在的IT行业非常的卷,都卷成啥样了,本来科班的人就很多进入了计算机行业,还有其他的专业不断的往IT行业涌入,例如生化环材一些天坑专业。所以现在的计算机培训机构才异常的火爆!很多机构几个月竟然能把一个非科班专业的学生包装成一两年经验的开发者。但是很多包装的学生,面试是比较猛,但是入职了无法干活。这让公司很难受!现在不只是大厂要考算法,很多种小公司都开始跟风了!所以,不管你是去大厂还是小厂,算法必须要刷。

2401_84296945的博客 960

系统性能优化的十大策略(强烈推荐,建议收藏)

点击关注公众号,实用技术文章及时了解上篇提升系统性能,榨干计算机资源是程序员的极致追求,今天跟大家聊聊性能优化。分为上中下三篇,由浅及深的写了关于性能优化的方方面面,并不仅仅局限于代码层面,希望小伙伴们能有所收获。引言:取与舍软件设计开发某种意义上是“取”与“舍”的艺术。关于性能方面,就像建筑设计成抗震9度需要额外的成本一样,高性能软件系统也意味着更高的实现成本,有时候与其他质量属性甚至会冲突,比...

Java知音 4883

通过五轮面试斩获offer阿里实习生亲述,建议收藏

前言 前两天,我收到了蚂蚁金服的offer,从朋友的内推开始面试到拿到最后offer经历了4面技术、一面交叉面和一面HR面。经过了漫长的等待和几次几乎折磨的面试之后,终于拿到了offer。 咱先来聊聊Redis 像Redis的基础入门,掌握下图这几个列出来的知识点足以了。 进阶的话,就得下点功夫了,事务、主从复制、哨兵、集群等等之类的搞不明白你就上不去呀。 再看美团亿级流量Redis实战,Redis分布式锁、session、缓存与数据库一致性问题、缓存雪崩等之类的都是重中之重的技术点,必须掌握,没得商

m0_57285455的博客 317

数据结构优化实战:提升国风模型提示词处理与缓存效率

本文介绍了在星图GPU平台上自动化部署LiuJuan20260223Zimage国风美学生成模型v1.0镜像,并探讨了如何通过数据结构优化提升其应用性能。文章重点分享了如何利用Trie树、LRU缓存等经典数据结构,优化模型提示词补全与图片生成缓存,从而显著提升国风AI图片生成服务的响应速度与用户体验。

weixin_35509395的博客 135

去面试字节前端,竟然考算法,是不是有病?算法如何刷题?全文高能!倾心整理【建议收藏!

1,《**算法图解》:**这是一本“像小说一样有趣的算法入门书”,看这本书能让你非常舒适的了解到基本的计算机算法,轻松愉快把基础知识学完了,但是注意,了解基础算法远远不够哦。大家都知道,现在的IT行业非常的卷,都卷成啥样了,本来科班的人就很多进入了计算机行业,还有其他的专业不断的往IT行业涌入,例如生化环材一些天坑专业。所以,不管你是去大厂还是小厂,算法必须要刷!3,**《编程之美》**这本书罗列的算法相较而言比第一本书要难一些,但是更系统,如果你想面试国外的互联网技术岗位,那么这本书非常适合你。

2401_89790580的博客 824
上一篇: 别人家的 InfluxDB 实战 + 源码剖析
下一篇: 在监控落地的路上,助你一臂之力
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值