【多视图聚类】Reconsidering Representation Alignment for Multi-view Clustering

Reconsidering Representation Alignment for Multi-view Clustering CVPR 2021 0.论文摘要和信息 摘要 对齐视图表示的分布是当今用于深度多视图聚类的最先进模型的核心组件。然而,我们发现了nävely对齐表示分布的几个缺点。我们证明了这些缺点既导致表示空间中可分离的聚类更少,又抑制了模型对视图进行优先排序的能力。基于这些观察,我们开发了一个简单的深度多视图聚类基线模型。我们的基线模型完全避免了表示对齐,同时表现类似于或优于当前技术水平。我们还通过添加对比学习组件来扩展我们的基线模型。这引入了选择性对齐过程,保留了模型对视图进行优先排序的能力。我们的实验表明,对比学习组件增强了基线模型,在几个数据集上比当前的技术水平有了很大的提高。 作者信息 Daniel J. Trosten Sigurd Løkse Robert Jenssen Michael Kampffmeyer 代码地址 SiMVC&CoMVC 1.引言 从不同的角度或通过使用不同传感器的集合来收集几种真实世界的数据。例如,视频包含视觉和听觉成分,而带字幕的图像包括原始图像数据和描述性文本。在这两个示例中,视图的低级内容差异很大,但它们仍然可以携带相同的高级聚类结构。多视图聚类的目标是通过同时从所有可用视图中学习来发现这种公共聚类结构。 同时从多个来源学习不是一件小事[6]。然而,深度学习的引入[33]导致了几种有前途的深度多视图聚类模型的发展[1, 36, 48, 61, 64]。这些模型通过用特定于视图的编码器网络变换每个视图来有效地从多个视图中学习。所得到的表示被融合以获得公共表示对于所有视图,然后可以由后续聚类模块对其进行聚类。 深度多视图聚类的当前技术状态使用对抗性训练来对齐来自不同视图的表示分布[36, 64]。 对齐分布导致视图不变表示,这有利于随后的视图融合和聚类模块[64]。视图不变表示保留所有视图中存在的信息,同时丢弃仅存在于视图子集中的信息。如果视图特定信息与聚类目标无关,则编码器学会去除它对于聚类模块将是有利的。此外,对齐表示分布引入了一个辅助任务,该任务正则化编码器,并有助于保持输入空间的局部几何结构。这已被证明可以改进单视图深度聚类模型[21]。 然而,尽管有这些优点,我们发现多视图聚类的分布对齐的三个重要缺点: 对齐表示可防止表示空间中的视图优先化。视图对于聚类目标不一定同样重要。因此,模型应该能够基于视图表示中包含的信息自适应地确定视图的优先级。然而,通过使这些分布尽可能相似,对齐表示分布使得模型更难确定表示空间中的视图的优先级。 只有当编码器可以在所有视图中分离所有聚类时,才能实现聚类的一对一对齐。当聚类结构仅部分地存在于各个视图中时,对齐导致聚类在表示空间中合并在一起。这使得后续聚类模块的聚类任务更加困难。 对齐表示分布会使区分聚类变得更加困难。由于对抗性对齐仅考虑表示分布,因此来自一个视图的给定聚类可能与来自另一个视图的不同聚类对齐。标签分布的这种错位已被证明对表示空间中的判别模型有负面影响[62]。 用于多模态聚类的端到端对抗性注意力网络(EAMC)[64]代表了深度多视图聚类的当前技术水平。EAMC通过优化编码器网络上的对抗目标来对齐视图表示。所得表示与加权平均值融合,权重通过将表示传递通过注意力网络而产生。根据我们上面的推理,我们假设对抗性模块完成的对齐可能会挫败注意力机制的目的。从而抑制视图优先化,并导致融合后较少的可分离聚类。我们的假设得到了EAMC[64]的经验结果的支持,其中所有数据集的融合权重接近均匀。相等的融合权重使得所有视图对融合表示的贡献相等,而不管它们的内容如何。此外,注意力网络产生的融合权重取决于当前批次内的所有样本。因此,如果不对注意力机制进行额外的修改,EAMC就不可能进行样本外推理。 在这项工作中,我们试图缓解在深度多视图聚类中对齐表示分布时可能出现的问题。为此,我们做出以下关键贡献: •我们强调了在深度多视图聚类中对齐表示分布的陷阱,并表明这些陷阱限制了现有技术的模型。 •我们提出了简单多视图聚类(SiMVC),这是一种用于深度多视图聚类的新的简单基线模型,没有任何形式的对齐。尽管与现有方法相比它很简单,但我们的实验表明,这种基线模型的性能类似于——在某些情况下,甚至优于——当前最先进的方法。SiMVC使用学习的线性组合来组合视图的表示,这是一种简单但有效的视图优先级排序机制。我们从经验上证明了这种机制允许模型抑制无信息视图并强调对聚类目标重要的视图。 •为了利用对齐的优势——即保留局部几何结构和视图不变性——同时避免陷阱,我们将选择性对比对齐模块附加到SiMVC。对比模块在样本水平对齐表示之间的角度,避免了标签分布未对齐的问题。此外,在一对一对齐不可能的情况下,我们使模型能够忽略对比目标,保留模型对视图进行优先排序的能力。我们将这种模型称为对比多视图聚类(CoMVC)。 2.多视图聚类中分布对齐的陷阱 这里,我们考虑多视图聚类问题的理想化版本。这允许我们研究和形式化我们对多视图聚类中表示分布对齐的观察。通过假设对于每个视图,聚类中的所有样本都位于输入空间中的同一点,我们开发了以下命题: Proposition 1 命题1。假设我们的数据集由 V V V个视图和 k k k个地面实况聚类组成,我们希望根据这个地面实况聚类来聚类数据。此外,我们作出以下假设: 1.对于每个视图,属于相同地面真实簇的所有观察位于输入空间中的同一点。 2.对于给定的视图 v v v, v ∈ { 1 , . . . , V } v ∈ \{1, .

【动态规划】子数组系列一(数组中连续的一段)

子数组系列一(数组中连续的一段) 1.最大子数组和2.环形子数组的最大和3.乘积最大子数组4.乘积为正数的最长子数组长度 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.最大子数组和 题目链接: 53. 最大子数组和 题目分析: 子数组 是数组中的一个连续部分。子数组最少包含一个元素也就是说本身也是子数组! 算法原理: 1.状态表示 像这种研究的是子数组这样的模型,状态表示 依旧可以用 经验 + 题目要求 以 i 位置为结尾,巴拉巴拉。 以 i 位置为结尾,我们要的是最大子数组和,是不是先把以 i 位置为结尾的所有子数组拿到。单独 i 元素 是一个子数组,还有前面以 i 元素 为结尾的所有子数组,我要的是一个最大和。 dp[i] 表示:以 i 位置元素为结尾的所有子数组中的最大和。 2.状态转移方程 找出所有子数组最大和就可以了,所有子数组可以划分两大类。第一类就是单独自己构成子数组,第二类就是它自己与前面元素的结合构成子数组。所以可以根据长度来划分,长度为1 单独自己构成子数组,子数组最大和 nums[i],长度大于1,nums[i]一定是要的,然后在找到以 i - 1 位置元素为结尾的所有子数组中的最大和,两个相加就可以了,而dp[i - 1] 就是以 i - 1 位置元素为结尾的所有子数组中的最大和,因此 dp[i + 1] + nums[i],我要求的是 i 位置元素为结尾的所有子数组中的最大和。因此两种情况取最大就好了 3.初始化 多申请一个节点 里面的值要保证后面填表的正确下标映射关系 先考虑如果不多加一个节点第一个位置应该填多少呢?是不是填自己本身啊,为了不让多加的节点影响后面的填表正确,因此可以给 0。注意下标映射关系,我们躲开了一个空间相当于整体往右移动一位,如果要回原数组下标要 -1 4.填表顺序 从左往右 5.返回值 注意这里可不是返回最后一个位置的值,因为最大子数组可能在这个数组中任何一个地方。所以返回的是dp中最大值 class Solution { public: int maxSubArray(vector<int>& nums) { // 1.

Idea插件

分享IDEA中好用的插件 1、在IDEA中想要添加插件 步骤 File -- settings -- plugins 下载插件 Gitee 这个插件可以很方便的在idea中对项目做git管理 (git的可视化管理) Maven Helper 管理maven依赖 MyBatisX 这个是mybatis中的 方便mapper之间的跳转 (在mapper.java和xml中可以点击这个小鸟来实现跳转 很方便) TONGYI LINGMA 通译灵码 (这个插件堪称作弊神器 有自动补全功能) Apipost 我用到的最多的就是以上这几个

大数据-108 Flink 快速应用案例 重回Hello WordCount!方案1批数据 方案2流数据

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis (已更完)Kafka(已更完)Spark(已更完)Flink(正在更新!) 章节内容 上节完成了如下的内容: Flink 基本介绍基本概述 适用场景 框架特点 核心组成 生态发展 处理模型 组件架构 再次回到最初的起点,Hello Word Count! Flink 流处理 (Stream Processing) 定义 流处理是指对持续不断的数据流进行实时处理。Flink 的流处理模式非常适合处理持续产生的数据,例如来自传感器、日志记录系统或金融交易的数据流。 核心概念 无界数据流:流处理通常处理无界数据流,即数据流没有明确的结束点,持续不断地产生。事件时间:Flink 支持基于事件时间的处理,能够处理乱序和延迟数据,使得处理更加精确。事件时间指的是数据在其产生源头的时间。窗口操作:在流处理过程中,通常需要将数据按时间窗口(如滑动窗口、滚动窗口、会话窗口)进行分组,以便执行聚合或其他操作。状态管理:Flink 支持有状态的流处理,这意味着处理每条数据时,可以记住之前的数据状态。例如,在流中计算一个累积的总和或频率。 Flink 批处理 (Batch Processing) 定义 批处理是指对静态的、有界的数据集进行处理。这种处理通常用于一次性的大规模数据分析,如定期的业务报告生成、数据转换和加载任务。 核心概念 有界数据集:批处理通常处理有界数据集,即数据集是固定大小的,有明确的开始和结束点。任务并行化:在批处理模式下,Flink 会将数据集划分为多个子任务,并行执行这些任务,以加快处理速度。DataSet API:Flink 的 DataSet API 提供了一组高层次的操作符,用于对批数据集执行各种操作,如映射(map)、过滤(filter)、联接(join)和聚合(aggregate)。 单词统计(批数据) 需求说明 统计一个文件中各个单词出现的次数,把统计结果输出到文件 读取数据源处理数据源将读取到的数据源文件中的每一行根据空格切分将切分好的每个单词拼接1根据单词聚合(将相同的单词放到一起)累加相同的单词(单词后面的1进行累加)保存处理结果 导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>flink-test</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>1.11.1</version> </dependency> <dependency> <groupId>org.

【Springboot系列】SpringBoot如何优雅地实现一个错误异常捕捉

文章目录 强烈推荐引言简单示例1. 引入依赖 2. 定义一个自定义异常类3. 创建切面类4. 在业务逻辑中抛出异常 5. 启用AspectJ自动代理优点1. 解耦异常处理与业务逻辑2. 统一异常处理3. 增强可维护性4. 支持跨切关注点5. 提高代码的可测试性 结束语强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 引言 在开发过程中,异常处理是一个不可忽视的重要环节。 合理、优雅地处理异常不仅能提高代码的鲁棒性,还能提升系统的用户体验。 借助Spring AOP(面向切面编程),我们可以将异常处理逻辑从业务代码中分离出来, 实现更加简洁和可维护的代码结构。 本文将介绍如何通过Spring AOP实现一个高效的异常捕捉机制,使得异常处理变得更加优雅和统一。 简单示例 1. 引入依赖 确保你已经在项目的 pom.xml 中引入了 Spring AOP 的相关依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2. 定义一个自定义异常类 可以创建一个自定义异常类以便在业务逻辑中抛出并捕获。 public class CustomException extends RuntimeException { public CustomException(String message) { super(message); } } 3. 创建切面类 在切面类中使用 @Aspect 注解定义切面,使用 @Around 或 @AfterThrowing 注解定义在方法抛出异常时的处理逻辑。 import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class ExceptionHandlingAspect { @AfterThrowing(pointcut = "

Python酷库之旅-第三方库Pandas(107)

目录 一、用法精讲 466、pandas.DataFrame.eq方法 466-1、语法 466-2、参数 466-3、功能 466-4、返回值 466-5、说明 466-6、用法 466-6-1、数据准备 466-6-2、代码示例 466-6-3、结果输出 467、pandas.DataFrame.combine方法 467-1、语法 467-2、参数 467-3、功能 467-4、返回值 467-5、说明 467-6、用法 467-6-1、数据准备 467-6-2、代码示例 467-6-3、结果输出 468、pandas.DataFrame.combine_first方法 468-1、语法 468-2、参数 468-3、功能 468-4、返回值 468-5、说明 468-6、用法 468-6-1、数据准备 468-6-2、代码示例 468-6-3、结果输出 469、pandas.DataFrame.apply方法 469-1、语法 469-2、参数 469-3、功能 469-4、返回值 469-5、说明 469-6、用法 469-6-1、数据准备 469-6-2、代码示例 469-6-3、结果输出 470、pandas.DataFrame.applymap方法 470-1、语法 470-2、参数 470-3、功能 470-4、返回值 470-5、说明 470-6、用法 470-6-1、数据准备 470-6-2、代码示例 470-6-3、结果输出 二、推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、Python魔法之旅 5、博客个人主页 一、用法精讲 466、pandas.DataFrame.eq方法 466-1、语法 # 466、pandas.DataFrame.eq方法 pandas.DataFrame.eq(other, axis='columns', level=None) Get Equal to of dataframe and other, element-wise (binary operator eq).

【C++】vector(下)--上篇

个人主页~ vector(上)~ vector 二、vector的模拟实现1、了解组成2、vector.h(1)为什么有了size_t参数的vector构造函数还要再写一个int参数的重载vector构造函数(2)为什么reserve不用memcpy(3)reserve和resize的相关解释(4)迭代器失效问题详解 二、vector的模拟实现 1、了解组成 首先我们需要在头文件stl_vector.h中了解vector的构成,它的三个私有成员分别是迭代器start、迭代器finish、迭代器endofstorage,分别指向vector的头、size的尾、capacity的尾 既然要实现了,自然要按照人家的标准最好,所以我们选择它们三个为私有成员变量 看一下vector的接口有哪些,当然我们还是去实现最基本也是重要最常用的那部分 2、vector.h #pragma once #include <iostream> #include <assert.h> namespace little_monster { template <class T> class vector { public: typedef T* iterator; typedef const T* const_iterator; //迭代器 iterator begin() { return _start; } iterator end() { return _finish; } const_iterator begin() const { return _start; } const_iterator end() const { return _finish; } //构造、拷贝、析构函数 vector() {} vector(size_t n, const T& value = T()) { reserve(n); for (size_t i = 0; i < n; i++) { push_back(value); } } vector(int n, const T& value = T()) { reserve(n); for (int i = 0; i < n; i++) { push_back(value); } }//(1)为什么有了size_t参数的vector还要再写一个int参数的 template <class InputIterator> vector(InputIterator first, InputIterator end) { while (first !

Sentinel熔断与限流

一、服务雪崩与解决方案 1.1、服务雪崩问题 一句话:微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图,如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业务似乎不受影响。 但是,依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞: 服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。 那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了: 解决雪崩问题的常见方式有四种: 1.2、超时处理 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待 1.3、仓壁模式 仓壁模式来源于船舱的设计: 船舱都会被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进入,将故障控制在一定范围内,避免整个船体都被淹没。 于此类似,我们可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。 1.4、断路器 断路器模式:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。 断路器会统计访问某个服务的请求数量,异常比例: 当发现访问服务D的请求异常比例过高时,认为服务D有导致雪崩的风险,会拦截访问服务D的一切请求,形成熔断: 1.5、限流 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。 1.6、总结 什么是雪崩问题? 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。 可以认为: 限流是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。 超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免雪崩。是一种补救措施。 解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待 舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。 熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。 二、初识Sentinel 在SpringCloud当中支持多种服务保护技术: Netfix HystrixSentinelResilience4J 早期比较流行的是Hystrix框架,但目前国内实用最广泛的还是阿里巴巴的Sentinel框架,这里我们做下对比: SentinelHystrix隔离策略信号量隔离线程池隔离/信号量隔离熔断降级策略基于慢调用比例或异常比例基于失败比率实时指标实现滑动窗口滑动窗口(基于 RxJava)规则配置支持多种数据源支持多种数据源扩展性多个扩展点插件的形式基于注解的支持支持支持限流基于 QPS,支持基于调用关系的限流有限的支持流量整形支持慢启动、匀速排队模式不支持系统自适应保护支持不支持控制台开箱即用,可配置规则、查看秒级监控、机器发现等不完善常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix https://sentinelguard.io/zh-cn/index.html https://github.com/alibaba/Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html Sentinel 具有以下特征: •丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 •完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 •广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 •完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

质量技术&AI提效专题分享-得物技术沙龙

活动介绍 本次“质量技术&AI提效专题分享”沙龙聚焦于质量技术和AI效率领域,将为您带来四个令人期待的演讲话题: 1、《智能化提效实践》 2、《仿真自动化在饿了么金融实践分享》 3、《得物精准测试提效应用》 4、《广告算法灰度拦截实践》 相信这些话题将对你的工作和学习有所帮助,我们期待着与你共同探讨这些令人兴奋的思考和实践。欢迎线下参与,如果没办法到现场,也可以锁定我们的“得物Tech”视频号。 点击链接 【立即报名】报名|质量技术&AI提效专题分享-得物技术沙龙 报名成功后,微信扫描二维码添加小助手微信,小助手会邀请您加入沙龙群交流互动,获取沙龙会场路线指引、直播网址、沙龙分享PPT~ 活动时间&地点 时间:2024年9月22日(周日) 14:00 - 18:00 地点:上海·杨浦区黄兴路221号互联宝地C2栋5楼培训教室(宁国路地铁站1号口) 购票须知 1.报名方式:点击小程序报名页面中的【立即报名】 2.报名须知:免费购票,凭【邀约短信】验票签到入场 关于得物效率工程团队 得物效率工程部的使命是:运用产品、技术、数据等手段,全面提升公司的效率。在管理效率、协同效率、跨团队沟通效率、产研协作效率、办公效率等各方面持续探索,实现高效驱动公司发展的目标。 关于主办方 得物技术一直以"上海最好的技术团队"为目标,现已建立上海、北京、杭州三地研发协同与管理机制,实现研发过程数据化、自动化;覆盖供应链、业务支撑、算法、前端等领域,是得物业务背后强有力的技术力量支撑。 得物技术部为有意分享的同学提供平台,就现有技术实战经验、研究成果定期举办沙龙分享与交流,营造浓厚的技术分享氛围,形成技术知识沉淀,打造学习型组织,提升技术影响力,拓宽技术同学的知识面,探寻自己的职业发展方向。 技术创造价值,得物技术旨在吸引有才华的工程师,共同开创一番事业,一起共创未来。 关于CSDN·COC 关于CSDN·COC,COC组织是基于城市域建设的开发者交流组织,组织成员以各个城市当地或在当地生活工作的CSDN骨灰用户(深入参与用户)为主。用户主要是能够持续地进行技术分享和内容产出、对新技术与领域有探索欲、未来长期专注于技术行业且对自我发展精益求精的开发者。 目前,COC社区已覆盖国内北京、上海、深圳、广州、杭州、南京、天津等 14 个城市大部分主要城市,拥有 20 多万名成员,辐射开发者群体达100万人。其中,COC上海社区主链: 上海城市开发者社区 ,欢迎加入COC上海社区!

力扣之1853.转换日期格式

文章目录 1. 1853.转换日期格式1.1 题干1.2 建表1.3 题解1.4 实现方式1.5 题解1.6 知识总结 1. 1853.转换日期格式 1.1 题干 表: Days ±------------±-----+ | Column Name | Type | ±------------±-----+ | day | date | ±------------±-----+ day 是这个表的主键。 给定一个Days表,请你编写SQL查询语句,将Days表中的每一个日期转化为"day_name, month_name day, year"格式的字符串。 返回的结果表 不计顺序 。 查询结果格式如下例所示。 示例 1: 输入: Days table: ±-----------+ | day | ±-----------+ | 2022-04-12 | | 2021-08-09 | | 2020-06-26 | ±-----------+ 输出: ±------------------------+ | day | ±------------------------+ | Tuesday, April 12, 2022 |

数据结构---单链表(常见的复杂操作)

目录 一、单链表 1.1.查找中间元素 1.2.查找倒数第K个节点 1.3.链表倒置 1.4.冒泡排序 1.5.选择排序 1.6.环,确认有环单链表的环入口和环大小 二、总结 一、单链表 1.1.查找中间元素 定义两个指针,分别指向第一个元素,第一个指针每次向后遍历两个节点,第二个指针向后遍历一个节点,最终当第一个指针遍历到最后一个时,第二个也就刚好指向中间节点。 LinkList *FindMidLinkList(LinkList *phead) { LinkList *pfast = NULL; LinkList *pslow = NULL; if (phead->pnext == NULL) { return NULL; } pfast = pslow = phead->pnext; while (pfast != NULL) { pfast = pfast->pnext; if (NULL == pfast) { break; } pfast = pfast->pnext; if (NULL == pslow) { break; } pslow = pslow->pnext; } return pslow; } 1.

【微信小程序】小程序开发思想之异步与渲染

笔者开发小程序已经有4年了,提炼出两个重要的小程序开发思想。 异步 第一是异步,这也是开发小程序等web应用与C语言等应用的不同之处,web应用中不容忽略的就是为了提升效率而实现的同步操作,比如两个函数,虽然在代码层面看是有先后顺序的,但在执行时可能是同时启动的,这也就会出现,后面的代码比前面的代码先执行完成。 因此,了解和使用异步的代码可以更好的调试和解决bug。 最初对异步的了解局限在success,fail,complete等函数,但是这些回调函数只适用于官方的函数,对于自己封装的函数无法使用上述函数,那么如何实现异步效果呢,其中之一就是使用回调函数callback作为参数。 渲染 第二就是渲染问题,常见于onReady等生命周期函数,此时如果数据和渲染还未完成时进行赋值,就可能出现渲染失败的效果,笔者最近遇到的一个例子就是使用masonry组件动态渲染瀑布流时,发现如果渲染函数的执行发生在setData操作之前,就会出现渲染函数的执行效果失败的情况,笔者在测试后发现这个问题,因此了解渲染逻辑对编写和调试代码是有作用的。

Python酷库之旅-第三方库Pandas(105)

目录 一、用法精讲 456、pandas.DataFrame.rdiv方法 456-1、语法 456-2、参数 456-3、功能 456-4、返回值 456-5、说明 456-6、用法 456-6-1、数据准备 456-6-2、代码示例 456-6-3、结果输出 457、pandas.DataFrame.rtruediv方法 457-1、语法 457-2、参数 457-3、功能 457-4、返回值 457-5、说明 457-6、用法 457-6-1、数据准备 457-6-2、代码示例 457-6-3、结果输出 458、pandas.DataFrame.rfloordiv方法 458-1、语法 458-2、参数 458-3、功能 458-4、返回值 458-5、说明 458-6、用法 458-6-1、数据准备 458-6-2、代码示例 458-6-3、结果输出 459、pandas.DataFrame.rmod方法 459-1、语法 459-2、参数 459-3、功能 459-4、返回值 459-5、说明 459-6、用法 459-6-1、数据准备 459-6-2、代码示例 459-6-3、结果输出 460、pandas.DataFrame.rpow方法 460-1、语法 460-2、参数 460-3、功能 460-4、返回值 460-5、说明 460-6、用法 460-6-1、数据准备 460-6-2、代码示例 460-6-3、结果输出 二、推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、Python魔法之旅 5、博客个人主页 一、用法精讲 456、pandas.DataFrame.rdiv方法 456-1、语法 # 456、pandas.DataFrame.rdiv方法 pandas.DataFrame.rdiv(other, axis='columns', level=None, fill_value=None) Get Floating division of dataframe and other, element-wise (binary operator rtruediv).

Leetcode19删除链表的倒数第K个节点(java实现)

今天分享的题目如下: 说一下我们的解题思路:我们要想删除第k个节点,那么指针必须落在k-1节点上,比如我们想要操作题目中的节点4,那么指针必须落在节点3,然后让节点3.next= 3.next.next即可。 所以明白了这个,那么我们传入的是倒数第k个节点,我们如何让他落在他的前一个节点呢?我们只需两个指针。 首先让快慢指针都指向头结点,先让快指针移动k+1次,然后这个时候再将快慢指针同时移动,到最后,慢指针所指向的地方就是我们的目标地址。然后进行删除即可。 具体的代码实现如下: class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode cur =new ListNode(0,head); //快指针 ListNode index1 = cur ; //慢指针 ListNode index2 =cur ; n+=1; while(n>0&&index1!=null){ //先让快指针移动n+1次 index1=index1.next; n--; } while(index1!=null){ //快慢指针同时移动 index1=index1.next; index2=index2.next; } //找到目标节点,进行删除操作 index2.next = index2.next.next; //返回虚拟节点next return cur.next; } } 那么今天的分享就到此结束了,如果有疑问欢迎在文章下方留言。

zdppy_cache缓存框架升级,支持用户级别的缓存隔离,支持超级管理员管理普通用户的缓存

启动服务 import zdppy_api as api import zdppy_cache key1 = "admin" key2 = "admin" app = api.Api(routes=[ *zdppy_cache.zdppy_api.cache(key1, key2, api) ]) if __name__ == '__main__': import zdppy_uvicorn zdppy_uvicorn.run(app, host="0.0.0.0", port=8888) 基于用户的缓存隔离 测试代码: import req # 用户1设置缓存 headers = { "key1": "zhangdapeng", "key2": "zhangdapeng520", } resp = req.post("http://127.0.0.1:8888/zdppy_cache", json={ "key": "name", "value": "张三" }, headers=headers) print(resp.json()) resp = req.get("http://127.0.0.1:8888/zdppy_caches", json={}, headers=headers) print(resp.json()) resp = req.get("http://127.0.0.1:8888/zdppy_cache", json={"key": "name"}, headers=headers) print(resp.json()) # 用户2设置缓存 headers2 = { "

坐牢第三十一天(c++)

一.作业: 使用C++手动封装一个顺序表,包含成员数组一个,成员变量N个 #include <iostream> #include <cstring> // 引入cstring以使用memcpy using namespace std; // 类型重命名 using datatype = int; // typedef int datatype; struct SeqList { private: // datatype data[MAX] = {0}; //顺序表的数组 datatype *data; // 顺序表的数组 int size = 0; // 数组的大小 int len = 0; // 顺序表实际长度 public: // 初始化函数 void init(int s); // 要实现的函数 // 判空函数 bool empty(); // 判满函数 bool full(); // 添加数据函数 bool add(datatype e); // 求当前顺序表的实际长度 int length(); // 任意位置插入函数 bool insert_pos(int pos, datatype e); // 任意位置删除函数 bool delete_pos(int pos); // 访问容器中任意一个元素 at datatype &at(int index); // 遍历整个数组输出 void show(); // 君子函数:二倍扩容 void expend(); // 释放函数 void free(); }; // 初始化函数 void SeqList::init(int s) { size = s; // 当前数组的最大容量 data = new datatype[size]; // 在堆区申请一个顺序表容器 } // 判空函数 bool SeqList::empty() { if (len == 0) { return true; } else { return false; } } // 判满函数 bool SeqList::full() { if (size == len) { return true; } else { return false; } } // 添加数据函数 bool SeqList::add(datatype e) { if (data == NULL) { cout << "

SpringMVC基于注解使用:响应处理

视图解析器ViewResolver 在spring.xml里面设置ViewResolver作用是可以简化逻辑视图的名称 没简化之前 简化之后 在spring-mvc.xml里面设置视图控制器的作用,如果你想访问根目录的话就会进入index.jsp里面,如果你想访问/tuling,就会进入main.jsp里面,path是写到地址栏里的 main.jsp里面的内容 main.jsp访问服务器演示 index.jsp里面的内容 index.jsp访问服务器演示 用servletapi的方式获取属性 在main.jsp中获取type数据 用model的方式获取属性 用modelmap的方式获取属性 使用map的方式获取属性 使用ModelAndView的方式获取属性方法里第一句是要传数据到那个jsp文件里传入的方法是通过构造函数的方式,mv.setViewName()是通过方法的方式设置要传入的jsp文件里,addObject是设置属性的名字和数据 通过servlet api的方式获取session的数据 通过自动注入的方式获取servlet api 选在外面声明HttpSession session 在加入@Atuowired注解再在方法中用就行 2.通过springmvc提供的注解方式去读写session 用@SessionAttributes()的方式把在model里的数据写入到注解里面 如注解里写入type,它回去model方法里面找type的属性如下下图然后设置到session里面 @SessionAttribute用在参数上面的,读取session的。如果session域中有个type属性的值,就会输出在控制台上如先访问上图的model在访问下图就或有model的值 如果session里面没有设置值还不想报错,可以设置required=false就会输出对应属性的空值 用@MdelArrtibute的方式获取session 先在用@ModelAttribute里面设置model属性的值 springmvc有个特性就是会将model里面的值和下面方法用user类的值合并,如果在客服端改了username的值不改别的话还会保留其他数据的值 如果就只有这一个方法的话springmvc还是会把user的值传到request里面的 @ModelAttribute使用场景和用法 线程安全问题 通过参数绑定的方式 通过自动注入的方式@AutoWired 通过@ModelAttribute的方式 同时进行请求一个请求a一个请求b会出现错误在@ModelAttribute注解 解决办法可以把变量设置到方法中也可以设置锁 转发和重定向在spring的写法 转发 我们配了视图解析器需要遵循这个原则 想不遵循视图解析器,如下图在前面写入forward 重定向,不能访问WEB-INF文件里面的内容只有转发能访问

LeetCode 热题100-37 二叉树的最大深度

二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root = [1,null,2] 输出:2 提示: 树中节点的数量在 [0, 104] 区间内。-100 <= Node.val <= 100 以前本科数据结构做过,感觉递归还是巧妙啊 class Solution: def maxDepth(self, root: Optional[TreeNode]) -> int: if root == None:return 0 high = 0 def dfs(root): if root == None:return 0 if root.left ==None and root.right == None:return 1 return max(dfs(root.left),dfs(root.right))+1 return dfs(root) 然后看了看k神的题解,发现考虑是否有左右孩子节点的那个if没有必要... # Definition for a binary tree node.

idea debug 各个步骤含义

在 IntelliJ IDEA 中进行调试(Debug)时,您会遇到不同的步骤和操作,每个都有其特定的含义和作用。以下是一些常见的调试步骤及其含义: 启动调试会话(Start Debugging): 点击IDEA工具栏上的虫子图标或使用快捷键(通常是Shift + F9),启动应用程序的调试会话。程序将使用断点来暂停执行。 断点(Breakpoints): 在代码的左边边栏点击,设置一个断点。当程序执行到这一行时,它将暂停。 程序执行(Run to Cursor): 使用Ctrl + F9,程序将运行到当前光标所在的行。 单步执行(Step Over): 使用F8,程序将执行到下一行代码,跳过方法调用或复杂的表达式。 步入(Step Into): 使用F7,程序将步入当前行的方法或函数,如果当前行是一个方法调用,它将进入该方法的开始处。 步出(Step Out): 使用Shift + F8,如果您当前在某个方法内部,程序将执行完该方法的剩余部分并返回到调用方法的地方。 强制执行到特定行(Force Step Into): 使用Alt + Shift + F7,即使IDEA无法确定下一个可执行的代码行,程序也将尝试步入。 恢复程序执行(Resume Program): 使用F9,程序将继续执行,直到遇到下一个断点或程序结束。 暂停程序执行(Pause Program): 点击IDEA工具栏上的暂停图标或使用Ctrl + F2,可以暂停正在运行的程序。 结束调试会话(Stop Debugging): 点击IDEA工具栏上的红色方块图标或使用Ctrl + F2,结束当前的调试会话。 评估表达式(Evaluate Expression): 在调试过程中,您可以在"Evaluate Expression"窗口中输入并评估表达式的值。 监视(Watch): 在"Watch"窗口中,您可以添加需要监视的变量或表达式,以实时查看它们的值。 调用堆栈(Call Stack): "Call Stack"窗口显示了当前执行的调用路径,包括方法调用和行号。 变量查看(Variables): 在"Variables"窗口中,您可以查看当前上下文中所有变量的值。 线程查看(Threads): "Threads"窗口显示了当前运行的所有线程,允许您切换到不同的线程进行调试。 断点管理(Breakpoints Manager): 在"Breakpoints"窗口中,您可以查看和管理所有设置的断点。 条件断点(Conditional Breakpoints): 设置断点时,您可以指定一个条件,只有当该条件为真时,程序才会暂停。 日志断点(Logpoints):

Pictory AI——博客、文章等内容转换为视频,自动适配动态画面和字幕

一、Pictory AI介绍 Pictory AI 是一种先进的视频生成和编辑平台,旨在将文本、音频等内容快速转化为视频,适用于市场营销、社交媒体、教育等领域。其核心特点在于简化视频创作流程,让没有视频编辑经验的用户也能轻松制作高质量的视频。 二、Pictory AI的使用方法 视频创作:用户可以上传文章、博客内容、字幕脚本或音频文件,Pictory AI 会自动分析内容并生成相应的视频片段。 自动添加字幕:上传视频或音频,Pictory AI 会自动生成精确的字幕,支持多语言和自动翻译功能。 文本转视频:用户输入文本脚本,Pictory AI 会根据脚本生成相应的视频内容,并智能匹配视频片段、背景音乐和视觉效果。 场景与风格定制:提供多种视频模板和风格,用户可以根据需求自定义视频的配色、字体、过渡效果等,打造个性化视频。 背景音乐与声音优化:Pictory AI 支持添加背景音乐和音效,用户还可以调整音频的音量、速度和节奏,使视频更加生动。 社交媒体分享:生成的视频可以直接分享到各大社交媒体平台,如 YouTube、Instagram、Facebook 等。 三、Pictory AI的核心技术 1. 深度学习与自然语言处理(NLP) 技术原理: Phenaki 使用深度学习与 NLP 技术分析和理解输入文本,将自然语言转化为可操作的特征向量。这些特征向量用于指导视频生成过程,确保生成的视频内容与输入文本的语义高度一致。 实现方法: Transformer 架构:利用 Transformer 模型,Phenaki 对文本进行编码,提取语义特征。编码器将文本转化为向量表示,这些向量代表了输入文本的上下文、语义和关键词。 文本到图像(Text-to-Image)转换:通过将文本的语义特征映射到视觉空间,生成符合描述的图像。Phenaki 使用这一步作为生成视频帧的基础,逐步扩展到视频序列。 语言建模:通过大型语言模型(如 GPT 系列),实现对输入文本的上下文理解,从而生成符合逻辑的视觉输出序列。 2. 计算机视觉与图像识别 技术原理: 计算机视觉在 Phenaki 算法中用于图像识别和图像生成,通过深度神经网络(如卷积神经网络,CNN),将视觉信息与文本描述对齐,生成与输入描述一致的图像和视频序列。 实现方法: 卷积神经网络(CNN):用于提取图像和视频中的特征,通过多层卷积操作,识别图像中的物体、场景和细节。 视觉-文本对齐:通过视觉嵌入网络,将视觉信息与文本语义结合,实现视觉内容的自动生成。 图像到视频的转换:利用视觉生成模块,将静态图像扩展为动态视频序列,确保视觉过渡的平滑与连续。 3. 生成对抗网络(GAN) 技术原理: GAN 由生成器和判别器组成,生成器负责合成逼真的视频内容,判别器则评估生成内容的真实性,通过对抗训练,生成器不断提升生成效果。 实现方法: 生成器:利用生成器网络将文本语义特征转化为初步的视觉内容,并生成与文本描述匹配的连续视频帧。 判别器:判别器负责对生成的视频进行评估,区分真实视频与生成视频。通过不断训练,生成器学习到更真实的视觉特征。 逐帧生成与时间一致性:GAN 在视频生成过程中,特别关注帧与帧之间的时间一致性,确保视频的自然流畅。 4. 自动化字幕生成与语音识别 技术原理: Phenaki 使用语音识别技术,将输入的语音或音频转化为文本,同时生成对应的字幕。字幕生成结合了语音到文本(Speech-to-Text)转换和文本对齐技术。 实现方法: 语音识别:采用 ASR(自动语音识别)系统,将音频信号转换为可编辑的文本,并与视频生成过程同步。