在 Flink SQL 中,LATERAL TABLE 是一种用于处理依赖于外部表达式的表值函数(Table-valued Function,简称 TVF)的语法。LATERAL TABLE 用于在查询中扩展表,并将表值函数的结果与查询的其余部分进行连接(LATERAL TABLE 可以用于将表值函数的结果作为新的列添加到原始表中。)
这是通过在查询的 FROM 子句中使用 LATERAL TABLE 关键字来实现的
SELECT t.name, f.address FROM myTable AS t, LATERAL TABLE(myFunction(t.id)) AS f(address) myTable 是原始表,它包含了一个名为 id 的列和一个名为 name 的列。myFunction 是一个表值函数,它接受 id 作为参数,并返回一个包含地址信息的表。
通过使用 LATERAL TABLE,我们可以将 myFunction 的结果作为新的列 address 添加到查询结果中;
疑问:
使用lateral table和直接使用join有什么区别吗
使用LATERAL TABLE可以在查询中实现更复杂的逻辑,可以在SELECT子句中使用LATERAL TABLE关键字并调用表值函数,来查询所需要的列,得到的结果是:原表select查询的数据+LATERAL TABLE查询结果返回的数据,更加灵活;
比如说在flink table api中维表关联 我们可以使用LATERAL TABLE把对应维表数据再Hbase中拼接,再关联原表返回结果数据;
Ai绘画有一个很现实的问题,要保证每次画出的都是同一个人物的话,很费劲。
Midjourney就不必说了,人物的高度一致性一直得不到很好的解决。而在Stable Diffusion(SD)中,常用办法是通过同一个Seed值(种子值),或者通过训练同一个人物的高质量Lora去控制。
Seed值控制虽然可大体达到目的,但是画出的人物姿态也高度趋同,而且稍微改变描述就会画出另外一个人来,而训练「高质量」模型则更费时费力。
直到最近SD的Controlnet插件推出了Reference only功能,这个问题才得到较好的改善。
一张稳定的人脸,配合不同的场景和动作,意味着角色人设可以得到继承和发挥。如应用到连贯的绘画场景中,例如漫画、虚拟角色设计等领域,意味着提高产能的可行性。
先看看效果。下面是SD画出的一张动漫人物参考图。
我们通过Reference Only功能,基于参考图去生成新的图片,大致效果如下(点击可看大图):
可以看到,在改变了姿势、场景、构图之后,人物的脸部特征,包括发型,仍然得到很好的保留,维持了高度统一的形象。
同时也留意到,人物服装只是部分相同。这个时候,如果要保持一致性,应该通过更详细的Tag描述去控制,具体指定服装的颜色、样式和风格等。
换个「真人」图看看。下图是SD画的参考图:
修改描述词后,通过Reference Only生成新的图片例:
可以看到,“真人”效果和动漫人物效果结论相近,而且即使变换底模(大模型),人物脸部仍然可以得到很好的继承。
需要指出的是,在测试过程中发现:
1.并不是所有底模,都可以跟Reference only契合得很好,个别模型在成像过程中,有时候会出现色彩走样。
2.一些底模结合Reference only绘图时,并不总是支持多动作、多场景、多视角变换,个别场景很难被画出,例如,要把背景换成“大海”,即使“大海”的权重再高,也是无法实现,不知是何原因。
无论如何,Reference only可免去训练高质量模型即可保持人物一致,算是一个较大进步,如果下个版本可以解决上述2个问题,相信可以更好地赋能内容生产领域。
Reference only目前一共有3个预处理器可用,分别为:
Reference only:绘制与参考图类似的风格和脸部;
Reference adain:自适应规范,会更偏向于使用的模型,结果可能偏离参考图;
Reference adain+attn:结合了上述两种。
具体的安装使用方法如下:
确保你的controlnet版本为最新(如果你用的是整合包,很可能包含了最新版,或者可一键更新),地址如下(需科学上网): https://github.com/lllyasviel/ControlNet-v1-1-nightly
如无法下载,请看文末扫描获取插件安装包
2.建议在SD中生成参考图,并将参考图上传到Controlnet的图片作业区域,如下图界面:
3.勾选启用Controlnet,选择Reference only三个预处理器中的一个,并将Style Fidelity值设置为1,如下:
4.基于参考图的描述词生成图片即可,如需变换场景或细节例如发型等,可在正面提示词中调整,不会影响人脸继承。
写在最后 感兴趣的小伙伴,赠送全套AIGC学习资料,包含AI绘画、AI人工智能等前沿科技教程和软件工具,具体看这里。
AIGC技术的未来发展前景广阔,随着人工智能技术的不断发展,AIGC技术也将不断提高。未来,AIGC技术将在游戏和计算领域得到更广泛的应用,使游戏和计算系统具有更高效、更智能、更灵活的特性。同时,AIGC技术也将与人工智能技术紧密结合,在更多的领域得到广泛应用,对程序员来说影响至关重要。未来,AIGC技术将继续得到提高,同时也将与人工智能技术紧密结合,在更多的领域得到广泛应用。
一、AIGC所有方向的学习路线
AIGC所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、AIGC必备工具
工具都帮大家整理好了,安装就可直接上手!
三、最新AIGC学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、AIGC视频教程合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
若有侵权,请联系删除
Python 语音识别系列-实战学习-语音识别特征提取 前言1.预加重、分帧和加窗2.提取特征3.可视化特征4.总结 前言 语音识别特征提取是语音处理中的一个重要环节,其主要任务是将连续的时域语音信号转换为连续的特征向量,以便于后续的语音识别和语音处理任务。在特征提取阶段,这些特征向量能够捕捉到语音信号中的关键信息,如音调、音色和音节等。
特征提取主要可以分为以下几个方面:
时域特征提取:包括自相关函数、方差、峰值等。频域特征提取:如傅里叶变换、快速傅里叶变换、波束傅里叶变换等。时频域特征提取:包括短时傅里叶变换、波形分解、时频图等。高级特征提取:涉及语言模型、语音模型、语音合成等。 在具体实践中,语音特征提取的方法和技术,如:
梅尔频率倒谱系数 (MFCC):这是最常用的特征提取方法之一。它通过将音频信号的频率变换为梅尔尺度,来模拟人类耳朵的听觉特性。滤波器组的Fbank特征(Filter bank)/MFSC:Fbank特征的提取方式相当于MFCC去掉最后一步的离散余弦变换。与MFCC特征相比,Fbank特征保留了更多的原始语音数据。线性预测分析(LPC):假设系统的传递函数与全极点的数字滤波器相似,通过计算语音信号的采样值和线性预测的采样值,并最小化两者之间的均方误差(MSE),从而得到LPC特征。感知线性预测系数(PLP):这是一种基于听觉模型的特征参数,等效于LPC特征,但它是基于人耳听觉的,通过计算应用到频谱分析中,将输入语音信号经过人耳听觉模型处理,有利于抗噪声语音特征的提取。 这些特征通常会被用于构建机器学习模型,如隐马尔可夫模型 (HMM)、深度神经网络 (DNN) 等,以进行更精准的语音识别。在实际应用中,可能会结合多种特征提取技术来优化识别效果。
在进行语音识别的特征处理前,对原始音频数据进行一系列预处理步骤是非常重要的,这些步骤有助于提高最终识别系统的准确性和鲁棒性。以下是一些在特征提取之前常见的音频预处理技术:
预加重: 预加重是一个高通滤波过程,用于放大高频成分。这有助于平衡音频信号中由于声带和嘴唇效应造成的频率衰减。分帧和加窗: 由于语音信号是非平稳的,通过将长的音频信号分割成短时帧,可以近似地认为每个短时帧是平稳的。每帧通常包括20到40毫秒的音频。为了减少相邻帧之间的边界效应,会对每帧使用窗函数(如汉明窗或汉宁窗)。去噪: 去噪旨在减少背景噪声,提高语音信号的清晰度。常用的方法包括频谱减法、Wiener滤波器、深度学习方法等。对于实时或近实时的应用,非因果性去噪方法(如使用预先录制的噪声模型)可能更为有效。归一化: 音频信号的归一化(如均值归零和方差归一化)有助于减少不同录音条件下的变异,使特征提取更加稳定。 1.预加重、分帧和加窗 import numpy as np import librosa def pre_emphasis(signal, alpha=0.97): """ 对给定的音频信号应用预加重。 预加重可以增强信号的高频部分,常用于语音处理中。 参数: - signal: 原始音频信号数组 - alpha: 预加重系数,通常介于0.95到0.97之间 返回: - 预加重后的音频信号 """ return np.append(signal[0], signal[1:] - alpha * signal[:-1]) def frame_signal(signal, frame_size, hop_size, sample_rate): """ 将音频信号分割成多个帧。 参数: - signal: 预加重后的音频信号 - frame_size: 帧大小,以秒为单位 - hop_size: 帧之间的跳跃大小,以秒为单位 - sample_rate: 音频的采样率 返回: - 分帧后的音频数据 "
最近公众号有粉丝留言说想找一款数据大屏组件,这篇文章推荐的这款还不错, Vue / React 都可以用。
DataV 是一款基于 Vue 开发的数据可视化组件库,主要用于开发大屏数据展示页面,(即数据可视化),内置了多种类型组件,让开发者可以轻松构建出专业酷炫、视觉丰富的数据大屏界面。
需要注意的是,阿里云也有一款叫 DataV 的用于大屏数据展示的付费数据化产品,输入表格数据可以得到大屏数据面板。但今天介绍的 DataV 是一个前端开发组件,两者虽然效果类似,但性质不一样。
开箱即用,快速构建数据大屏,开发效率很高;内置了很多用来提升页面视觉效果的 SVG 边框和装饰,逼格满满;基于 Charts 封装了各式各样的图表,应有尽有;基于 Vue 2 开发,目前已提供 Vue 3 和 React 版本。 所谓数据大屏,就像名称一样,就是一块很大的屏幕,上面全是图表和数据,把一些关键数据集中展示在一块巨大的 LED 屏幕上,其实就是巨大化的 Dashboard,科技感(逼格)十足,深受甲方爸爸和老板们的喜爱,一般在交易大厅,展览中心,管控中心,老板办公室等地方可以看到。
作为前端开发者,要手动撸这样的大屏,工作量大不说,没有 UI 的协助,很难做到富有科技感的视觉效果,DataV 就是一款让我们轻松实现数据大屏的 Vue 组件。
在 Vue 项目中安装和使用 使用 DadaV 很简单,根据官网的开发文档,在 Vue 项目中通过 npm 命令安装:
然后注册为全局组件:
当然也可以按需引入,减少项目打包的体积。
酷炫的边框元素和加载动画 除了数据图表,DadaV 还提供了基于 SVG 的科技感元素,动效优雅,体验极佳,分别是:
增强用户体验的科技感 loading 组件;13款用于图表外部的边框元素,每一款动效和视觉效果都很棒;12款用来点缀数据页面的装饰效果,与边框组件相同,同样用SVG元素绘制的高性能动画。 有了这些元素,相信可以让我们开发的数据大屏更加专业,科技感爆棚。
支持的图表类型 DadaV 的图表组件基于 Charts 封装,使用也很简单,只需要将对应图表 option 数据传入组件即可。目前支持下面 11 种图表:
有了这些内置组件,加上官网提供的详细的代码例子和实时效果,几乎不需要学习什么就可以搭建一个数据大屏了。看看下面几个用 DadaV 构建的几个数据大屏效果吧:
【考试临时抱佛脚】系列文章针对于<学习时间少>、<时间紧迫>、<想短时间提升成绩>的考生打造。无论你是<自考>、<专升本>还是<考研>这个专栏都适合你,Let’s go! 一、方法 解题步骤 第一个元素为【表头】(只剥开一层),去掉表头其余照写为【表尾】
二、考察形式1 1、问题 广义表( ((a,b), (c,d,e)), (f, g), h ) 的表头是 ()
2、解析&回答 解析: 剥开第一个括号后的第一组括号即表头。
答案: ((a,b), (c,d,e))
三、考察形式2 1、问题 广义表((a), (b,c), (d,e, (f, g, h) ) ) 的表尾是 ()
2、解析&回答 解析:
① 去掉一层括号,(a), (b,c), (d,e, (f, g, h) )
② 那么去掉表头(a),剩余的就是表尾:( (b,c), (d,e, ( f, g, h) ) )
③ 特别注意的是:表尾外层还有个括号
答案: ( (b,c), (d,e, (f, g, h) ) )
四、考察形式3 1、问题 广义表((a,b), (c,d), e ) 的表尾是 ()
我是 Llama 的忠实粉丝。 Meta 发布其 LLM 开源代码对整个科技界来说是一项净收益,其宽松的许可证允许大多数中小型企业在几乎没有任何限制的情况下使用其 LLM(当然,在法律范围内)。 他们的最新版本是备受期待的 Llama 3。
Llama 3 有两种大小:80 亿和 700 亿参数。 这种模型经过大量文本数据的训练,可用于各种任务,包括生成文本、翻译语言、编写不同类型的创意内容以及以信息丰富的方式回答你的问题。 Meta 宣称 Llama 3 是最好的开放模型之一,但它仍在开发中。 这是与 Mistral 和 Gemma 相比的 8B 模型基准(根据 Meta)。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
这就引出了一个问题:作为普通人,我如何在我的计算机上本地运行这些模型?
1、开始使用 Ollama 这就是Ollama登场的地方! Ollama 是一款免费的开源应用程序,允许你在自己的计算机上运行各种大型语言模型,包括 Llama 3,即使资源有限。 Ollama 利用了 llama.cpp 的性能提升,llama.cpp 是一个开源库,旨在允许你以相对较低的硬件要求在本地运行 LLM。 它还包括一种包管理器,使你只需一个命令即可快速有效地下载和使用 LLM。
第一步是安装 Ollama。 它支持所有 3 个主要操作系统,其中 Windows 是“预览版”(更好的说法是“测试版”)。
ZooKeeper 搭建详细步骤之三(真集群)
ZooKeeper 搭建详细步骤之二(伪集群模式)
ZooKeeper 搭建详细步骤之一(单机模式)
ZooKeeper 及相关概念简介
搭建模式简述 ZooKeeper 的搭建模式包括单机模式、集群模式和伪集群模式,分别适用于不同的场景和需求,从简单的单节点测试环境到复杂的多节点高可用生产环境。在实际部署时,应根据系统的可用性要求、数据量、并发负载等因素选择合适的部署模式。
ZooKeeper 的搭建模式主要包括以下三种:
单机模式(Standalone Mode):
在单机模式下,ZooKeeper 仅在一个单独的服务器节点上运行。这种模式主要用于开发测试环境,便于快速部署和调试。由于只有一个节点,没有数据冗余和故障转移机制,因此不具备高可用性。单节点故障会导致整个服务不可用,不适用于生产环境。
集群模式(Cluster Mode / Distributed Mode):
集群模式是 ZooKeeper 在生产环境中推荐使用的部署模式。它由多个(通常为奇数个,如 3、5、7 等)独立的服务器节点组成一个 ZooKeeper 集群。每个节点既是服务提供者又是服务消费者,它们之间通过心跳机制保持通信,并通过 ZAB(ZooKeeper Atomic Broadcast)协议实现数据的复制、同步和一致性保证。集群模式提供了高可用性、容错性和可扩展性,即使部分节点发生故障,只要集群中存活节点的数量大于等于半数(即形成“多数派”),ZooKeeper 集群就能继续对外提供服务。
伪集群模式(Pseudo-Distributed Mode / Local Cluster Mode):
伪集群模式是在单台物理或虚拟机上模拟多节点集群的部署方式。在同一台机器上启动多个 ZooKeeper 服务实例,每个实例配置不同的端口、数据目录和身份标识(如服务器ID)。尽管所有节点实际上运行在同一台机器上,但从逻辑上看,它们形成了一个小型的 ZooKeeper 集群,能够模拟集群模式的行为,包括数据复制、节点选举等。伪集群模式常用于本地开发和测试环境,便于在单机上模拟多节点集群环境,验证分布式协调逻辑。
Zookeeper 下载 官网: Apache ZooKeeper官网 ,选择最新稳定版本进行下载
在国内,从官网的下载速度较慢,也可以选择国内镜像站下载,比如阿里镜像站:
阿里镜像: https://mirrors.aliyun.com/apache/zookeeper/
单机模式搭建 ZooKeeper单机模式是指在一台服务器上独立运行一个ZooKeeper服务节点,用于满足小型项目或测试环境中的协调服务需求。
搭建步骤概述 以下是 ZooKeeper 单机模式的详细安装和配置步骤:
下载 ZooKeeper: 下载文件一般为一个.tar.gz或.zip格式的压缩包,例如 apache-zookeeper-<version>-bin.tar.gz。 保存至 linux 的 /opt/ 目录下。 解压文件:
🏆作者:科技、互联网行业优质创作者
🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造
🏆欢迎关注我(Net数字智慧化基地),里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你快速成长。升职+涨薪!!
(提示:最新版已解决部署为“服务”时报错的问题,关键配置文件要放对位置) RabbitMQ作为一款主流的消息队列工具早已广受欢迎。相比于其它的MQ工具,RabbitMQ支持的语言更多、功能更完善。
1.发送消息、获取消息、使用消息 本文提供一种市面上最/极简单的使用RabbitMQ的方式,只需要会调用以下三个方法,你就几乎可以掌握整个RabbitMQ的使用:
(1) SendMessage,发送一个消息
(2) GetMessage,获取一个消息
(3) UseMessage,使用一个消息(连续使用)
为了调用以上三个方法,首先需要从NuGet引用DeveloperSharp.RabbitMQ包。
然后,对RabbitMQ消息服务器的链接信息进行配置(分.Net Core与.Net Framework两种情况):
若是在.Net Core环境下,你则需要在DeveloperSharp.json文件中添加“DeveloperSharp.RabbitMQ”节点(如下配置示例),并把DeveloperSharp.json文件放到程序执行目录中(即bin目录下与dll、exe等文件的同一目录中,放错了位置会报错)(注意:有些.Net Core版本在Visual Studio“调试”时,不会在bin目录下生成全部的dll、exe,此时需要把此配置文件放在应用程序的“根目录”下)。
{ "DeveloperSharp.RabbitMQ":[{ "HostName":"135.208.12.236", "VirtualHost":"/", "UserName":"sa", "Password":"aevin.gang", "Port":5672 }] } 若是在.Net Framework环境下,你则需要在App.config/Web.config里面添加如下配置:
<appSettings> <add key="RabbitMQConnectionString" value="hostName=135.208.12.236,virtualHost=/,port=5672,userName=sa,password=aevin.gang" /> </appSettings> 说明:上述配置中分别设置了RabbitMQ应用所在的服务器IP地址hostName、虚拟主机virtualHost、端口port、用户名userName、密码password(请把这五项的对应值修改成你自己那边的RabbitMQ的对应值)
下面,我们给出一个使用了上述SendMessage、GetMessage、UseMessage三个方法的示例。该示例的功能说明如下:
先向RabbitMQ服务器上名为“aa”的队列发送了5个消息,然后从RabbitMQ服务器上的“aa”队列中获取,并打印出第1个消息,最后再连续从RabbitMQ服务器上的“aa”队列中获取剩余4个消息,并把它们写入名为fj.txt的文件。 代码如下:
using DeveloperSharp.RabbitMQ; -------------------------- static void Main(string[] args) { //发送5个消息(使用SendMessage) RabbitMQHelper.SendMessage("aa", "世界1,你好!"); RabbitMQHelper.SendMessage("aa", "世界2,你好!"); RabbitMQHelper.SendMessage("aa", "世界3,你好!"); RabbitMQHelper.SendMessage("aa", "世界4,你好!"); RabbitMQHelper.SendMessage("aa", "世界5,你好!"); //获取1个消息(使用GetMessage) string OneMessage = RabbitMQHelper.GetMessage("aa").Message; Console.WriteLine(OneMessage); //向fj.txt这个文本文件中写入4个消息(使用UseMessage) RabbitMQHelper.UseMessage("aa", t => { System.
目录
前言
一、基础数据介绍
1、 数据格式
2、数据参数
二、空间数据库设计
1、主体表模型
2、DDL语句与空间索引
三、GDAL解析及入库
1、GDAL中GeoJSON驱动
2、解析GeoJSON
3、Java模型
4、数据入库
总结
前言 在面向空间的矢量数据处理过程当中,虽然shapefile等文件是常用矢量文件的载体。也是大多数应用用来支持矢量文件存储的对象。其实除了shagefile这种格式,还有很多种格式。今天介绍一种在webgis比较常见的数据格式,它就是GeoJSON。
GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法(JavaScript Object Notation, 简称JSON)的地理空间信息数据交换格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面这几种几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。
一个完整的GeoJSON数据结构总是一个(JSON术语里的)对象。在GeoJSON里,对象由名/值对--也称作成员的集合组成。对每个成员来说,名字总是字符串。成员的值要么是字符串、数字、对象、数组,要么是下面文本常量中的一个:"true","false"和"null"。数组的值是上面所说的元素组成。
GeoJSON的格式
GeoJSON总是由一个单独的对象组成。这个对象(指的是下面的GeoJSON对象)表示几何、特征或者特征集合。
GeoJSON对象可能有任何数目成员(名/值对)。
GeoJSON对象必须有一个名字为"type"的成员。这个成员的值是由GeoJSON对象的类型所确定的字符串。
type成员的值必须是下面之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", 或者 "FeatureCollection"。这些值分别对应:点、多点、线、多线、面、多面、几何集合、特征、特征集合。
GeoJSON对象可能有一个可选的"crs"成员,它的值必须是一个坐标参考系统的对象。
GeoJSON对象可能有一个"bbox"成员,它的值必须是边界框数组。
{ "type": "FeatureCollection", "features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [102.0, 0.5] }, "properties": { "prop0": "value0" } }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [[102.0, 0.0], [103.
问题如下
找到自己安装的python位置一般在C:\Users\24585\AppData\Local\Programs\Python
打开虚拟环境的pyvenv.cfg文件
修改以下几处位置改为自己安装的python位置C:\Users\24585\AppData\Local\Programs\Python\Python39
保存打开pycharm找到虚拟环境路径的python.exe文件点ok
再点ok
删掉之前错误的留下新增的
再点ok就发现没有报错了
双指针 1.有效三角形的个数2.和为S的两个数字3. 三数之和4.四数之和 点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃
1.有效三角形的个数 题目链接:633.有效三角形的个数
题目描述:
一般三角形我们判断方法是任意两边之和大于第三边
算法原理:
解法一: 暴力求解
选三个数进行判断,一般我们一定会想到三层for循环进行判断,下面是伪代码,时间复杂度O(N^3)
解法二:利用单调性,使用双指针算法来解决问题
任意两边之和大于第三边,三个数需要判断三次
a+b>c
a+c>b
b+c>a
现在a、b、c三个数,先对它们进行排序,a<=b<=c;
a+b>c
a+c>b
b+c>a
我们只需要判断一次 a+b>c就也把下面两次判断包括了。因为c是最大的!
注意这只是固定了10一次循环,还要在从后往前固定
先固定最大的数在最大数的左区间内,使用双指针算法,快速统计符合要求的三元组个数 class Solution { public: int triangleNumber(vector<int>& nums) { //1.优化 sort(nums.begin(),nums.end()); //2.利用双指针快速解决问题 int sum=0; for(int i=nums.size()-1;i>=2;--i)//先固定最大数 { //利用双指针快速统计符合要求的三元组个数 int left=0,right=i-1; while(left<right) { if(nums[left]+nums[right]>nums[i]) { sum+=(right-left); --right; } else { ++left; } } } return sum; } }; 总结:有些题可以进行排序或者已经排好了序,然后利用单调性,使用双指针算法解决问题,双指针一个指向最小值,一个指向最大值,然后根据题意利用单调性一次排除一批。
2.和为S的两个数字 题目链接:JZ57 和为S的两个数字
题目描述:
算法原理:
解法一:暴力枚举求解O(N^2)
心理健康测评目录
目录
基于SprinBoot+vue的大学生心理健康测评管理系统
一、前言
二、系统设计
三、系统功能设计 1用户信息管理
5.2 心理健康管理
5.3公告信息管理
5.1论坛信息管理
四、数据库设计
五、核心代码 六、论文参考
七、最新计算机毕设选题推荐
八、源码获取:
博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️
主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。
🍅文末获取源码联系🍅
基于SprinBoot+vue的大学生心理健康测评管理系统 一、前言 大学生心理健康测评管理系统使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理大学生心理健康测评管理系统信息,查看大学生心理健康测评管理系统信息,管理大学生心理健康测评管理系统。
总之,大学生心理健康测评管理系统集中管理信息,有着保密性强,效率高,存储空间大,成本低等诸多优点。它可以降低信息管理成本,实现信息管理计算机化。
关键词:大学生心理健康测评管理系统;Java语言;Mysql
二、系统设计 系统功能结构如图
三、系统功能设计 1用户信息管理 如图5.1显示的就是用户信息管理页面,此页面提供给管理员的功能有:用户信息的查询管理,可以删除用户信息、修改用户信息、新增用户信息,
还进行了对用户名称的模糊查询的条件
图5.1 用户信息管理页面
2 心理健康管理 如图5.2显示的就是心理健康管理页面,此页面提供给管理员的功能有:查看已发布的心理健康数据,修改心理健康,心理健康作废,即可删除,还进行了对心理健康名称的模糊查询 心理健康信息的类型查询等等一些条件。
图5.2 心理健康管理页面
3公告信息管理 如图5.3显示的就是公告信息管理页面,此页面提供给管理员的功能有:根据公告信息进行条件查询,还可以对公告信息进行新增、修改、查询操作等等。
图5.3 公告信息管理页面
4论坛信息管理 如图5.4显示的就是论坛信息管理页面,此页面提供给管理员的功能有:根据论坛信息进行新增、修改、查询操作等等。
图5.4 论坛信息管理页面
四、数据库设计 (1)下图是心理健康留言实体和其具备的属性。
心理健康留言实体属性图
(2)下图是用户实体和其具备的属性。
用户实体属性图
(3)下图是咨询师实体和其具备的属性。
咨询师实体属性图
(4)下图是考试记录表实体和其具备的属性。
考试记录表实体属性图
数据库表的设计,如下表:
表4.1字典表表
序号
列名
数据类型
说明
允许空
1
Id
Int
id
否
2
dic_code
面试题一:Redis为什么执行这么快? Redis运行比较快主要原因有以下几种:
纯内存操作:Redis将所有数据存储在内存中,这意味着对数据的读写操作直接在内存中运行,而内存的访问速度远远高于磁盘。这种设计使得Redis能够已接近硬件极限的速度处理数据读写单线程模型:Redis使用单线程模型来处理客户端请求。这可能听起来效率不高,但是实际上,这种设计避免了多线程频繁切换和过度竞争带来的性能开销。Redis每个请求的执行时间都是很短的,因此单线程下,也能处理大量的并发请求I/O多路复用:Redis使用了I/O多路复用技术,可以在单线程的环境下同时监听多个客户端连接,只有当有网络事件(如用户发送一个请求)发生的时候才会进行实际的I/O操作。这样有效的利用了CPU资源,减少了无谓的等待高效数据结构:Redis提供了多种高效的数据结构,如哈希表、有序集合等。这些数据结构的实现都经过了优化,使得Redis在处理这些数据结构的操作是非常高效的 面试题二:Redis是单线程执行还是多线程执行?它有线程安全问题吗?为什么吗? Redis版本在6.0之前都是使用的单线程运行的。所有的客户端的请求处理、命令执行以及数据读写操作都是在一个主线程中完成得。这种设计目的就是为了防止多线程环境下的锁竞争和上下文切换所带来的性能开销,这样保证在高并发场景下的性能
Redis版本在6.0中,开始引入了多线程的支持,但是这仅限于网络I/O层面,即在网络请求阶段使用工作线程进行处理,对于指令的执行过程,仍然是在主线程来处理,所以不会存在多个线程通知执行操作指令的情况
关于线程安全问题,从Redis服务层面俩看,Redis Server本身就是一个线程安全按的K-V数据库,也就是说在Redis Server上面执行的指令,不需要任何同步机制,不会存在线程安全问题
面试题三:在实际工作中,使用Redis实现了哪些业务场景? Redis在实际工作中广泛应用于多种业务场景,以下是一些常见的例子:
缓存:Redis作为Key-Value形态的内存数据库,最先会被想到的应用场景就是作为数据缓存。Redis提供了键过期功能,也提供了键淘汰策略,所以Redis用在缓存的场合非常多
排行榜:很多网站都有排行榜应用,如京东的月度销量榜单、商品按时间上新排行榜等。Redis提供的有序集合(zset)数据类
分布式会话:在集群模式下,一般会搭建以Redis等内存等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理
分布式锁:在高并发的情景,可以利用Redis的setnx功能来编写分布式锁
面试题四:Redis常用数据类型有哪些? Redis中,常见的数据类型有如下几种:
字符串(String):最简单的数据类型,可以包含任意数据,如文本、二进制数据等。常见的使用场景是存储Session信息、存储缓存信息、存储整数信息,可以使用incr实现整数+1,使用decr实现整数-1列表(List):有序的字符串元素集合,支持双端进行插入和删除操作,可以用作队列或栈哈希(Hash):用于存储对象,类似于关联数组。每个哈希可以包含字段和与之相关联的值。常见使用场景是存储Session信息、存储商品的购物车,购物车非常适用于哈希字典表示,使用人员唯一编号作为字典的key,value值可以存储商品的id和数量等信息、存储详情页等信息集合(Set):一个无序并唯一的键值集合。它常见的使用场景是是仙女关注功能,比如关注我的人和我关注的人,使用集合存储,可以保证人员不重复有序集合(Sorted Set):使用zset表示,相当于Set集合类型多了一个排序属性score(分值)。。它常见的使用场景是可以用来存储排名信息,关注列表功能,这样就可以根据关注实现排序展示 面试题五:存储Session信息你会使用哪种数据类型?为什么? 在实际工作中,小型的项目会使用Redis存储Session信息,但是不同业务场景存储Session信息的类型也是不同的,具体来说:
存储数据简单(不涉及局部更新):使用String类型粗怒触Session,这样做的优缺点如下:
优点:
存取操作简单直观,只需要单个键执行操作即可
多余小型Session,存储开销相对于较小
缺点:
如果Session数据复杂或者需要频繁更新其中的部分字段,则每次更新都需要重新序列化整个Session对象
不利于查询Session内特定字段值
存储数据复杂(涉及局部更新):如果Session数据结构复杂且需要频繁更新或查询其中个别字段,通常建议使用哈希表存储Session。每个Session视为一个独立的哈希表,Session ID作为key,Sesion内各个字段作为field-value对存储在哈希表中。示例:HSET session:123 userId 123 username user1,这样做的优缺点如下:
优点:
可以方便地进行字段级别的读写操作,例如 HGET session:23 userd 和 HSET session:123 lastAccessTime now
更新部分字段时无需修改整个Session内容
缺点:
相对于简单的字符串存储,哈希表占用的空间可能更大,尤其时当Session数据包含多个值的时候
小结: 如果 Session 数据结构复杂且需要频繁更新或查询其中的个别字段,通常建议使用哈希表来存储 Session;而在 Session 数据较为简单、不涉及局部更新的情况下,使用字符串存储也是可行的选择
面试题六:有序集合底层是如何实现的? 在Redis7之前,有序集合使用的是ziplist(压缩列表)+skiplist(跳跃表),当数据列表元素小于128个,并且所有元素成员的长度都小于64字节时,使用压缩列表存储,否则使用调表存储
在Redis之后,有序集合使用listPack(紧凑列表)+skiplist(跳跃表)
面试题七:什么是跳表?为什么使用跳表? skiplist是一种以空间换时间的数据结构。由于链表无法进行二分查找,因此借鉴数据库索引的思想,提取出链表中的关键姐点(索引),现在关键节点上查找,在进入下层链表查找提取多层关键节点,就形成了跳表。但是由于索引要占据一定的空间,所以索引添加的越多,占用的空间越多。
对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高O(N)
从这个例子里,我们看出,加来一层索引之后,查找一个结点需要遍历的结点个数减少了,也就是说查找效率提高了。时间复杂度从原来的O(n)到O(logn),是一空间换时间的解决方法
面试题八:说一下跳表的查询流程? 跳表的查询流程如下:
起始搜索:查询操作从跳表的顶层开始,跳表的顶层包含一个或多个节点,从最顶层的头节点开始,将当前节点设置为头节点检查下一个节点:检查当前节点的下一个节点,如果节点的分值小于目标分值,则向右移动检查下一个节点,重复此步骤,直到找到一个大于目标值的节点,或者最后一个节点逐层探索:如果当前下一个结点的值大于目标值,或者最后一个节点,则将当前指针向下层进行搜索,重复上述步骤终止并返回:在查找的过程中,如果找到了和目标分支相同的值,或者遍历完所有层级仍然未找到对应的节点,则说明要查找的元素不存在于跳表中,则终止查找并返回查询到的内容或NULL值 面试题九:说一下跳表的添加流程?为什么要有“随机层数”这个概念? 跳表的添加流程主要是包括以下步骤:
查找插入位置:首先,我们需要找到新元素应该插入的位置。这个过程与跳表查找操作类似,我们从最高层所以一年开始,逐层向下查找直到找到最后一个位置,使得该位置前面的元素小于新元素,后面的元素大于新元素
生成随机层数:在确定新元素插入位置后,我们需要决定新元素在跳表中的层数。这个层数是通过一个随机函数生成的。每个节点肯定都有第一层指针(每个节点都在第一层链表中)。如果一个节点有第i层指针(即节点已经在第一层到第i层链表中),那么他又第(i+1)层指针的
Matlab 2023 b 的下载与安装教程 Matlab 2023b 的下载与安装教程一、下载二、安装总结 Matlab 2023b 的下载与安装教程 本文旨在提供 Matlab2023b 软件的下载方式和安装教程,根据下文的步骤进行安装即可正常使用,下载快速、安装简单,亲测有效哦。
一、下载 为了摆脱百度网盘的限速问题,本文将软件的压缩包(11.8G)上传到了中国移动云盘,目前该云盘下载速度还行,大家可以试试看。另外,大家下载完后记得检查一下压缩包的大小是不是11.8G,不要下载错了。
// 下载链接 链接:https://caiyun.139.com/m/i?1E5C35qiIpqKB 提取码:bXiu 二、安装 首先,让我们从云盘上把压缩包下载下来,之后再解压得到一个文件夹: 其次,进入解压后的文件夹,可以看到有两个文件夹(Crack、Setup); 这里我们先进入Setup文件夹,然后右键 setup.exe 选择以管理员身份运行。 程序运行起来后进进入了安装界面,这里我们选择 “文件安装密钥”,然后接下来就按照截图中的操作进行安装。 这里要输入文件安装密钥:XXXX(密钥代码在压缩包中txt文档里) 在解压后的文件夹Matlab 2023b文件夹中的【Crack】文件夹,选中license.lic文件,点击“打开”; 这里要记住你的安装路径,后面会用到的,要记住呀。 安装完成后我们再进入 Crack 文件夹里,然后复制 bin 文件夹再粘贴到我们 安装路径 的文件夹里去替换原本的 bin 文件夹。 替换完 bin 文件夹之后,回到桌面就能点击图标打开Matlab进行使用了。 总结 大家按照上述流程安装应该就能正常使用了,若大家有其他疑问欢迎在评论中留言反馈。
使用Vue3,在HBuilder中编译uni-app应用报错:“default” is not exported by “node_modules/@dcloudio/uni-mp-vue/dist/vue.runtime.esm.js”, imported by
原因是在Vue3中,use这个API已经无法使用了:
https://v3-migration.vuejs.org/zh/breaking-changes/global-api.html#%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E8%80%85%E9%A1%BB%E7%9F%A5
可以把import Vue from 'vue'和Vue.use(Vuex)注释掉,然后重新编译就通过了:
引言 在Android应用开发中,Service是一个至关重要的组件,它允许开发者执行后台任务,而无需用户界面。然而,Service的启动方式、生命周期管理以及与其他组件的交互,对于很多开发者来说仍然是一个难点。本文将深入剖析Service的各个方面,从基础概念到高级特性,为你揭开Service的神秘面纱。
主要内容概括 Service概述:介绍Service的基本概念和两种主要形式:启动状态和绑定状态。
Service在清单文件中的声明:解释Service在AndroidManifest.xml中的配置方式。
Service的启动与绑定:详细说明启动服务和绑定服务的实现方式及其区别。
Service生命周期管理:探讨如何有效管理Service的生命周期。
Service与线程的区别:比较Service与线程的不同,以及它们各自的使用场景。
一、Service概述 Service是Android中用于执行后台操作的组件。它可以以启动状态运行,也可以被其他组件绑定以进行交互。启动服务通常用于执行单一任务,而绑定服务则提供了一种客户端-服务器的交互方式。
二、Service在清单文件中的声明 所有Service都需要在AndroidManifest.xml中声明。通过<service>标签,我们可以设置Service的各种属性,如是否可被其他应用调用、运行进程等。以告知Android系统如何处理这个服务。以下是Service在清单文件中声明的一个基本示例,包括启动状态和绑定状态的Service:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ... > <!-- 启动状态的Service 声明 --> <service android:name=".MyStartService" android:enabled="true" android:exported="false" android:process=":remote" android:isolatedProcess="false"> <!-- 可以添加 intent-filter 来允许隐式启动 --> <!-- <intent-filter> --> <!-- <action android:name="com.example.myapp.ACTION_START_SERVICE" /> --> <!-- </intent-filter> --> </service> <!-- 绑定状态的Service 声明 --> <service android:name=".MyBindService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.myapp.MY_BIND_SERVICE" /> </intent-filter> </service> </application> </manifest> 在上面的代码中:
android:name: 指定Service的类名,例如.MyStartService指的是com.example.myapp.MyStartService类。android:enabled: 指定Service是否可以被系统实例化,默认为true。android:exported: 指定Service是否可以被其他应用隐式调用。如果包含intent-filter,默认值为true,否则为false。android:process: 指定Service是否需要在单独的进程中运行。例如,android:process=":remote"表示Service将在单独的进程中运行,进程名称为com.example.myapp:remote。android:isolatedProcess: 设置为true意味着服务会在一个特殊的进程下运行,与系统其他进程分开,并且没有自己的权限。 intent-filter是可选的,它允许隐式启动Service。如果Service不需要隐式启动,可以不包含intent-filter。对于绑定服务,intent-filter是必需的,因为它允许客户端通过Intent绑定到Service。
前⾔ 前段时间⼀位⼤龄程序来公司⾯试,已经是做到技术 leader 的级别,⾯试开始他⽐较⾃豪地向
我们介绍的设计技术架构、缓存设计、业务设计等等,他说该项⽬是他⼀⼿打造起来的。在服
务⾼可⽤⽅⾯,声称可以做到 4 个 9。因为也是 Spring Boot、Spring Cloud 这套⽐较流⾏的东⻄。因为我们也是⽤ Spring Cloud 全家桶,但是有些问题我们还没有解决的,⼀听到对⽅说 4 个 9。顿时来了兴趣,准备膜拜⼀下⼤神怎么解决⾼可⽤问题的。
他说⽤是 Eureka、Ribbon 这套机制实现⾼可⽤,我们问题是 Eureka、Ribbon 怎么实现⾼可
⽤的,有什么弊端。对⽅语塞,开始东拉⻄扯,⼤失所望。可能有些同学不知道,在使⽤ Eureka、Ribbon 时候,由于 Eureka、Ribbon 内部的缓存机 制。会导致服务上线或者下线的时候会出现服务不可⽤的情况,极端情况下会出现 90 秒服务不可能。在没有解决这些问题的前提下,使⽤ Eureka、Ribbon 搭建微服务应⽤是不可能会有 4 个 9 的。
对于这种情况,官⽅也没有给具体的解决⽅案。在没有解决这个问题之前,很多公司也许会跟
我们采取同样的做法,就是在晚上流量⽐较少情况停服发布。但是试下⼀想,每次发布都只能
在 23 点以后发布,关闭 SLB,停机,执⾏ SQL,起服务。⼗⼏个服务,验证功能,⼀顿操作
⼀下,⾄少要搞到两三点。这对于整个开发团队来说都是⼀种负担。
本⽂将分享是如何解决 Eureka、Ribbon 组件使⽤上的弊端。
Eureka 注册,服务发现机制原理 相信熟悉微服务架构的⼈,都知道服务注册与发现的作⽤。在成百上千个微服务中,我们必须
需要⼀个中⼼来通知⽣产者与消费者的服务状态变化,以便我们在微服务架构中理清我们的服
务调⽤关系。
经过微服务架构多年的发展,出现很多种注册中⼼,如 Naco、Eureka、etc、ZooKeeper 等
等,其实⼤体思想都⼀样。在服务启动时候向注册中⼼发送消息告诉注册中⼼我已经 ready,
可以被调⽤了,然后再持续运⾏过程通过⼼跳的⽅式向注册中⼼汇报⾃身的状态。
注册中⼼收到服务注册信息后,向调⽤⽅推送或者调⽤⽅主动拉取需要调⽤的服务的状态信
息。在这个过程中其实并没有很⾼深的理论与思想。注册中⼼与各个服务的交互⽅式⽆⾮就是
⻓连或者短连。
服务注册与续约机制,缓存刷新 在服务环境完全启动完成之后,集成了 eureka-client 的服务会实例化com.netflix.discovery.DiscoveryClient 实例,DiscoveryClient 实例对 Eureka 客户端来说⾄关重要,各种线程池 初始化、服务注册、续约、刷新缓存都在这个对象完成。DiscoveryClient 有个强⼤的构造⽅法,在初始化的构造三个⾄关的重要的线程池
🌈个人主页:努力学编程’
⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解
⚡学好数据结构,刷题刻不容缓:点击一起刷题
🌙心灵鸡汤:总有人要赢,为什么不能是我呢
hello,今天带大家学数据结构的一个非常重要的部分,排序!!!,回想博主的学习路程 ,好像真正学过的排序就是冒泡排序,其实数据结构里面有很多的排序的算法,针对不同的数据,我们往往采用不同的排序算法,合适的排序算法处理数据时可能会大大减少内存的消耗,和较短的运行时间。下面就带大家学习几种常见的排序算法。
🍪插入排序: 🍰直接插入排序: 直接插入排序是一种简单直观的排序算法,将待排序的元素逐个插入到已经排序好的序列中的适当位置,从而得到一个新的、更长的有序序列。具体的实现呢,给大家列出来了:
1.初始状态:假设第一个元素已经是有序的序列。
遍历未排序部分:从第二个元素开始,逐个遍历未排序的元素。
插入操作:对于当前遍历到的元素,将其与已经排序好的序列中的元素依次比较,找到合适的位置插入。
2.移动元素:如果发现当前元素比已排序序列中的某个元素小(或大,取决于排序顺序),则将该元素后移一位,为当前元素腾出插入位置。
插入元素:找到合适的位置后,将当前元素插入到该位置。
重复:重复上述步骤,直到所有元素都被插入到有序序列中。
public static void insertSort(int[] array) { for (int i = 1; i < array.length; i++) { int tmp = array[i]; int j = i-1; for (; j >= 0 ; j--) { if(array[j] > tmp) { array[j+1] = array[j]; }else { array[j+1] = tmp; break; } } array[j+1] = tmp; } } 直接插入排序的特性总结:
演示系统:win10 + Sonoma 14.4.3
限制条件:两台设备需要在同一局域网内,即同一网络环境。
+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——+——
第一步:打开控制面板 -> 找到网络和共享中心 -> 选择更改高级共享设置 -> 分别在专用和所有网络的都开启共享的设置 - > 点击保存
第二步:打开任意一个文件夹 -> 点击最上面的查看 -> 点击最右边的选项 -> 点击查看进入分页 - > 找到并勾选《使用共享向导》-> 点击保存
**第三步:使用快捷键win + r 打开运行窗口 -> 输入指令netplwiz -> 点击确定 -> 先点击用户再点击添加 - > 选择不使用Microsoft账户登录 -> 点击本地账户 -> 输入对应的用户名和密码 -> 点击添加后就会发现我们除了Administrator还有一个user用户了,添加成功 **
第四步:选择你要共享的文件夹目录并打开属性窗口 -> 点击共享后打开高级共享 -> 点击共享此文件夹后点击权限按钮 -> 选择对应的权限后点击确定
第五步:在mac电脑上打开访达窗口 -> 点击右侧网络按钮并双击 -> 选中我们的共享文件夹 -> 找到右上角点击连接身份 -> 输入我们创建的角色账号和密码点击连接 -> 完成连接,现在可以访问到了
文章目录 1、简介2、安装VSCode2.1 简介2.2 安装 3、安装Java SDK3.1 简介3.2 安装3.3 配置 4、安装插件Java Extension Pack4.1 简介4.2 安装4.3 配置 结语 1、简介 2、安装VSCode 2.1 简介 Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在桌面上运行,适用于 Windows、macOS 和 Linux。它内置了对 JavaScript、TypeScript 和 Node.js 的支持,并具有针对其他语言和运行时(如 C++、C#、Java、Python、PHP、Go、.NET)的丰富扩展生态系统。通过这些介绍性视频开始 VS Code 之旅。
https://code.visualstudio.com/
常用的扩展插件如下:
2.2 安装 https://code.visualstudio.com/Download
开始安装如下:
3、安装Java SDK 3.1 简介 https://www.oracle.com/cn/
Oracle Java 是广受欢迎的编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今,Java 仍是企业和开发人员的首选开发平台,全球有数百万开发人员运行超过 60 亿台 Java 虚拟机。
Java SE 是全球广受欢迎的现代开发平台,也是企业应用的理想编程语言。Java SE 有助于企业降低成本、缩短开发时间、推动创新以及改善应用服务。Oracle Java SE Universal Subscription 现包含 Oracle GraalVM 和 Java Management Service,可有效保护您的 Java 投资。