图的非递归遍历(深搜和广搜)

DFS(深度优先搜索)的递归与非递归 DFS,depth-first search,深度优先搜索。顾名思义,从一个节点出发,尽可能往下遍历,即尽可能离“家”远一点,这个思想其实就是树结构遍历中的先序遍历。 那么从上述话语中,我们可以很容易地判断出需要用到递归,其实DFS的常规构造方法也就是用到递归的,但是我们还要考虑到一个问题,那么就是如果一个图足够大,比如有上万个节点,上万条边,那么估计用递归运行DFS我们的电脑会瞬间卡死。。。因为递归的代价实在是太大了,图如果小一点还好,不是特别明显,一旦图过大,递归的劣势会被无限放大,因此这里除了用递归来 阅读详情
//
// Created by Coder
//

#include <iostream>
#include <vector>
#include <stack>
#include <queue>

using namespace std;

class DirectedGraph{

private:
    // 最大顶点数
    const int V = 100000;


    // vector实现的邻接表的定义
    // 不考虑边权,存储类型为int型

    vector<int> e[V];
    int visit[V];

    // 邻接表的初始化操作
    // 将起点为`i`的边链表全部清空
    void init() {
        for (int i=0; i<V; i++) {
            e[i].clear();
            visit[i] = -1;
        }
    }

public:

    bool Visited(int v) {
        return visit[v] != -1;
    }

    void Visit(int v) {
        visit[v] = 1;
        cout<<v<<endl;
    }

    // 增加边
    // 新增顶点`i`到顶点`j`的边
    void AddEdge(int i, int j) {
        e[i].push_back(j);
    }


    // 查询边
    bool SearchEdge( int j, int k) {
        for (int i=0; i<V; i++) {
            //e[i][0] ----- 查询以`i`为起点的第一条边`i->e[i][0]`
            for (int j=0; j<(int)e[i].size(); ++j) {
                if (e[i][j] == k) {     // 查询边`i->k`
                    return true;
                }
            }
        }
        return false;
    }

    int GetFirstNotVisit(int v) {
        for (int j=0; j<e[v].size(); j++) {
            if(!Visited(e[v][j]))
                return j;
        }
        return -1;
    }

    //从v开始深度优先遍历
    void DFS(int v) {
        Visit(v);
        stack<int> s;
        s.push(v);
        while (!s.empty()) {
            //找到下一个待访问的邻接点
            int next = GetFirstNotVisit(s.top());
            if (next != -1) {   //还能继续深搜(未达到最大深度),继续
                //找到栈顶元素第一个未被访问的临接点(也就是更深的邻接点),访问之
                Visit(GetFirstNotVisit(s.top()));
                //入栈
                s.push(GetFirstNotVisit(s.top()));
            } else {    //不能继续深搜下去,回溯
                //出栈(回溯)到能找到有邻接点未被访问的节点
                s.pop();
            }
        }
    }

    //整个图的深搜
    void DFSTraverse() {
        for (int i=0; i<V; i++) {
            if (!Visited(i)) {
                BFS(i);
            }
        }
    }

    //单节点广搜
    void BFS(int v) {
        //访问当前节点
        Visit(v);
        queue<int> s;
        s.push(v);
        while (!s.empty()) {
            //取队首元素
            int front = s.front();
            //出队
            s.pop();
            //对于队首元素,访问其所有未访问的邻接点
            //将未访问的邻接点入栈
            for (int i=0; i<e[front].size(); i++) {
                if (!Visited(e[front][i])) {
                    Visit(e[front][i]);
                    s.push(e[front][i]);
                }
            }
        }
    }

    //整个图的广搜
    void BFSTraverse() {
        for (int i=0; i<V; i++) {
            if (!Visited(i)) {
                BFS(i);
            }
        }
    }
};

更新

加入泛型支持,节点类型要重载=和==运算符,代码有点粗糙,c++水平还是渣。根据严蔚敏的数据结构书中对广搜和深搜的定义书写,代码经过测试。

//
// Created by Coder on 2018/2/13.
//

#include <iostream>
#include <vector>
#include <stack>
#include <queue>

using namespace std;

template <class Type, class Weight>
class DirectedGraph{

private:
    //最大顶点数
    const static int V = 10000;

    //当前的顶点数
    int VertexCount = 0;

    //存储所有的顶点
    vector<Type> vertexs;

    // vector实现的邻接表的定义
    // 注意edge[i]中的每一个元素都表示节点vertex数组中的下标
    // edge[i][j]表示 vertex[i]与vertex[edge[i][j]]有通路
    vector<int> edge[V];
    //weight和数组edge一一对应
    //weight[i][j]表示 vertex[i]与vertex[edge[i][j]]通路的权
    vector<Weight> weight[V];
    int visit[V];

public:

    DirectedGraph() {
        // 邻接表的初始化操作
        // 将起点为`i`的边链表全部清空
        for (int i=0; i<V; i++) {
            edge[i].clear();
            visit[i] = -1;
        }
    }

    bool SearchVertex(Type v) {
        for (int i=0; i<vertexs.size(); i++) {
            if (vertexs[i] == v) {
                return true;
            }
        }
        return false;
    }

    bool InsertVertex(Type v) {
        if(!SearchVertex(v)) {
            vertexs.push_back(v);
            VertexCount++;
            return true;
        }
        return false;
    }

    int FindIndex(Type v) {
        for (int i=0; i<vertexs.size(); i++) {
            if (vertexs[i] == v) {
                return i;
            }
        }
        return -1;
    }

    bool InsertEdge(Type from, Type to, Weight w) {
        int i = FindIndex(from);
        int j = FindIndex(to);
        if(i != -1 && j != -1) {
            //添加边
            edge[i].push_back(j);
            //添加权
            weight[i].push_back(w);
        }
    }

    bool Visited(int index) {
        return visit[index] != -1;
    }

    //访问vertexs[index]
    void Visit(int index) {
        visit[index] = 1;
        cout<<vertexs[index]<<endl;
    }


    // 查询边
    bool SearchEdge( Type from, Type to) {
        int i = FindIndex(from);
        int j = FindIndex(to);
        if (i != -1) {
            for (int k=0; k<(int)edge[i].size(); ++k) {
                if (edge[i][k] == j) {     // 查询边`i->j`
                    return true;
                }
            }
        }
        return false;
    }

    //打印顶点
    void PrintVertex() {
        for (int i=0; i<vertexs.size(); i++) {
            cout<<vertexs[i]<<endl;
        }
    }
    //打印边
    void PrintEdge() {
        for (int i=0; i<VertexCount; i++) {
            for (int j=0; j<edge[i].size(); j++) {
                cout<<vertexs[i]<<"->"<<vertexs[edge[i][j]]<<" weight:"<<weight[i][j]<<endl;
            }
        }
    }

    //返回v第一个没被访问的邻接点下标
    //index是v在vertexs中的下标
    int GetFirstNotVisit(int index) {
        if (index != -1) {
            //遍历v的邻接点
            for (int j=0; j<edge[index].size(); j++) {
                if(!Visited(edge[index][j]))
                    return edge[index][j];
            }
        }
        return -1;
    }

    //从v开始深度优先遍历
    void DFS(int index) {
        //访问该节点
        Visit(index);
        //存储节点的下标
        stack<int> s;
        s.push(index);
        while (!s.empty()) {
            //找到下一个待访问的邻接点下标
            int next = GetFirstNotVisit(s.top());
            if (next != -1) {   //还能继续深搜(未达到最大深度),继续
                //找到栈顶元素第一个未被访问的临接点(也就是更深的邻接点),访问之
                Visit(next);
                //入栈
                s.push(next);
            } else {    //不能继续深搜下去,回溯
                //出栈(回溯)到能找到有邻接点未被访问的节点
                s.pop();
            }
        }
    }

    //整个图的深搜
    void DFSTraverse() {
        for (int i=0; i<VertexCount; i++) {
            if (!Visited(i)) {
                DFS(i);
            }
        }
    }

    //单节点广搜
    void BFS(int index) {
        //访问当前节点
        Visit(index);
        queue<int> s;
        s.push(index);
        while (!s.empty()) {
            //取队首元素
            int front = s.front();
            //出队
            s.pop();
            //对于队首元素,访问其所有未访问的邻接点
            //将未访问的邻接点入栈
            for (int i=0; i<edge[front].size(); i++) {
                if (!Visited(edge[front][i])) {
                    Visit(edge[front][i]);
                    s.push(edge[front][i]);
                }
            }
        }
    }

    //整个图的广搜
    void BFSTraverse() {
        for (int i=0; i<VertexCount; i++) {
            if (!Visited(i)) {
                BFS(i);
            }
        }
    }
};

int main() {
    DirectedGraph<char, int> graph;
    int total, weight;
    char from, to;
    cin>>total;
    for (int i=0; i<total; i++) {
        cin>>from>>to;
        graph.InsertVertex(from);
        graph.InsertVertex(to);
        graph.InsertEdge(from, to, weight);
        graph.InsertEdge(to, from, weight);
    }
//    graph.PrintVertex();
//    graph.PrintEdge();
//    graph.DFSTraverse();
    graph.BFSTraverse();
}

二叉树的非递归遍历和层次遍历详解 二叉树非递归遍历非递归的后序遍历二叉树 //非递归的后续遍历二叉树 void HXprint(Tree *tree){ Stack s = initStack(); //初始化一个下面使用的栈 treeNode *p = tree; //新建一个遍历指针 treeNode *r=NULL; //辅助变量 cout<<"-------"<<endl; while(p||!isEmpty(s)){ //当遍历变量和栈同时为空时 表示遍历完成 阅读详情

相关推荐

C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

二叉树的非递归遍历C/C++实现: 非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历 struct tree* temp = root; while (temp != NULL || S.top > 0) { while (temp != NULL) { ...

SanpTap的博客 2596

深搜非递归

#include &lt;iostream&gt; #include &lt;stack&gt; using namespace std; #define MaxNode 20 #define MAX 2000 #define StartNode 1 int map[MaxNode+1][MaxNode+1]; void dfs_stack(int start, int n){ in...

@奮 鬥@的专栏 844

全排列深搜的三种实现和广搜实现

全排列深搜的三种实现和广搜实现 深搜1 普通递归实现 递归一个全局变量数组 a[n], 用 bool 数组 b[n] 表示数字是否被使用 由于节点只用全局变量数组 a[n] 来表示, 所以每次回溯都要恢复为未递归时节点的状态 #include <iostream> using namespace std; const int N = 10; int n, a[N]; bool b[N]; void DFS(int k) { if(k == n) // 递归的终止节点

nwpu2015302463的博客 547

一道物流运输规划题目的求解

本文源起于,在优快云 的问答。 我尝试着作了解答;但是基于两点原因:一是感觉意犹未尽,还想借题发挥一下;二是对于过程,需要详细说明,特别是还有一些图,一些引申的想法,也许对于一些做项目的朋友有所帮助,所以,借此写一篇文章吧。 此外,也正好是接触、学习python 快满百天了,借此篇文章纪念一下罢。

常年招收【在读】大学生、研究生、IT一技之长者,远程兼职,待遇丰厚!请私信我! 614

深度优先搜索非递归方式

目录 一、概述 二、深度优先搜索非递归 三、代码 一、概述 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 深度优先遍历图的方法是,从图中某顶点v出发: (1)访问顶点v; (2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问; (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优...

kupePoem的专栏 1632

图的非递归深度优先搜索.

用C++写的图的非递归深度优先搜索.一个小程序

图的遍历(递归+非递归)

图遍历一共有四种,邻接矩阵的BFS与DFS,邻接表的BFS与DFS 还有BFS(BFS没有递归!)与DFS递归与非递归; DFS 手工 DFS 在访问图中某一起始顶点 v 后, 由 v 出发, 访问它的任一邻接顶点 w1; 再从 w1 出发, 访问与 w1邻 接但还没有访问过的顶点 w2; 然后再从 w2 出发, 进行类似的访问, … 如此进行下去, 直至到达所有的邻接顶点都被访问过的顶点 u 为止。接着, 退回一步, 退到前一次刚访问过的顶点, 看是否还有其它没有被访问的邻...

weixin_51578598的博客 1494

YF-S401水流量传感器在STM32上的精准计量实现

本文详细介绍了YF-S401水流量传感器与STM32微控制器的集成应用,实现精准水流计量。通过外部中断和外部时钟两种脉冲计数方案,结合硬件配置、软件滤波和校准技巧,确保高精度流量测量。适用于智能家居和工业自动化中的水控系统,提升系统稳定性和测量准确性。

rainy的博客 896

数据结构与算法--图的遍历(邻接矩阵和邻接表的深搜,广搜的递归和非递归算法以及判断是否是连通图)

前言 网上已经有很多博客讲了图的遍历的方法,因此本文不再赘述。 一.图的创建 1.节点类的定义 class ListNode { public ListNode(int num) { this.num = num; } int num; //节点的序号 ListNode next; } 2.以邻接表储存的图的创建 private Lis...

qq_43935080的博客 628

从Oracle到腾讯TDSQL数据库升级技术分享

腾讯TDSQL(Tencent Distributed SQL)是一款兼具关系数据库和NoSQL数据库优点的新型数据库,文章主要分享oracle升级为TDSQl数据库技术经验。

u012372850的专栏 2613

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 457

对图的构造及广搜和深搜

#include #include #define VV 100 #define EE 999 #include using namespace std; bool visited[100]; int q[100]; struct graph{ int v,e; char vex[VV]; int edge[EE][EE]; }; void createGraph(graph * g){ int i=0,j=0; printf("

CandyLien 555

Autosar中CAN信号传输的模块化解析与实战应用

本文深入解析了AUTOSAR架构下CAN信号传输的模块化流程,详细阐述了从应用层软件组件(SWC)到COM模块打包、PduR路由、CanIf硬件抽象直至Can Driver驱动的完整“流水线”。文章通过实战案例,重点说明了模块化设计如何实现解耦与可移植性,并提供了关键模块配置要点与调试技巧,旨在帮助开发者构建高可靠、实时的车载通信系统。

g9h0i1的博客 902

二叉搜索树深搜解析:三种遍历策略与实现

本文详细解析了二叉搜索树的三种深度优先遍历方式:前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7087

【东华大学oj】找到最大数(一维数组->中等)

一天,老师布置了一个作业,要求对一串数字各不相同的数字串进行排序,大的在前,小的在后。接着,我从数字串中的第二个数字开始往后找,找到最大的一个,然后与第二个数字交换,这样的话我就能够确定排序后数字串中的第二个数字;明明研究发现,他的这个想法中最重要的一环就是在一串数字中找到最大的那个,然后与第一个数字交换,可是明明毕竟刚刚开始学习程序设计不久,无法写出较复杂的程序,所以明明想让你这位程序设计专家帮他的忙,帮助他把这段核心程序写出来,然后明明只需模仿着写就可以了。时间限制: 1S类别: 一维数组->中等。

的博客 524

FPGA/IC秋招经典100题(含详解)

FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。

Crazzy_M的博客 1万+

二叉树的非递归遍历

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 ​ 三种遍历方式访问节点的顺序是一致的,不同之处在于,有的遍历流程把访问到的节点暂存起来,达成某种条件后再将节点输出。

qq_43169752的博客 1万+

物流分拣YOLO实战:YOLO26 OBB+YOLOv8多尺度融合,不规则包裹分拣效率提升40%(附训练+部署代码)

在物流分拣的工业场景中,模型的检测精度、推理速度、部署友好性本次基于YOLO26 OBB+YOLOv8多尺度融合打造的物流分拣视觉检测方案,精准解决了工业场景中不规则包裹的旋转检测、多尺度包裹的漏检问题,最终实现分拣效率提升40%,检测准确率提升至95%以上,且模型在边缘设备上的推理帧率稳定35FPS+,完全适配物流分拣的工业落地需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 881

深搜和广搜的简单概述和实现方式

广搜(BFS):广搜一般是用于求图的最短路径,比如迷宫中走到某一点的最短距离,或者某个字符串交换达到目标字符串的最少次数,解的个数一般是为单一的,可以把搜索的整个过程想象成一棵树,要求的解就是其中的某一个节点,且距离根节点是最近的。实现方式:用队列存储每一个子节点,由于队列的存取方式是先进先出,所以很符合广搜的要求,每求出一种情况,将其推入队列中,若当前节点的子节点都已求出,直接将队列的头取出继续...

habewow的博客 1万+

代码接单:用 ComfyUI 搭建电商模特换装工作流(保姆级教程)

在闲鱼和小红书上,搜一下“AI 模特图”或者“服装换模特”,你会发现大量的接单需求。太贵:请个外模拍一套图,动辄几千块。太慢:寄样品、排期、拍摄、修图,半个月过去了。太卷:竞对都在上新,你还在等图。“给我一张你的衣服平铺图(或假人图),我 10 分钟给你生成真人上身图,一张只要 50 块。对于商家是省钱,对于你是纯利润。为什么不用 Midjourney?因为 MJ 抽卡不可控,无法保持衣服版型一致。只有 ComfyUI,才能做到精准控制,实现工业化量产。

BUG猿的博客 1775

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

图的遍历(深度递归遍历,深度非递归遍历,广度递归遍历)

最近在学数据结构,看到图的遍历小有疑惑,便去实现了一番。。。。 以下是用C++ 实现: #include #include    //队列定义,用于广度递归查询 #include   //栈的定义, 用于深度非递归查询 #include #include    //方便调用c语言函数 #define MAX 100    //最大值

gu_chengz的博客 4547

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

课程讲解---深搜

DFS适合需要深入探索的问题,如路径查找和环检测。BFS适合需要找到最短路径的问题,如迷宫求解和社交网络分析。选择哪种算法取决于具体问题的需求和图的特性。

你猜我是谁? 2239

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

图的非递归深搜遍历图示与代码(python)

1 非递归深搜 图的深搜递归形式非常简单,相信大家都会,在此就来实现一下非递归版本的深搜。 1.1 图示 对于以上的图,从1开始的深搜遍历结果应该是1 2 3 4 0。那么如何通过非递归形式得到该结果呢,下面以该图为例进行演示: 首先我们准备要一个栈来模拟递归的过程,以及一个集合来存储已经访问的节点,以免因为图中的环结构让子节点再次进入父节点访问。 我们首先处理节点1,这里将入栈操作视为对节点的访问,于是我们将节点1入栈并访问,再加入已访问集合。 从这开始,我们就要对栈中的元素进行不断地

Demon_LMMan的博客 1163

二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现

1)递归序,3次见面,第一次见面打印叫先序遍历,第二次见面打印叫中序遍历,第三次见面打印叫后序遍历 2)非递归实现中,先序和后序是相反的,但是中序遍历挺难理解,但是核心思想也就是先去左树,再打印头,然后再去右树。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 7748

搜索算法-深搜与广搜

主要用于自己复习用的,专业性有待考量,想学的最好还是别点进来看。

qq_37448192的博客 1629

用stlstack实现深搜_深搜和广搜的原理及优缺点

图的遍历方式有深度优先搜索(Deep-first Search,一条道走到底)和宽度优先搜索(Breath-first Search,一层一层的遍历)两种。1 深搜深搜是对最新产生的节点(即深度最大的节点)先进行扩展的方法,把扩展的节点从栈中弹出删除。这样,一般在栈中存储的节点数就是深度值,因此它占用的空间较少。所以,如果搜索树的节点较多,为避免溢出,深度优先搜索是一种有效的算法。1.1 深搜原理...

weixin_39671964的博客 477
上一篇: 链表的翻转
下一篇: 01背包问题的一般DP求解
aNoobCoder
博客等级 码龄10年 2粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值