阿里大佬的算法学习笔记:树状数组

数据结构之树状数组 ——详解 树状数组是一种维护前缀和、区间和的数据结构。它在原数组上添加索引,从而高效维护数据。神奇而小巧的数据结构,树状数组的下标必须从1开始!无论是他的修改还是查询,时间复杂度永远都是 logn,适合用于做区间和,前缀和,单点修改比前缀和标准做法的修改快一些。 阅读详情

树状数组(Binary Index Tree, BIT)也是很多OIer心中最简洁优美的数据结构之一。最简单的树状数组支持两种操作,时间复杂度均为

  • 单点修改:更改数组中一个元素的值
  • 区间查询:查询一个区间内所有元素的和

当然,树状数组能维护的不局限于加法,支持的操作也不止这两种,甚至有大佬能用树状数组实现平衡树,但这篇笔记不会深入讨论(因为我也还不是很懂hh)。

我们还是先来看一道模板题,来看看树状数组最基本的应用场景:

(HDU P1166)敌兵布阵

Problem Description
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.Input
第一行一个整数T,表示有T组数据。每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;(4)End 表示结束,这条命令在每组数据最后出现;每组数据最多有40000条命令Output
对第i组数据,首先输出“Case i:”和回车,对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。

这个数据范围,直接模拟肯定会T,所以我们要使用数据结构来维护数组,树状数组可以说是其中最简洁的一种。我们来看看树状数组是怎么实现的。


树状数组的引入

回顾一下,我们说,我们要实现两种操作:单点修改和区间求和。对于普通数组而言,单点修改的时间复杂度是,但区间求和的时间复杂度是

普通数组

当然,我们也可以用前缀和的方法维护这个数组,这样的话区间求和的时间复杂度就降到了,但是单点修改会影响后面所有的元素,时间复杂度是。

程序最后跑多长时间,是由最慢的一环决定的,因此现在我们希望找到这样一种折中的方法:无论单点修改还是区间查询,它都能不那么慢地完成。

注意到对进行区间查询只需查询和然后相减即可(前缀和就是这样进行区间查询的),所以我们可以把区间查询问题转化为求前n项和的问题。

关于数组的维护,有个很自然的想法:可以用一个数组维护若干个小区间,单点修改时,只更新包含这一元素的区间;求前n项和时,通过将区间进行组合,得到从1到n的区间,然后对所有用到的区间求和。实际上,设原数组是,如果维护的区间是

,此结构就相当于普通数组(还浪费了一倍内存);如果维护的区间就是,此结构就相当于前缀和。现在我们试图寻找一种结构,一方面,单点修改时需要更新的区间不会太多;另一方面,区间查询时需要用来组合的区间也不会太多。

树状数组就是这样一种结构,它巧妙地利用了二进制(实际上,树状数组的英文名BIT,直译过来就是二进制下标树)。例如11,转化为二进制数就是,如果我们要求前11项和,可以分别查询以及的和再相加。这三个区间怎么来的呢?其实就是不断地去掉二进制数最右边的一个1的过程(如下图)。

我们定义,二进制数最右边的一个1,连带着它之后的0为(稍后再来看如何实现)。那么我们用维护区间,这样显然查询前n项和时需要合并的区间数是少于的。树状数组的结构大概像下面这样:

那么如何更新呢,大家会发现更新就是一个“爬树”的过程。一路往上更新,直到MAXN(树状数组的容量)。

我们举个例子来看看这树是怎么爬的。 现有二进制数,包含它的最小区间当然是。然后,它也肯定位于区间内。然后是,再然后是……

如上图,每一步都把从右边起一系列连续的1变为0,再把这一系列1的前一位0变为1。这看起来像是一个进位的过程对吧?实际上,每一次加的正是。(神奇吧?)这样,我们更新的区间数不会超过。一个能以时间复杂度进行单点修改和区间查询的数据结构就诞生了。


树状数组的实现

前面已经讲得很详细了,代码实现倒是一件简单的事了。不过我们需要先解决一个问题:lowbit怎么算?如果一位一位验证的话,会形成额外的时间开销。然而,我们有这样神奇的一个公式:

为什么可以这样?我们需要知道,计算机里有符号数一般是以补码的形式存储的。-x相当于x按位取反再加1,会把结尾处原来1000...的形式,变成0111...,再变成1000...;而前面每一位都与原来相反。这时我们再把它和x按位与,得到的结果便是lowbit(x)。下面的图中举了两个例子:

现在我们可以愉快地实现树状数组了:

单点修改

int tree[MAXN];
inline void update(int i, int x)
{
    for (int pos = i; pos < MAXN; pos += lowbit(pos))
        tree[pos] += x;
}

求前n项和

inline int query(int n)
{
    int ans = 0;
    for (int pos = n; pos; pos -= lowbit(pos))
        ans += tree[pos];
    return ans;
}

区间查询

inline int query(int a, int b)
{
    return query(b) - query(a - 1);
}

初始化的时候,我们只需要update每个点的初始值即可。

树状数组的应用

还是先来看文章一开始那道题目的AC代码:

#include <cstdio>
#include <cstring>
#define MAXN 50005
#define lowbit(x) ((x) & (-x))
int tree[MAXN];
inline void update(int i, int x)
{
    for (int pos = i; pos < MAXN; pos += lowbit(pos))
        tree[pos] += x;
}
inline int query(int n)
{
    int ans = 0;
    for (int pos = n; pos; pos -= lowbit(pos))
        ans += tree[pos];
    return ans;
}
inline int query(int a, int b)
{
    return query(b) - query(a - 1);
}
int main()
{
    int cases;
    scanf("%d", &cases);
    for (int I = 1; I <= cases; ++I)
    {
        memset(tree, 0, sizeof(tree));
        int n, x, a, b;
        char opr[10];
        printf("Case %d:\n", I);
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i)
        {
            scanf("%d", &x);
            update(i, x);
        }
        while (scanf("%s", opr), opr[0] != 'E')
        {
            switch (opr[0])
            {
            case 'A':
                scanf("%d%d", &a, &b);
                update(a, b);
                break;
            case 'S':
                scanf("%d%d", &a, &b);
                update(a, -b);
                break;
            case 'Q':
                scanf("%d%d", &a, &b);
                printf("%d\n", query(a, b));
            }
        }
    }
    return 0;
}

然而,这只是树状数组最基本的应用。树状数组的应用是非常广泛的,例如,非常常见的一个应用是求逆序对:

(洛谷P1908) 逆序对

题目描述
猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。输入格式
第一行,一个数n,表示序列中有n个数。第二行n个数,表示给定的序列。序列中每个数字不超过10^9输出格式
给定序列中逆序对的数目。

当然逆序对也可以用归并排序的方法求,但树状数组的空间复杂度更低。其实我们与其说在用树状数组求逆序对,不如说是在求非严格顺序对(顺序对和相等对),然后间接算出逆序对的数量。我们是怎么算出非严格顺序对的个数的呢?

例如,我们要求5 4 1 3 2的逆序对。用ans记录非严格顺序对的数量。

我们按顺序去填充树状数组,第一个数字是5,这时没有数比5小,所以ans保持为0。我们把tree[5]填为1。

下一个数字是1,这时也没有数比1小,ans仍为0。我们把tree[1]填为1。

下一个数字是3,这时query(3)为1,有一个数比3小了,ans变为1。然后再填tree[3]。

下一个数字是2,这时query(2)为1,说明前面有一个数比2小,ans再加1变为2。然后填tree[2]。

最后一个数字是4,query(4)为3,说明前面有3个数比4小,ans加3变为5。所以非严格顺序对的总数就是5。那么逆序对共有个。

当然,这道逆序对的题还涉及到离散化等问题,这个以后可能我也会写相关笔记。完整代码如下:

#include <cstdio>
#include <cctype>
#include <algorithm>
#define lowbit(x) ((x) & (-x))
#define MAXN 500010
using namespace std;
typedef long long ll;

ll read()  //快速读入,不是这篇文章的重点
{
    ll ans = 0;
    char c = getchar();
    while (!isdigit(c))
        c = getchar();
    while (isdigit(c))
    {
        ans = ans * 10 + c - '0';
        c = getchar();
    }
    return ans;
}
ll tree[MAXN];
inline void update(ll i, ll x)
{
    for (ll pos = i; pos < MAXN; pos += lowbit(pos))
        tree[pos] += x;
}
inline ll query(int n)
{
    ll ans = 0;
    for (ll pos = n; pos; pos -= lowbit(pos))
        ans += tree[pos];
    return ans;
}
inline ll query(ll x, ll y)
{
    return query(y) - query(x - 1);
}
int A[MAXN]; //离散化后的数组
typedef struct
{
    ll value, id;
} mypair;
mypair B[MAXN]; //原始数组(同时存储id)
bool cmp(mypair x, mypair y)
{
    if (x.value < y.value)
        return true;
    else if (x.value == y.value && x.id < y.id)
        return true;
    return false;
}
int main()
{
    ll n = read(), sum = 0;
    for (int i = 1; i <= n; i++)
    {
        B[i].value = read();
        B[i].id = i;
    }
    sort(B + 1, B + n + 1, cmp);
    for (int i = 1; i <= n; i++)
        A[B[i].id] = i;
    for (int i = 1; i <= n; i++)
    {
        sum += query(A[i]);
        update(A[i], 1);
    }
    sum = n * (n - 1) / 2 - sum;
    printf("%lld\n", sum);
    return 0;
}

这里面还写了一个快速读入,可以不必太在意,重点还是在于这段代码:

for (int i = 1; i <= n; i++)
{
    sum += query(A[i]);
    update(A[i], 1);
}

其实单单是对这个求逆序的拓展应用,就有不少题目了,可见这个树状数组的应用面是多么广泛。但这篇文章已经很长了(我的水平也有限),就先写到这儿吧。

牛客练习赛115 解题报告 | 珂学家 | 记忆化 + 斜率极值 + dfn序&amp;树状数组 面试公司:三一面试岗位:结构岗面试流程:上来就是一分钟自我介绍,面试官深入挖掘简历内容,包括简历中的科研课题和项目,说说其中采用了什么方法,为什么选择这种方法和。,听舍友说重新笔的话,如果没通过,秋招。如题,本科211机械硕士985机械工程,无论文无专利,硕士做的方向是纳米线导电薄膜这一块,和机械没啥关系,现在感觉只能投机械结构岗,想问下各位已经面试或者拿of。面试官感觉好着急,是因为要下班了吗,问问题感觉像流水线,很着急,无手撕,然后问完光速下班不到20分钟,跟流水账一样,感觉面试质量好差。 阅读详情

相关推荐

OpenSPG实战指南:从零构建企业级知识图谱的完整流程

本文详细介绍了如何使用OpenSPG从零构建企业级知识图谱的完整流程,包括环境搭建、数据处理、图谱构建与推理等关键步骤。OpenSPG作为一款语义增强的知识图谱工具,结合了属性图和RDF的优势,支持混合推理引擎和热插拔架构,显著提升构建效率和查询性能。通过实战案例和避坑指南,帮助开发者快速掌握这一强大工具。

weixin_30500105的博客 460

jquery csv转化为数组_算法学习笔记(2) : 树状数组

树状数组(Binary Index Tree, BIT)也是很多OIer心中最简洁优美的数据结构之一。最简单的树状数组支持两种操作,时间复杂度均为 :单点修改:更改数组中一个元素的值区间查询:查询一个区间内所有元素的和 当然,树状数组能维护的不局限于加法,支持的操作也不止这两种,甚至有大佬能用树状数组实现平衡树,但这篇笔记不会深入讨论(因为我也还不是很懂hh)。 我们还是先来...

weixin_39965490的博客 305

【2025年阿里淘天秋招(算法岗) - 8月16日 -第三题(300分)- 工资方差】(题目+思路+Java&C++&Python解析+在线测试)

题目要求处理员工工资的区间方差查询和单点修改操作。摘要如下: 给定长度为n的工资序列和q次操作,操作分为两类: 修改某员工工资 查询区间工资方差 解题思路: 利用方差公式Var = E[X²] - (E[X])²,通过维护区间和与平方和来计算方差 使用两个树状数组分别维护区间和与平方和 单点修改时同步更新两个树状数组 区间查询时计算均值与方差 时间复杂度O((n+q)logn),空间复杂度O(n),适用于大规模数据。 代码实现要点: 使用树状数组高效处理区间查询和单点更新 注意数值精度处理,避免计算误差 各

m0_73659489的博客 207

树状数组

1.平常我们会遇到一些对数组进行维护查询的操作,比较常见的如,①修改某点的值②求某个区间的和2.当数据规模不大的时候,①对于修改某点的值是非常容易的,时间复杂度为 O(1)②求一个区间和就要从start循环到end,时间复杂度为 O(n)③如果实时的对数组进行 M次修改或求和,最坏的情况下时间复杂度为 O(M*N),当规模增大后,必定超时3.树状数组的时间复杂度为 O(M*logN)  4. A数...

紫芝的博客 590

【阿里淘天笔试题汇总】2024-04-03-阿里淘天春招笔试题(第二套)-三语言题解(CPP/Python/Java)

K小姐有一个由 nnn 个字符组成的字符串 sss。她会进行 qqq 次查询,每次给出两个整数 lll 和 rrr,请判断子串 s[l,r]s[l,r]s[l,r] 中的字符能否重新排列组合成一个回文串。第一行输入两个整数 nnn 和 qqq(1≤n,q≤1051 \le n,q \le 10^51≤n,q≤105),分别表示字符串长度和查询次数。第二行输入一个长度为 nnn 的字符串 sss,仅包含小写字母。接下来 qqq 行,每行输入两个整数 lll 和 rrr(1≤l≤r≤n1 \le l \le r

春秋招笔试突围 2639

【2026年阿里巴巴集团暑期实习- 4月8日-工程岗-第三题- 相邻等值对贡献和】(题目+思路+Java&C++&Python解析+在线测试)

本文提出了一种高效算法,用于计算数组中所有相邻等值对的贡献之和。该问题要求统计每组相邻等值对区间内严格小于该值的元素个数。通过按数值从小到大处理,利用树状数组动态维护已处理的位置信息,可以在O(n log n)时间内高效解决问题。具体步骤包括:1) 按值存储出现位置;2) 从小到大处理每个数值,在树状数组中查询区间和;3) 处理完毕后将该数值的所有位置加入树状数组。该方法保证了每个位置仅被处理一次,且查询操作高效,适用于大规模数据输入。空间复杂度为O(n),满足题目约束条件。

m0_73659489的博客 35

阿里编程题4星刷题体验:从算法建模到树状数组的实战解析

算法与数据结构是技术面试的核心能力,而动态规划、树状数组、贪心等经典模型则是解决复杂问题的关键工具。理解这些算法的原理,并掌握其在真实场景中的优化技巧,不仅能提升编码效率,更能应对大厂笔试中区分能力的核心题目。本文以阿里巴巴编程题4星为切入点,剖析其难度定位与高频题型,通过一道典型计数题展示如何将问题抽象为枚举锚点并利用树状数组实现O(n log n)解法,同时分享刷题过程中常见的边界条件、超时问题及系统训练方法。无论你是刚完成LeetCode简单题,还是正在备战互联网公司笔试,4星题都是衔接基础与高阶算法

weixin_33491377的博客 311

2.1 量子精密测量:SERF原子陀螺仪中的核自旋-电子自旋强耦合机制

本文深入解析了SERF原子陀螺仪中核自旋-电子自旋强耦合机制的核心原理与应用。通过量子精密测量技术,SERF陀螺仪实现了超高精度的惯性导航,其独特的磁场自补偿和拉莫尔进动特性使其在弱磁场环境下表现出色。文章还探讨了关键技术突破和前沿进展,展示了量子精密测量在惯性导航领域的巨大潜力。

kotlin6android的博客 211

阿里又成立新事业部了,但又如何呢?

虽然没有直接影响,但阿里的股价本身都在地下室了,下跌这事儿都不用理由,当天港股应声下跌 1%,美股在盘后交易中甚至一度因恐慌情绪重挫 5%。另外一件事,是阿里又成立了新的 AI 事业部,叫 Token Foundry,其实是合并了通义大模型事业部和未来生活实验室。而阿里巴巴本身就和美国军事采购无关,也就是列入名单其实没有直接影响,更多的是"警告"意味。1260H清单,本身只限制与美国国防部的合作,不限制任何非美国政府实体或个人的业务往来。具体的,我们可以遍历每个位置,假设当前处理到的位置是。

宫水三叶的刷题日记 196

如何用DETR(detection transformer)训练自己的数据集

DETR(detection transformer)简介 DETR是Facebook AI的研究者提出的Transformer的视觉版本,是CNN和transformer的融合,实现了端到端的预测,主要用于目标检测和全景分割。 DETR的Github地址:link

weixin_50233398的博客 3万+

机器学习——笔记整理(原理、python代码)——反反复复,出精活!

回顾知识,检查自我,开拓新域。 机器学习1.监督学习 机器学习简介: 机器学习是实现人工智能的手段,其主要研究内容是如何利用数据或经验进行学习,改善具体算法的性能。 多领域交叉,涉及概率论、统计学,算法复杂度理论等多门学科 广泛应用于网络搜索、垃圾邮件过滤、推荐系统、广告投放、信用评价、欺诈检测、股票交易和医疗诊断等应用。 机器学习分类: 机器学习一般分为下面几种类别 监督学习 ( Supervised Learning) 无监督学习 ( Unsupervised Learning) 强化学习(

weixin_45666566的博客 6487

+++*树状数组**求逆序数

思路:要求求逆序数的数组排序,排序之后他们的下标将混乱,这时求下标得逆序数,即为原数组的逆序数。 题目 # include<iostream> # include<cstdio> # include<algorithm> # include<cstring> const int maxn=500010; int n; long long a...

weixin_44075041的博客 255

别再折腾Windows了!Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境保姆级搭建指南

本文提供Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境的详细搭建指南,涵盖系统优化、UHD驱动编译、Vivado配置及硬件验证等关键步骤,帮助射频工程师高效构建稳定的开发环境,显著提升FPGA开发效率。

weixin_29168675的博客 255

树状数组的原理及实现,最新资料

由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!点击【学习资料】即可免费领取!的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!点击【学习资料】即可免费领取![外链图片转存中…(img-5HNmv76X-1712372627105)][外链图片转存中…(img-CZLx9i1g-1712372627105)]

2401_84092666的博客 969

YOLOv11改进,YOLOv11添加DCNv4可变性卷积(windows系统成功编译),二次创新C3k2结构,全网最详细教程

引入了可变形卷积 v4 (DCNv4),这是一种为广泛视觉应用设计的高效且有效的操作算子。DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以最小化冗余操作,从而加速计算。这些改进使得DCNv4相比DCNv3显著加快了收敛速度,并且处理速度大幅提升,前向传播速度超过三倍。DCNv4在多个任务中表现出色,包括图像分类、实例和语义分割,特别是在图像生成方面表现突出。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2665

【GlobalMapper精品教程】070:专题地图制作完整操作教程

与其它GIS软件一样,Globalmapper也可以制作出漂亮的地图,本文讲解专题地图制作完整操作流程。

智慧空间实验室 3753

ICPC基础算法工程化:从二分到并查集的鲁棒实现

在算法竞赛中,基础算法并非仅指概念理解,而是涵盖正确性、鲁棒性与现场适应性的工程实践体系。其核心原理在于将经典算法(如二分答案、树状数组、带权并查集)转化为可稳定运行于严苛赛制下的代码模块;技术价值体现在规避边界错误、栈溢出、哈希碰撞等高频失效点;典型应用场景包括区域赛真题中的最小化最大值、区间查询、连通性判定与字典序拓扑排序;本文聚焦近三年ICPC亚洲区127道基础算法题的实证分析,深度融合‘二分答案’与‘带权并查集’两大热词,提炼出符合工业级标准的特化模板与调试协议。

weixin_29698641的博客 161

Oracle EBS AP 应付模块核心实现逻辑(极简骨架 + 分层拆解 + 业务流转 + 分录 + 核心表)

Oracle EBS AP应付模块采用四层逻辑架构:1)主数据层统一管控供应商基础信息;2)发票负债层通过三单匹配校验生成应付账款;3)付款核销层实现负债冲减;4)SLA层自动生成财务凭证。核心流程包括发票验证(匹配PO/收货单)、付款核销(全额/部分冲账)、会计分录自动生成(通过SLA引擎)。模块严格遵循"无匹配不负债、无验证不入账"原则,与采购、库存等模块深度集成,实现从供应商创建到付款核销的完整业务闭环,确保应付账款准确性和审计追溯能力。

金牌架构师 440

蚂蚁集团20周年,马云现身杭州

关于马云和阿里巴巴,过去几年过得并不好,不仅仅是因为其所在的"中概队伍"普遍阴天,也不在于那次改变金融格局的演讲,而主要在于阿里的主盈利业务 - 天猫淘宝,虽然体量很大(前期占据中国电商市场份额 70% 以上),但其实护城河并不深,且阿里的立场偏向商家,叠加下沉市场的上网率逐步普及(越来越多人,尤其是消费力不高的人,也开始进行网购)的大背景,一下子就被拼多多和抖音打得没脾气,加上自身天猫其实没有类似京东自营的物流及服务优势,最终可谓两边挨打。数组不变,求区间和:「前缀和」、「树状数组」、「线段树」

宫水三叶的刷题日记 1118

【Unity 实用工具篇】✨| 使用Fungus插件制作一个对话系统,简单好学易上手

今天带来的是Unity中一款简单易用的对话插件Fungus,它是一个免费的交互式的对话系统。 Fungus是Unity免费的一款开源的插件,它可以无代码的实现玩家与NPC之间的对话,并且支持本地化,对相机、Sprite及音乐音效的控制。 学会使用该插件就可以做一些对话剧情类的游戏了,还是非常好用的,下面就来学习一下Fungus具体怎么使用吧!

努力前行,总会成为自己心中的那道光 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《算法和数据结构》数据结构篇

蓝桥杯你必须学会的算法

英雄哪里出来 4万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

学算法先学数据结构?是否是无稽之谈?

头发没了

英雄哪里出来 3万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深度学习工具包 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")

上一篇: 终于有人用7000字一次性把SpringBoot与微服务给讲明白了!
下一篇: MySQL 性能优化思路和工具
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值