自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(152)
  • 问答 (1)
  • 收藏
  • 关注

原创 设计模式之行为型模式

这些关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。

2024-01-16 09:13:35 1266

原创 设计模式之结构型模式

这些模式关注对象之间的组合和关联方式,以便形成更大的结构和功能。结构型模式包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式等。

2023-11-15 20:00:00 1413

原创 设计模式之创建型模式

创建型模式与对象的创建有关

2023-10-25 21:15:00 2069

原创 软件生命周期中的概念设计和详细设计的主要任务是什么

功能是系统中实际要完成的任务,而模块是用于实现这些功能的独立且可复用的代码单元。通过模块化的设计,可以将复杂的系统分解为易于管理和维护的模块,提高软件开发的效率和质量。这样的模块划分可以使系统更加可维护、可扩展和易于理解,不同的团队成员可以独立开发和测试不同的模块,提高开发效率和系统质量。概念设计和详细设计是软件设计过程中的两个关键阶段,通过这两个阶段的设计工作,可以在后续的开发实现阶段提供明确的指导和依据。在软件开发中,模块和功能是两个不同的概念,它们描述了软件系统中的不同角色和任务。

2023-10-09 20:00:00 2468

原创 leetcod111.二叉树的最小深度

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。给定一个二叉树,找出其最小深度。来源:力扣(LeetCode)

2023-07-26 19:15:00 984

原创 leetcode100. 相同的树

链接:https://leetcode.cn/problems/same-tree。函数的输入是两个树节点 p 和 q,函数返回一个布尔值,表示两个树是否相同。给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。输入:p = [1,2], q = [1,null,2]输入:p = [1,2,3], q = [1,2,3]来源:力扣(LeetCode)

2023-07-25 19:45:00 440

原创 计算二叉树的最大深度

【代码】计算二叉树的最大深度。

2023-07-25 19:15:00 410

原创 java代码实现二叉树的先序、中序、后序和层次遍历的递归和循环迭代方式

【代码】java代码实现二叉树的先序、中序、后序和层次遍历的递归和循环迭代方式。

2023-07-19 18:45:00 4266 2

原创 主数据建模和维护流程

开发代码:使用编程语言或工具,根据设计的模型和需求,编写代码以实现主数据建模功能,包括数据的录入、更新、查询、删除等操作。记录和日志:记录主数据维护过程中的操作日志,包括修改、删除、审批等操作的时间、用户、内容等信息,以便追溯和审计。数据同步与推送:若有需要,将新的主数据变更同步或推送给相关的系统或服务,以确保各个系统中的主数据保持一致。收集数据:收集相关的数据源,如数据库、文件等,并对数据进行分析和清洗,保证数据的准确性和完整性。数据准备:收集需要修改或更新的主数据,包括个人信息、产品信息等。

2023-07-18 22:06:36 817

原创 当sql执行inner join去匹配记录时,背后的算法有哪些

Hash Join(哈希连接):该算法通过哈希函数将连接列的值映射到一个哈希表中,并将具有相同哈希值的记录分组在一起。然后,对两个表进行遍历,将具有相同哈希值的记录匹配在一起。它会遍历一个表中的每一条记录,并与另一个表进行比较,以查找匹配的记录。Sort Merge Join(排序合并连接):首先对连接列进行排序,然后对两个表进行遍历,将匹配的记录组合在一起。这些算法和数据结构的选择取决于数据规模、索引情况和可用的系统资源。数据库管理系统会根据查询优化器的判断,选择最适合当前情况的连接算法和数据结构。

2023-07-11 19:15:00 354

原创 map-side join 和 reduce-side join

和是两种常见的数据连接技术,用于在大规模数据处理中合并不同数据集的内容。

2023-07-05 19:45:00 583

原创 spark中为什么要设置宽窄依赖

宽依赖通常会导致任务串行执行,因为一个任务的开始必须等到其它任务的结束。例如,如果任务A依赖于任务B、C和D,那么任务A只能在任务B、C和D全部完成后才能开始执行。例如,如果任务A只依赖于任务B,那么任务A可以在任务B完成后立即开始执行,而无需考虑其它任务。如果一个任务失败了,并且其他任务依赖于它的结果,那么它可以触发相应的错误处理机制以恢复失败的任务或引导后续任务执行备选方案。如果任务A依赖于任务B的结果,那么只有当任务B完成后才会开始执行任务A,避免了潜在的数据冲突或不一致。

2023-07-05 19:15:00 412

原创 rdd中reduceByKey和groupByKey

例如,在某些特定的数据分析场景中,我们可能需要对具有相同key的值进行聚合、连接或其他复杂的操作。适用于需要对RDD中的元素按照key进行聚合操作的场景,如求和、取最大值、取最小值等。对的RDD,其中iterable代表具有相同key的元素组成的迭代器。将具有相同key的元素进行分组,得到了两个分组:key 1的元素为。是Spark中用于将一个RDD中的元素按照key进行分组的函数。对的RDD,我们想按照key对value进行求和。对的RDD,我们想按照key进行分组。,然后返回根据key进行聚合的结果。

2023-07-05 18:45:00 400

原创 Yarn集群架构和工作原理

它允许多个应用程序同时运行,通过动态地分配和回收资源来满足不同应用程序的需求,并提供一致的任务监控和管理功能。应用程序获取资源:一旦RM分配了资源,应用程序的AM将与NM通信,并请求启动容器。Container:Container是Yarn中的资源单位,表示在集群节点上分配给应用程序的一组资源,包括CPU、内存和网络等。容器中运行任务:一旦容器分配成功,应用程序的AM将向NM发送任务的代码和其他必要的信息。提交的应用程序包括代码和所需资源的描述,如应用程序类型、需要资源的数量和优先级等。

2023-07-03 18:45:00 1123

原创 hadoop中combiner是什么

然而,与Reducer不同的是,Combiner只在Map任务的本地节点上执行,并且对每个Map任务的输出进行局部处理。分组是为了减少数据传输量和提高规约器的效率。在规约过程中,具有相同键的键值对会被合并成一个键值对,并进行相应的聚合操作,从而减少最终输出的数据量。总结起来,Combiner是一个可选的局部聚合阶段,在Map阶段结束后、Reducer阶段之前执行,用于减少MapReduce任务的网络传输量和提高性能。分组是在规约之前对键值对进行分类,而规约是在分组后对具有相同键的键值对进行合并和聚合操作。

2023-06-30 18:45:00 1190

原创 用sparksql处理的时候, 处理过程中用的dataframe还是直接写的sql?为什么?

最终选择使用哪种方式取决于具体情况。如果你更习惯使用SQL并且查询逻辑相对简单,那么直接编写SQL查询可能是更好的选择。另一方面,如果需要更灵活的转换选项、类型安全以及更好的集成性能,那么使用DataFrame API可能更适合你。在Spark SQL中处理数据时,可以使用DataFrame API或直接编写SQL查询语句。这两种方式都是有效的,但选择哪一种依赖于你的具体需求和个人偏好。

2023-06-29 19:30:00 801

原创 spark运行流程

执行计算:Spark执行计算时采用惰性求值的方式,即不会立即执行转换操作,而是记录下转换操作的逻辑。转换数据:通过转换操作对加载的数据进行处理和转换。Spark提供了丰富的转换操作,如映射、过滤、排序、聚合等,可以将数据进行清洗、筛选和加工。行动操作:行动操作是Spark计算流程中的最后一步,其作用是触发Spark的计算,并将结果返回给驱动程序或输出到外部存储介质。缓存数据:可选步骤,如果需要多次使用某个数据集,可以将其缓存到内存中,以便反复访问,加快后续计算速度。

2023-06-29 19:00:00 938

原创 RDD基础概念特点以及设计RDD的目的

Spark采用内存计算和支持多种操作的RDD模型来提供更高的性能和更强的计算能力。支持多种操作:RDD支持两种类型的操作:转换(Transformation)和动作(Action)。惰性计算:RDD采用惰性计算的方式,只有在遇到动作操作时才会开始计算,这样可以优化计算过程,避免不必要的计算。可以容错:RDD可以自动对数据进行分区和备份,从而保证在集群中的任意节点出现故障时能够进行故障恢复。可以在内存中缓存:RDD可以将数据集保留在内存中,这样可以加快数据的访问速度,提高计算性能。

2023-06-28 22:00:00 622

原创 HDFS组织架构及相关介绍

通过这种机制,Secondary NameNode维护了一个较小的fsimage和edits日志来加速HDFS集群的恢复速度和故障恢复能力,在NameNode崩溃时提供备份数据,同时减少NameNode服务器的压力,在大规模HDFS集群中发挥着重要作用。在非首次启动时,Namenode的工作流程与首次启动时类似。为了解决这个问题,Hadoop引入了Secondary NameNode,在内存中定期备份和合并NameNode的元数据,并将其写入本地磁盘中,而不会对NameNode的进程进行任何干扰或负担。

2023-06-25 18:45:00 1497

原创 spark概念、作业提交和执行过程

Spark是一个基于内存的开源计算框架,用于分布式处理大规模数据。它可以大幅提升数据处理的速度和效率。Spark支持多种编程语言(如Java、Python和Scala),并且可以与Hadoop等大数据平台配合使用。Spark不仅可以处理批处理任务,还支持流处理、SQL查询、机器学习等多种任务类型。Spark具有易于使用的API、高性能和可靠性等特点。

2023-06-21 19:45:00 691

原创 HDFS读写流程

NameNode将位置信息返回给客户端:NameNode接收到客户端的请求后,会返回该文件所在的DataNode节点的IP地址和块ID等信息。客户端向NameNode请求文件的位置:客户端想要访问一个文件时,会向NameNode发送一个请求,要求获取该文件在HDFS上的位置信息。DataNode返回数据给客户端:DataNode收到客户端的读取请求,从本地磁盘读取相应的数据块,并将其返回给客户端。客户端合并数据:如果所请求的数据块不止一个,客户端可以根据需要将多个数据块的数据合并成一个完整的文件。

2023-06-20 21:15:00 1448

原创 虚拟内存的概念

虚拟内存一般指的是操作系统在使用硬盘上的空间来模拟物理内存的技术,在计算机内部形成一个虚拟的地址空间。虚拟内存和物理内存之间可以互相访问。当应用程序请求内存的时候,操作系统会根据需要进行内存交换,把当前不需要的部分存储到磁盘上,并将要使用的部分从磁盘读取到内存中,这样就充分利用了硬盘空间,使得计算机的运行效率更高,能够处理更大的数据,也提升了系统稳定性。物理内存对于计算机的运行至关重要,其中的数据被CPU和其他硬件组件随时访问和修改,速度非常快,经常作为缓存使用。因此,虚拟内存的使用并不总是可靠的。

2023-06-20 18:30:00 337

原创 逻辑地址和物理地址

逻辑地址(Logical Address)和物理地址(Physical Address)是计算机内存管理中的两个重要概念。逻辑地址:是指程序在运行过程中使用的地址,也称为虚拟地址(Virtual Address)。它是由CPU生成的,用于访问内存中的数据。逻辑地址的大小和位数取决于处理器的架构和操作系统的设计,通常是一个定长的二进制数值。在执行指令时,CPU通过将逻辑地址转化为物理地址来获取数据。物理地址:是指内存中实际的地址,也称为实地址(Real Address)。

2023-06-20 18:15:00 8456

原创 Java代码实现按序打印(多线程)

使用synchronized关键字同步线程,线程会在while循环中等待条件满足。如果当前要打印的数字为1,则打印1,并将当前要打印的数字设置为2。最后,调用notifyAll()方法唤醒所有正在等待的线程,让它们继续执行。

2023-06-19 19:15:00 427

原创 leetcode 1114.按序打印

请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。链接:https://leetcode.cn/problems/print-in-order。尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在操作系统中的调度顺序。三个不同的线程 A、B、C 将会共用一个 Foo 实例。线程 B 将会调用 second() 方法。线程 A 将会调用 first() 方法。线程 C 将会调用 third() 方法。

2023-06-19 19:00:00 100

原创 leetcode 104.二叉树的最大深度

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。给定一个二叉树,找出其最大深度。

2023-06-16 20:00:00 62

原创 leetcode 543.二叉树的直径

该算法使用了深度优先搜索的思想,在遍历二叉树的每个节点时,计算以当前节点为根的子树的深度,并更新直径的最大值。在返回上层递归之前,将以当前节点为根的子树的深度返回给上层递归,用于计算祖先节点的直径。

2023-06-16 20:00:00 87

原创 java代码实现前序遍历、中序遍历和后序遍历

首先,需要定义一个二叉树节点的类TreeNode。它将包含三个属性:节点值val、左孩子节点left和右孩子节点right。接下来,可以使用递归方法来遍历二叉树并打印出每个节点的值。这里提供三种遍历方式。

2023-06-15 21:45:00 542

原创 leetcode 226.翻转二叉树

首先递归交换当前节点的左右子树,并在返回时更新父节点的左右孩子指针。

2023-06-15 21:30:00 42

原创 leetcode 101.对称二叉树

思路:使用递归函数 check(left, right),通过比较左、右子树来判断两个节点是否相等。如果两个节点都为空,说明已经检查完毕;如果其中有一个为空,或者它们的值不相等,那么就不是对称二叉树;否则继续递归检查它们的子节点。

2023-06-15 20:00:00 43

原创 二叉树的中序遍历

综上,Stack和Deque虽然都是使用Java实现栈的类,但它们具有不同的接口、实现方式和用途,需要根据具体的情况选择合适的类。Java中Deque和Stack都是用于实现栈(stack)数据结构的类,但它们有一些区别。

2023-06-15 19:30:00 410

原创 Java中Deque和Stack的区别

综上,Stack和Deque虽然都是使用Java实现栈的类,但它们具有不同的接口、实现方式和用途,需要根据具体的情况选择合适的类。Java中Deque和Stack都是用于实现栈(stack)数据结构的类,但它们有一些区别。

2023-06-15 19:00:00 725

原创 Java中List、Set、Map的区别和实现方式

List是Java集合框架中最基本和最常用的一种数据结构,它是有序集合,可以允许重复的元素。List提供了按照索引来插入、删除和获取指定位置上的元素等操作。ArrayList:基于数组实现,以及动态扩容。LinkedList:基于链表实现,适合于频繁添加、删除元素操作。

2023-06-15 18:45:00 1479

原创 leetcode 309.最佳买卖股票时机含冷冻期

。然后初始化第一天的各项值,即:买入价为相反数(因为买了股票意味着花费了钱),售价为0,即还没卖,处于放空状态,冷却期为0,即已完成了当天的所有交易。代码首先对基础情况进行了处理,如果价格为空或者长度小于等于1,则无法交易,返回0。循环结束后,返回sell数组中存储的最后一个元素,即可得到买卖股票的最大收益。

2023-06-14 22:00:00 182

原创 leetcode 279.完全平方数

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。

2023-06-14 20:30:00 816

原创 leetcode 221.最大正方形

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。链接:https://leetcode.cn/problems/maximal-square。所以不用单独判断 数组为空 或者 只有一列(组不成正方形)的情况,如没有标注,应加上如下判断。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。动态规划:声明二维数组dp用来记录当前位置的最大边长。来源:力扣(LeetCode)

2023-06-14 18:15:00 44

原创 leetcode 152.乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。是Java中的一个方法,它可以用来将一个数组中的一部分元素复制到另一个数组中。链接:https://leetcode.cn/problems/maximum-product-subarray。同时记录最大值和最小值,这样的话如果当前元素是正数那么就乘最大值,如果当前元素是负数就乘最小值。方法可以避免手动循环,并且代码可读性更好,同时也能提升程序效率。子数组 是数组的连续子序列。

2023-06-13 21:00:00 963

原创 leetcode 139.单词拆分

当我们正在计算dp[i-1]时,我们需要检查所有小于i的j,如果dp[j-1]为true并且s.substring(j,i)出现在字典中,则dp[i-1]为真。换句话说,i之前的某个位置j可以形成一个可拆分的子字符串,且剩余部分也可以拆分成字典中的单词。具体而言,如果dp[j-1]为真,且s.substring(j,i)在字典中出现,则dp[i-1]也为真。在这个问题中,我们可以使用一个布尔数组dp[]来表示以i作为结尾的字符串是否可以拆分成字典中的词。如果dp[n]为真,则s可以被拆分成多个字典中的词。

2023-06-13 18:00:00 963

原创 多态的概念、特点

例如,定义一个动物类 Animal,里面包含一个方法 eat(),然后定义两个子类 Cat 和 Dog,它们继承了 Animal 类,并重写了 eat() 方法,Cat 类的 eat() 方法是吃鱼,Dog 类的 eat() 方法是吃肉。在调用 eat() 方法时,animal1 会调用 Cat 类中的 eat() 方法,输出 “Cat is eating fish.”,而 animal2 会调用 Dog 类中的 eat() 方法,输出 “Dog is eating meat.”,这就体现了多态的特性。

2023-06-13 09:12:59 512

原创 leetcode 647.回文子串

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。子字符串 是字符串中的由连续字符组成的一个序列。回文字符串 是正着读和倒过来读一样的字符串。

2023-06-12 17:38:41 964

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除