Prim算法实现最小生成树 1.最小生成树是什么2.最小生成树的用途3.Prim算法描述4.Prim算法演示最小生成树过程5.Prim算法实现END 1.最小生成树是什么 对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树。 如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树(SpanningTree)。 生成树是连通图的包含图中的所有顶点的极小连通子图。 图的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。 最小生成树(minimum spanning tree)其实就是一个生成树,不过它不同于一般的生成树,它的边权之和是最小的,即边权和最小的生成树。 同一个图的最小生成树也可以有很多个,但是其边权和肯定是一样的。 2.最小生成树的用途 最小生成树应用于图论知识的实际问题。生成树和最小生成树有许多重要的应用。 例如:要在n个城市之间铺设光缆,主要目标是要使这n个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。
3.Prim算法描述 将图中所有顶点分为两类:树顶点(已被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来找出一条边添加到生成树,这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短的边加入到生成树中。一直重复直至所有顶点都加入生成树中。
算法的具体流程如下:
从任意一个顶点(假设选1)开始构造生成树,首先将顶点1加入生成树中,用一个一维数组book标记那些顶点已经加入到了生成树中。用数组dis记录生成树到各个顶点的距离。最初生成树只有1号顶点,有直连边时,数组dis中存储的就是1号顶点到该顶点的边的权值,没有直连边的时候就是无穷大(INT_MAX),即初始化数组。从数组dis中选出离生成树最近的顶点(假设为顶点j)加入到生成树中(在数组dis中的最小值)。再以j为中间点,更新生成树到每一个非树顶点的距离,如果dis[k] > e[j][k]则更新dis[k] = e[j][k]。重复步骤3,直到生成树中有n个顶点为止。 4.Prim算法演示最小生成树过程 图的数据结构描述: 如下图所示,用一个二维矩阵graph表示边的顶点和边信息,例如graph[1][2] = 11表示顶点1到顶点2的权重是11. 一维数组book表示节点i是否被访问过,book[i] = 1表示节点i已经被访问,否则表示还没有被访问。 一维数组dis表示生成树到各个顶点的距离。 初始化与图相关的所有数据结构,如下所示: Prim算法实现的具体步骤如下: 5.Prim算法实现 #include <iostream> #include <vector> #include <unordered_map> using namespace std; /* * 测试用例 2 4 11 3 5 13 4 6 3 5 6 4 2 3 6 4 5 7 1 2 1 3 4 9 1 3 2 */ class Prim { private: int vertice = 0;//顶点数 int edge = 0;//边数 vector<bool> book;//记录顶点i是否被遍历过 vector<int> dis;//记录最短距离 vector<vector<int>> graph; int sum = 0;//记录最小生成树权值总和 int count = 0;//记录最小生成树中节点个数 int index = 0;//记录dis中最小值的顶点 public: Prim(int x = 0, int y = 0) :vertice(x), edge(y) { graph.
1.下载安装pyqt5工具包以及配置ui界面开发环境 pip install PyQt5 pip install PyQt5-tools 2.点击File->Settings->External Tools进行工具添加,依次进行Qt Designer、PyUIC环境配置. 2.1 添加QtDesigner Qt Designer 是通过拖拽的方式放置控件,并实时查看控件效果进行快速UI设计
位置内容name可以随便命名,只要便于记忆就可以,本次采取通用命名:Qt DesignerProgramdesigner.exe路径,一般在python中.\Library\bin\designer.exeArguments固定格式,直接复制也可:$FileDir$\$FileName$Working directory固定格式,直接复制也可:$FileDir$ 2.2 添加PyUIC PyUIC主要是把Qt Designer生成的.ui文件换成.py文件
位置内容name可以随便命名,只要便于记忆就可以,本次采取通用命名:PyUiCProgrampython.exe路径,一般在python安装根目录中Arguments固定格式,直接复制也可:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.pyWorking directory固定格式,直接复制也可:$FileDir$ 3. QtDesigner建立图形化窗口界面 3.1 在根目录下新建UI文件夹进行UI文件的专门存储,点击Tools->External Tools->Qt Designer进行图形界面创建. 3.2 创建一个Main Window窗口 3.3 完成基本界面开发后,保存其为Detect.ui,放置在UI文件夹下,利用PyUic工具将其转化为Detect.py文件。 转换完成后,进行相应的槽函数的建立与修改,此处建议直接看我后面给出的demo。
4. demo 使用时只需将parser.add_argument中的'--weights'设为响应权重即可。
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file '.\project.ui' # # Created by: PyQt5 UI code generator 5.9.2 # # WARNING! All changes made in this file will be lost!
下载anaconda时,我特意将下载路径设置在d盘,但是新建的虚拟环境总是在c盘,很苦恼,一直解决不了,重装也不行,后来才找到一个方法,和大家分享一下,希望有所帮助。(第一次写,写的不好多多包涵)
查看虚拟环境路径:
conda env list 下面是显示在d盘的,是设置成功的。没成功的会显示在c盘
方法如下: 1.打开文件夹,点开c盘,点击用户
点击自己用户名的文件夹,我的是这样的:
接下来可能大家遇到的问题不一样:
a、存在“.condarc”的文件 那么接着查看文件的内容是否为(不是的话修改成这个):
channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 然后在最底下加上:
envs_dirs: - D(哪个盘由你决定)://(后面的文件路径也是你自己决定的)anaconda3//envs 最终我的文件内容就是:
channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.
😸个人主页👉:神兽汤姆猫
📖系列专栏🔥:编程语言环境配置、Java、Java面试 💕如果此篇文章对您有帮助的话,请点赞、转发、收藏这对我有很大的帮助。
前言 Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器。
当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。它具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式,Tomcat目前最新版本为Tomcat10。
Tomcat下载 在阅读此文章前,请首先确认你是否下载安装配置Java环境,如果未安装,请看此教程:Java/JDK下载、安装与环境变量配置超详细教程(2022更新)保姆级,秒会
首先我们先进入官网进行下载:
Tomcat官网下载链接:👉Tomcat官网下载链接
以上此链接可以下载Tomcat10——Tomcat8,如需下载Tomcat以往版本,请访问此链接进行下载:
Tomcat历史版本下载地址:👉Tomcat历史版本下载链接
如上图所示:点击左侧导航菜单,选择需要的相应版本,即可跳转。具体版本对应下载链接我已整理完毕,请按需选择对应的版本。
Tomcat10👉:Apache Tomcat 10 官网下载地址
Tomcat9👉:Apache Tomcat 9 官网下载地址
Tomcat8👉:Apache Tomcat 8 官网下载地址
此处结合实用性,将以最新的Tomcat10版本为例,进行演示,其他版本操作同理,一样跟着步骤走即可。
进入Tomcat10链接,如下图所示,根据自己当前所属系统,选择下载哪一项。
此处作者以受众面最广的Windows系统为示例,进行演示:
我们将其下载下来,解压下载的压缩包至本地无中文,无特殊字符的,纯英文的路径下,如下图所示:(此处你也可以参考我的目录)
Tomcat目录结构 我们下载解压了Tomcat之后,需要对其有个基本的认识,来帮助我们更好的学习使用Tomcat。
如果此时你时间着急的话,那么建议直接跳过学习目录结构这一章,进入Tomcat的配置与测试。但是这一章是极其重要的,我的个人建议是你一定需要挑个时间来学习这一章节。
如果你下载正确的话,大概的目录结构是和下图差不多的:
我们从第一个目录开始逐个了解,只需了解其的基本用处即可。
🔖bin文件夹🌟:存放Tomcat的命令、脚本等文件,其中以.sh结尾的是Linux/Mac OS系统使用命令的。以.bat结尾的则是Windows系统的命令使用的。其他的为通用项。 我们也可以在此处启动和关闭Tomcat,例如在Windows系统下,startup.bat则可以启动Tomcat,shutdown.bat则可以关闭Tomcat。Linux和Mac OS同理,它们可以运行startup.sh,shutdown.sh用来启动和关闭Tomcat。catalina.bat/catalina.sh则可以设置Tomcat的内存。
🔖conf文件夹🌟:存放Tomcat的配置文件等。例如:server.xml文件可以设置端口号、域名、IP、编码等也可以将日志配置到其他目录等 。tomcat-user.xml文件则用来管理配置Tomcat的用户与权限,context.xml用来配置数据源等
🔖lib文件夹:存放Tomcat运行时所必须的JAR包文件。注意的是JAR文件只可以被Tomcat服务器所访问。
🔖logs文件夹:默认日志文件存放的目录,对于我们后期的排查起到非常重要的作用。需要注意的是,如果你是Windows系统,它将存放在以年月日命名的文件中,例如:catalina.2022-11-08.log。如果你是Linux/Mac OS系统,它将存放在catalina.out文件中。
🔖temp文件夹:用来存放Tomcat的运行时的临时文件用。
🔖webapps文件夹🌟:用来存放web应用和部署项目的目录,Tomcat启动时会加载此目录下的项目应用。
在服务器上部署web项目时,只需将项目war包放入Tomcat中的webapps文件下后重启Tomcat之后war包会自动解压,此时访问项目的地址是IP+端口+项目名称就可以正常访问项目。而webapps文件夹中还有个默认的ROOT目录如下图所示:
我们同样可以将项目的war包解压后放入ROOT目录,同样可以运行该项目。需要注意的是放在ROOT目录下之后访问项目方式就会变成:IP+端口号。
而两者的区别就是放在webapps文件夹中不需要解压,放在ROOT文件夹中需要解压。放在webapps文件夹中访问项目需要加项目名 ,放在ROOT文件夹中不需要加项目名 。
我们将来启动Tomcat看到的cat页面的文件是存放在ROOT文件夹下的,如果我们将ROOT文件夹删除,再次启动Tomcat依旧会自动生成。
🔖work文件夹:存放Tomcat运行时所编译之后的文件,如需清除Tomcat缓存,可以选择清空此目录,重启Tomcat即可。
Tomcat配置环境变量 在下载解压和简单的了解Tomcat目录结构之后,我们就要开始为其配置变量的操作了,请执行如下步骤:
此电脑--->属性--->高级系统设置--->环境变量--->系统变量(S)--->新建 如图所示:
文章目录 1. pip的安装与卸载1.1 pip的安装1.2 pip的卸载 2. pip的使用2.1 帮助信息2.2 查看pip版本2.3 更新pip版本2.4 安装库2.4.1 安装单个库2.4.2 批量安装库 2.5 查看库2.5.1 查看所有已安装的库2.5.2 输出已安装库的信息至文件2.5.3 查看库的详细信息 2.6 升级库2.7 卸载库2.7.1 卸载单个库2.7.2 批量卸载库 3. 提高pip下载速度 1. pip的安装与卸载 1.1 pip的安装 python中有许多有用的库,要使用这些第三方库,需要安装pip
打开cmd,输入以下命令安装pip:
python -m ensurepip --default-pip 出现如下图所示,代表pip安装成功:
1.2 pip的卸载 1.卸载前询问一次,确认是否卸载
python -m pip uninstall pip 2.直接卸载不询问
python -m pip uninstall -y pip 2. pip的使用 2.1 帮助信息 帮助信息可以查看pip命令的用法,帮助命令如下:
pip <command>-h或pip <command> --help,其中<command>为可选信息,用法如下:
1.查看pip命令的用法:
pip -h pip --help 2.查看pip list命令的用法
pip list -h 2.
我们在进行开发工作时,对数据库的操作是必不可少的,熟练掌握SQL语句可以让我们对数据库的数据处理变得非常简单,所以学习SQL语句是非常有必要的,下面汇总了一些常用的SQL语句 SQL语句的类型 DDL(Data Definition Language)数据定义语言 DML(Data Manipulation Language)数据操作语言 DQL(Data Query Language)数据查询语言 DCL(Data Control Language)数据控制语言 DDL DDL是数据定义语言,主要是对数据库和数据表的操作
(1)操作数据库 --创建库 create database 库名; --创建库时判断库是否存在,不存在则创建 create database if not exists 库名; --查看所有数据库 show databases; --使用指定数据库 use 库名; --查看当前指定数据库包含的数据表 show tables; --查看数据库的结构定义信息 show create database 库名; --删除数据库 drop database 库名; --修改数据库的字符集为utf8 alter database 库名 character set utf8; (2)操作数据表 --创建表 create table 表名( 字段1 类型1, 字段2 类型2, 字段3 类型3, ........... ); --查看表结构 desc 表名; --查看创建表的SQL语句 show create table 表名; --修改表名 alter table 表名 rename to 新的表名; --添加一个新的字段 alter table 表名 add 字段; 字段类型; --修改字段名 alter table 表名 rename column 字段名 to 新的字段名; --修改字段类型(注意类型修改前后数据是否兼容) alter table 表名 modify column 字段名 新的字段类型; --删除一个字段 alter table 表名 drop 字段名; --删除表 drop table 表名; --删除表时判断表是否存在,若存在则删除 drop table if exists 表名; DML DML是数据操作语言,主要是对数据表的操作
文章目录 一.基础概念1.1函数递归的定义1.2函数递归的优缺点1.3函数递归的两个必要条件 二. 入门级函数递归例题2.1函数递归之死循环2.2输入输出1234 三. 函数递归典型例题的实现3.1求n的阶乘3.2strlen函数的模拟实现3.3求n的k次幂3.4字符串逆序3.5斐波那契数(递归实现和非递归实现)3.5.1递归的实现3.5.2非递归的实现3.5.3斐波那契数的非递归的实现优于递归实现的原因 3.6经典问题之《青蛙跳台阶》3.7经典问题之《汉诺塔问题》过程演示 一.基础概念 1.1函数递归的定义 程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接
调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
1.2函数递归的优缺点 优点:函数递归只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小(这种思考方式十分重要)。
缺点:①如果函数递归使用不恰当,会导致栈溢出,因为每一次函数调用都会在栈区上申请内存空间。②每一次函数递归(函数调用)都会在函数栈帧上开辟一块空间,所谓的压栈。这样会大大降低我们代码的执行效率(这会在函数递归例题详解:斐波那系数中解释)。
1.3函数递归的两个必要条件 存在限制条件,当满足这个限制条件的时候,递归便不再继续。每次递归调用之后越来越接近这个限制条件。 二. 入门级函数递归例题 2.1函数递归之死循环 我们了解了函数递归的基础概念后,来看看这段有趣而危险的代码。
#include <stdio.h> int main() { printf("cc\n"); main(); //重复调用main函数 return 0; } 可想而知,程序最终会崩溃。因为每一次函数调用都会在栈上开辟一块空间,这种死循环的代码会一直开辟空间,直至栈溢出,正如上面的缺点②。
2.2输入输出1234 题目描述:
接受一个整型值(无符号),按照顺序打印它的每一位。
例如:
输入:1234,输出 1234
解题思路:这种输入输出数字的题,我们一定要想到取模和取余的方法,并且要有限制条件,每次函数递归后,都会越来越接近这个值。
所以先函数递推1234%10=4,123%10=3,12%10=2,1%10=1,给定限制条件n>9,直到n=1,打印出最后值(1),最后函数回归打印出1234。
设n为1234
print(1234/10) + 1234%10 (=4)
print(123/10) + 123%10(=3)
print(12/10) + 12%10(=2)
当n最后为1时,不满足我们给定的限制条件n>9时,即打印1%10(=1)
代码实现:
void print(unsigned int n) { if (n > 9) //限定条件 { print(n / 10); //取模 } printf("
一.echarts的介绍 1.echarts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。
2.学习一项技术的关键,还是需要多读官方文档,官网链接Apache ECharts,与之类似的图表库还有D3,HeightCharts。
3.echarts的下载
(1)从 npm 获取
npm install echarts --save
(2)从 CDN 获取
(3)从 GitHub 获取
二.echarts语法 一.echarts常见术语 英文汉语title标题legend图例tooltip提示xAxisx轴线yAxisy轴线series系列data数据 二.图表常见类型 bar 柱状图line折线图
(1)曲线图
加上smooth:true;就会变成曲线图
(2)面积图
加上areaStyle:{fill:“#f70”} 会变成面积图pie 饼形图
(1)加上radius:[80,50] 会变成环形图 三.echarts 中的样式简介 颜色主题
(1)主题可以通过切换深色模式,直接看到采用主题的效果 通过light 、dark切换定制主题,具体可以参考官网,需要导入下载的js文件 // HTML 引入 vintage.js 文件后(假设主题名称是 "vintage") var chart = echarts.init(dom, 'vintage'); // ... (2)color调色盘
在 option 中设置。可以设置全局的调色盘,也可以设置系列自己专属的调色盘。
全局调色盘option.color
option.color:color: ["pink", "#ff0", "#f0f", "#0ff"] 局部调色盘series.item.color
series: [ { type: 'bar', // 此系列自己的调色盘。 color: [ '#dd6b66', '#759aa0', '#e69d87', '#8dc1a9', '#ea7e53', '#eedd78', '#73a373', '#73b9bc', '#7289ab', '#91ca8c', '#f49f42' ] }, (3)itemStyle项的颜色
目录 前言1. Softmax2. Sigmoid3. 总结 前言 Softmax以及Sigmoid这两者都是神经网络中的激活函数,对应还有其他的激活函数
引入激活函数是为了将其输入非线性化,使得神经网络可以逼近任何非线性函数
(原本没有引入激活函数,就是多个矩阵进行相乘,无论神经网络多少层都是线性组合,这个概念是感知机)
Softmax以及Sigmoid两者都是作为神经网络的最后一层,通过激活函数之后转换为概率值
1. Softmax 作为二分类问题探讨,是二分类的拓展版,将其拓展为N分类,对应以概率的形式展示(概率最大的类别为此类别)
全连接层的输出使用Softmax,将其输出的结果表示为概率类别(所有概率加起来为1)。
Softmax将其泛化为多分类(SVM得出的是每个类别的分数),Softmax得出的是归一化类别概率(将其所有的输出结果都归一到0和1范围内)。
对应Softmax输入N个值,输出的结果为这N个值的概率(符合概率分布),预测出的所有值加起来为1,对应哪个值比较大,则判定为该类别
其公式具体如下:(使用ex,是为了将其预测结果转换为正数,保证概率不为负数)
通过其公式可看出其特性为:
零点不可微负输入梯度为0 例子如下:
A = 1,B = 2,C = 3
对应的概率值分别为:
P(A)= e1 / (e1 + e2 + e3)
P(B)= e2 / (e1 + e2 + e3)
P(C)= e3 / (e1 + e2 + e3)
对应代码模块如下:
import numpy as np scores = np.array([1, 2, 3]) softmax = np.exp(scores) / np.sum(np.exp(scores)) print(softmax) 截图如下:
与树的遍历类似,图的遍历指从图的某一节点出发,按照某种搜索方式对图中的所有节点都仅访问一次。图的遍历可以解决很多搜索问题,实际应用非常广泛。图的遍历根据搜索方式的不同,分为广度优先遍历和深度优先遍历。
图的遍历 —— 广度优先遍历 广度优先搜索(Breadth First Search,BFS)又被称为宽度优先搜索,是最常见的图搜索方法之一。
广度优先搜索指从某个节点(源点)出发,一次性访问所有未被访问的邻接点,再依次从这些已访问过的邻接点出发,一层一层地访问。如下图所示,广度优先遍历是按照广度优先搜索的方式对图进行遍历的。
假设源点为1,从1出发访问1的邻接点2、3,从2出发访问4,从3出发访问5,从4出发访问6,访问完毕。访问路径如下图所示。
广度优先遍历的秘籍:先被访问的节点,其邻接点先被访问。
根据广度优先遍历的秘籍,先来先服务,这可以借助于队列实现。
因为对每个节点只访问一次,所以可以设置一个辅助数组visited[i]=false,表示第i 个节点未被访问;visited[ i ]=true,表示第i 个节点已被访问。
【算法步骤】
① 初始化所有节点均未被访问,并初始化一个空队列。
② 从图中的某个节点v 出发,访问v 并标记其已被访问,将v入队。
③ 如果队列非空,则继续执行,否则算法结束。
④ 将队头元素v 出队,依次访问v 的所有未被访问的邻接点,标记已被访问并入队。转向步骤3。
【完美图解】
例如,一个有向图如下图所示
广度优先遍历:
① 初始化所有节点均未被访问,visited[i ]=false,i =1,2,…,6。并初始化一个空队列Q 。
② 从节点1出发,标记其已被访问,visited[1]=true,将节点1入队。
③ 将队头元素1出队,依次访问1的所有未被访问的邻接点2、3,标记其已被访问并将其入队。
④ 将队头元素2出队,将2的未被访问的邻接点4标记为已被访问,并将其入队。
⑤ 将队头元素3出队,3的邻接点2已被访问,将未被访问的邻接点5标记为已被访问,并将其入队。
⑥ 将队头元素4出队,4的邻接点3已被访问,将未被访问的邻接点6标记为已被访问,并将其入队。
⑦ 将队头元素5出队,5的邻接点4、6均已被访问,没有未被访问的邻接点。
⑧ 将队头元素6出队,6没有邻接点。
⑨ 队列为空,算法结束。广度优先遍历序列为1 2 3 4 5 6。
广度优先遍历经过的节点及边,被称为广度优先生成树。如果广度优先遍历非连通图,则每一个连通分量都会产生一棵广度优先生成树。
【算法实现】
① 基于邻接矩阵的广度优先遍历。
void BFS_AM(AMGragh G , int v){ //基于邻接矩阵的广度优先遍历 int u , w; queue<int>Q; //创建一个普通队列(先进先出)存放int 类型 cout << G.
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
class Solution {
public int removeDuplicates(int[] nums) {
int length=1;
for(int i=1;i<nums.length;i++){
if(nums[i-1]!=nums[i]){
nums[length]=nums[i];
length++;
}
}
return length;
}
}
作品介绍 1.网页作品简介方面 :HTML网站模板。主要有:首页 家乡简介 风景名胜 特色美食 站长介绍 在线调查 等总共 6 个页面html下载。
2.网页作品编辑:此作品为学生个人主页网页设计题材,代码为简单学生水平 html+css 布局制作,作品下载后可使用任意HTML编辑软件(如:DW、HBuilder、NotePAD 、Vscode 、Sublime 、Webstorm、 Notepad++ 等任意HTML软件编辑修改网页)。
3.网页作品技术:Div+CSS、鼠标滑过特效、Table、导航栏效果、表单、二级三级页面等,视频、 音频元素 、Flash,基本期末作业所需的知识点全覆盖。
文章目录 一、设计说明
1.LOGO、导航栏、页尾
2.首页
3.家乡简介
4.风景名胜
5.特色美食
6.站长介绍
7.在线调查
二、作品演示
三、代码目录
四、代码演示
一、设计说明 1.LOGO、导航栏、页尾 logo由一张图片组成;导航栏是由列表,超链接组成,划过每个列表块是都会有颜色变化和底部边框的变化;页尾是由段落文字和一个图像构成,图像作为一个标志在右下角。
2.首页 主体部分:首页的主体分为上下两部分,下面在分为左右两部分。上面的部分的div为一个轮播图;下面左部分的div为一个新闻,这个部分由一张图片和一个段落文字链接组成,下右方的div又分为上下两个div,上方为一个简短的家乡介绍段落,下方为一个风景图片滚动介绍。
3.家乡简介 主体部分:左右两个部分。左边为一个简介目录的一个div,该部分的每一个标题对应的是右边简介的内容位置;右边的最上方放置了一个家乡宣传视频,下方是家乡的内容介绍用段落加图片的方式展现,可以从左边的目录直接找到相应位置。
4.风景名胜 主体部分:在一个大的div中设置了一个一列多行的表格,每个表格中都是一个风景的介绍,每个风景介绍都由一个照片、一段文字介绍和一个超链接来链接每个风景点的介绍。
5.特色美食 主体内容:分为上下两个部分,上部分中又分为左中右三个部分,下方为四个相等的div块。上方中左边的div块中为一个美食的轮播图,中间部分为一个整体的美食简介,由一个照片和一个段落文字链接组成,点击文字信息会链接到一个美食的链接;右边为一个美食排行榜的列表。下边的为四个美食的介绍,分别有一个照片和一段文字链接组成,每个链接为一个美食简介。
6.站长介绍 主体内容:分为左右两个部分组成。左边是一个一列两行表格,上边的表格内容设置了一个个性签名,还有一个时钟显示;下边为一个信息栏。右边是一个自我介绍内容,内容用列表来显现,边框设置阴影更有立体感。
7.在线调查 主体内容:一个div块中用表单来设置问题的输入,其中有单选,复选,多行文本输入。
在最下方还有两个按钮,提交和重置。
二、作品演示 首页
家乡简介
名胜风景
特色美食
站长简介
在线调查
三、代码目录 四、代码演示 首页
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="
1 - 概述 所有的集合类和集合接口都在java.util包下。
在内存中申请一块空间用来存储数据,在Java中集合就是替换掉定长的数组的一种引用数据类型。
2 - 集合与数组的区别 长度区别
数组长度固定,定义长了造成内存空间的浪费,定义短了不够用。
集合大小可以变,用多少空间拿多少空间。
内容区别
数组可以存储基本数据类型和引用数据类型
集合中能存储引用数据类型(存储的为对象的内存地址)
list.add(100);//为自动装箱,100为Integer包装的
元素区别
数组中只能存储同一种类型成员
集合中可以存储不同类型数据(一般情况下也只存储同一种类型的数据)
集合结构
在java中每一个不同的集合,底层会对应不同的数据结构。往不同的集合中
存储元素,等于将数据放到了不同的数据结构当中。什么是数据结构?数据存储的
结构就是数据结构。不同的数据结构,数据存储方式不同。
单列集合 Collection
List可以重复:ArrayList/LinkedList
Set不可重复:HashSet/TreeSet
(大量文字插入会导致图片不清,所以在此进行更详细的描述)
List特点:此处顺序并不是大小顺序,而是存入数据的先后顺序。有序因为List集合都有下标,下标从0开始,以递增。
Set特点:取出顺序不一定为存入顺序,另外Set集合没有下标。
ArrayList是非线程安全的。
HashSet集合在new的时候,底层实际上new了一个HashMap集合。向HashSet集合中存储元素,实际上是存储到了HashMap的key中了。HashMap集合是一个Hash表数据结构。
SortedSet集合存储元素的特点:由于继承了Set集合,所以他的特点也是无序不可重复,但是放在SortedSet集合中的元素可以自动排序。放到该集合中的元素是自动按照大小顺序排序的。
TreeSet集合底层实际上是TreeMap。TreeSet集合在new的时候,底层实际上new了一个TreeMap集合。向TreeSet集合中存储元素,实际上是存储到了TreeMap的key中了。TreeMap集合是一个二叉树数据结构。
双列集合Map:HashMap/TreeMap
粗体是接口 斜体是实现类
3 - Collection集合 3.1 - 概述 单列集合的顶层接口,既然是接口就不能直接使用,需要通过实现类!~
3.2 - Collection集合的的常用方法 方法名说明boolean add(E e)添加元素到集合的末尾(追加)boolean remove(Object o)删除指定的元素,成功则返回true(底层调用equles)void clear()清空集合boolean contains(Object o)判断元素在集合中是否存在,存在则返回true(底层调用equles)boolean isEmpty()判断集合是否为空,空则返回trueint size()返回集合中元素个数 import java.util.ArrayList; import java.util.Collection; /** * @author Mr.乐 * @Description */ public class Collection_01 { public static void main(String[] args) { //父类的引用指向子类的对象,形成多态 Collection<String> con = new ArrayList<>(); //追加的方式添加元素 con.
一、图示展示: (1)先序遍历 先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果
先序遍历结果为:A B D H I E J C F K G
动画演示:
记住小人沿着外围跑一圈(直到跑回根节点),多看几次动图便能理解
2)中序遍历 中序遍历可以看成,二叉树每个节点,垂直方向投影下来(可以理解为每个节点从最左边开始垂直掉到地上),然后从左往右数,得出的结果便是中序遍历的结果
中遍历结果为:H D I B E J A F K C G
3)后序遍历
后序遍历就像是剪葡萄,我们要把一串葡萄剪成一颗一颗的。
还记得我上面提到先序遍历绕圈的路线么?(不记得翻上面理解)
就是围着树的外围绕一圈,如果发现一剪刀就能剪下的葡萄(必须是一颗葡萄)(也就是葡萄要一个一个掉下来,不能一口气掉超过1个这样),就把它剪下来,组成的就是后序遍历了。
后序遍历中,根节点默认最后面
后序遍历结果:H I D J E B K F G C A
(4)层次遍历 层次遍历很好理解,就是从根节点开始,一层一层,从上到下,每层从左到右,依次写值就可以了
层次遍历结果:A B C D E F G H I J K
解释外圈跑的意思:
绕着外围跑一整圈的真正含义是:遍历所有结点时,都先往左孩子走,再往右孩子走。
(5)口诀 先序遍历: 先根 再左 再右
中序遍历: 先左 再根 再右