- 博客(290)
- 资源 (23)
- 收藏
- 关注
原创 【算法系列】十大经典排序算法
排序算法时间复杂度 (最好)时间复杂度 (平均)时间复杂度 (最坏)空间复杂度稳定性冒泡排序O(n)O(n²)O(n²)O(1)稳定选择排序O(n²)O(n²)O(n²)O(1)不稳定插入排序O(n)O(n²)O(n²)O(1)稳定希尔排序O(n log n)取决于增量序列O(1)不稳定归并排序O(n log n)O(n log n)O(n log n)O(n)稳定快速排序O(n log n)O(n log n)O(n²)
2025-03-05 14:00:42
918
原创 【算法系列】桶排序算法介绍及实现
桶排序(Bucket Sort)是一种基于分组的排序算法,其核心思想是将一组数据按某种规则分配到多个桶中,然后对每个桶中的数据进行单独的排序操作。通常情况下,桶排序适用于整数类型的数据,并且能够处理大量数据的情况。初始化桶:根据数据范围和分布情况,确定桶的数量和大小。分配数据到桶:将输入数据按照某种规则分配到对应的桶中。对每个桶进行排序:对每个桶中的数据使用适当的排序算法(如插入排序或归并排序)进行排序。合并桶:按顺序遍历所有桶,将排序后的结果依次收集起来。
2025-03-04 14:24:49
347
原创 【算法系列】基数排序
基数排序(Radix Sort)是一种非比较型整数排序算法,它通过逐位处理数字来实现排序。与快速排序、归并排序等基于比较的排序算法不同,基数排序利用了每个数字的位值进行排序,因此可以在O(n)的时间复杂度内完成排序任务。基数排序适用于对正整数、负整数以及固定长度的字符串进行排序。基数是指数字系统中的基本单位或基础值。它决定了一个数位上可能有多少种不同的符号或数值。例如,在十进制系统中,基数是10,因为每一位上有10种可能的符号(0到9)。
2025-03-03 19:59:24
1115
原创 【算法系列】经典的堆排序算法
堆排序(Heap Sort)是一种基于二叉堆数据结构的比较排序算法。它利用了完全二叉树的特性,将待排序的数据构造成一个最大堆或最小堆,然后通过不断移除堆顶元素并重新调整堆来实现排序。堆排序具有稳定的时间复杂度O(n log n),并且不需要额外的空间,因此在处理大规模数据时表现良好。堆排序作为一种经典的排序算法,不仅在理论上有重要的意义,在实际应用中也经常被使用。理解堆排序的工作原理及其背后的二叉堆数据结构,有助于更好地掌握其他高级算法和数据结构。
2025-03-02 14:00:04
832
原创 【算法系列】有趣的计数排序
计数排序是一种高效的非比较型排序算法,特别适用于处理整数且范围较小的数据集。通过统计每个元素出现的次数并使用累积频率来确定它们在输出数组中的位置,计数排序能够在O(n + k)的时间复杂度内完成排序任务。尽管其适用范围有限,但在特定场景下,计数排序能够提供显著的性能优势。
2025-02-26 19:42:10
842
原创 【算法系列】希尔排序算法
希尔排序是一种高效的排序算法,通过引入增量序列来减少数据项移动的次数,从而提高了排序效率。尽管其最坏情况下的时间复杂度可能不如快速排序或归并排序,但在实际应用中,希尔排序仍然具有较好的性能表现,尤其是在处理中小规模数据集时。主要优点简单易实现:希尔排序的实现相对简单,易于理解和调试。高效性:相较于传统的插入排序,希尔排序能够显著减少数据项的移动次数,从而提高排序效率。适用范围广:适用于中小规模数据集的排序任务。主要缺点。
2025-02-26 18:49:22
1057
原创 【算法系列】快速排序详解
Lomuto 分区方案:简单易懂,但相比 Hoare 分区方案,在某些情况下可能会有更多的交换操作,导致效率稍低。Hoare 分区方案:通常比 Lomuto 分区更高效,因为它减少了不必要的交换操作,从而减少了时间复杂度。三数取中法:通过选择数组的第一个、中间和最后一个元素中的中位数作为基准,减少最坏情况的发生概率。尾递归优化:通过优化递归调用栈的深度,避免栈溢出问题,特别适合处理大规模数据集。
2025-02-25 19:37:55
1197
原创 【算法系列】归并排序详解
归并排序是一种非常高效的排序算法,特别适合处理大规模数据集。尽管它的空间复杂度较高,但由于其稳定性和一致的时间复杂度,使其成为许多实际应用中的首选排序算法之一。
2025-02-25 17:27:23
491
原创 【算法系列】常见排序算法:冒泡排序、选择排序与插入排序
排序算法时间复杂度(最好)时间复杂度(平均)时间复杂度(最坏)空间复杂度稳定性冒泡排序O(n)O(n^2)O(n^2)O(1)稳定选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定插入排序O(n)O(n^2)O(n^2)O(1)稳定。
2025-02-25 16:33:42
839
原创 【Kafka系列】Kafka 消息传递保障机制
定义:在这种模式下,每条消息要么成功发送并处理,要么丢失。实现方式生产者发送消息后不等待任何确认(即acks=0),直接认为消息发送成功。消费者读取消息后立即提交偏移量(offset commit),即使后续的消息处理失败或崩溃,也不会重新消费该消息。定义:在这种模式下,每条消息至少会被处理一次,可能会重复处理。实现方式生产者发送消息时等待确认(通常设置acks=all),确保所有副本都接收到消息后再继续。消费者处理完消息后再提交偏移量。
2025-02-20 13:46:25
1013
原创 【Java 记事本】功能需求文档
本程序将实现记事本的基本功能,同时根据实际需求进行适当的功能扩展和优化,主要包括文件操作、编辑操作、格式设置、视图设置和帮助功能等。本功能需求文档明确了使用 Java 语言开发记事本程序的各项功能需求和非功能需求。在后续的开发过程中,将严格按照本需求文档进行设计、开发和测试,确保开发出的程序能够满足用户的需求,具有良好的性能、易用性和稳定性。
2025-02-18 19:02:36
965
原创 构建高效可靠的交易撮合系统:原理、实现与优化
通过上述设计和技术手段的应用,我们可以构建出一个既满足性能需求又具备良好扩展性的交易撮合系统。分布式部署:利用微服务架构将不同模块拆分到独立的服务中,提升系统的弹性和容错能力。实时数据分析:集成流处理框架(如 Apache Kafka 和 Flink)实现实时市场行情监控和风险预警。智能化决策支持:结合机器学习算法为用户提供更精准的投资建议和个性化服务。希望本文能够帮助读者理解交易撮合系统的背后原理及其开发要点!
2025-01-20 18:13:29
1220
原创 设计模式:构建高效且可维护的软件系统的基石
提供了一种创建一系列相关或相互依赖对象的接口,而不指定它们具体的类。这有助于保持代码的一致性和兼容性,特别是在跨平台的应用中。例如,在GUI库中,抽象工厂可以用来创建一组协调工作的控件集(按钮、文本框等),确保无论是在Windows还是macOS上都能获得一致的用户体验。设计模式不仅是解决问题的工具,更是交流思想的语言。掌握这些经典模式,可以帮助我们在面对复杂问题时找到正确的方向,写出既优雅又实用的代码。当然,选择合适的设计模式应当基于项目的实际情况和技术背景。
2025-01-19 19:33:15
1184
原创 Java线程池相关接口
它是一个抽象类,实现了ExecutorService接口,提供了线程池的基本实现。它是Java Executor框架的核心类,提供了线程池的基本操作,如提交任务、管理线程池、执行任务等。自定义执行器服务可以扩展AbstractExecutorService并覆盖其方法以提供自己的实现。这使开发人员可以创建适合其特定需求的执行器服务。
2025-01-14 19:50:44
561
原创 Spring Boot 整合 Redis 步骤详解
通过上述步骤,我们成功地在 Spring Boot 应用中集成了 Redis,并实现了基本的数据缓存功能。这不仅提高了应用的性能,还为开发者提供了更多灵活的数据管理手段。
2024-12-06 00:47:08
1819
1
原创 Spring Boot 整合 Druid 并开启监控
如果默认配置不能满足你的需求,你可以创建一个自定义的 Druid 配置类来覆盖默认设置。@Bean// 如果需要,可以在这里添加更多配置,如过滤器、拦截器等@Bean@Bean通过以上步骤,我们成功地在 Spring Boot 应用中集成了 Druid 数据库连接池,并开启了其监控功能。这不仅提高了数据库访问的效率,还为开发者提供了宝贵的调试和优化工具。希望这篇文章能够帮助你。
2024-12-05 19:39:32
2605
原创 spring boot 配置文件加载的加载和使用
properties与YAML格式的配置作用相同,但YAML使用缩进来表示层级关系,更加易读、易维护,也更加灵活。对于复杂配置,推荐使用YAML,但对于简单的配置项,也可以使用properties。在实际开发中,应用程序的配置文件可能会变得非常复杂,属性的数量也会很多。为了更好地组织和管理属性,可以使用Spring Boot的属性分组功能。以上两种配置方式作用是相同的,都定义了一个upload.file的分组。@Value也能从配置文件中获取属性的值,需要逐个属性进行绑定。声明一个JavaBean。
2024-12-05 16:40:27
848
原创 如何在 IntelliJ IDEA 中为 Spring Boot 应用实现热部署
通过以上步骤,你应该能够在 IntelliJ IDEA 中成功配置 Spring Boot 应用的热部署功能。这不仅可以大大提高开发效率,还能让开发者更加专注于业务逻辑的实现,而无需频繁地等待应用重启。希望这篇文章能帮助你在日常开发中更加高效地工作!
2024-12-05 13:19:35
1543
原创 用户密码存储方式的发展史
如果黑客入侵了系统,他们可以直接看到所有用户的密码,就像走进了一家无人看管的糖果店。这就像是给密码穿上了一件迷彩服,即使两个用户使用相同的密码,由于盐值不同,最终的哈希结果也会不同,从而有效防止了彩虹表攻击。用户注册时,后台先生成指定长度的随机字符串作为盐,然后把盐和用户密码拼接后计算整个串的哈希值,然后把上述盐和哈希值同时存入用户表中。安全性问题:尽管哈希后的密码不能直接反推原始密码,但是聪明的黑客们发明了彩虹表——一种预先计算好的哈希值表。风险:密钥管理困难,一旦密钥泄露,所有密码都会暴露。
2024-11-29 21:28:16
729
原创 高并发场景下用户余额更新的五种方法
在高并发场景下更新用户余额,可以通过多种方法来实现。事务和行级锁:简单易实现,但性能瓶颈明显。乐观锁:适用于读多写少的场景,减少锁的竞争。存储过程:减少网络开销,更好地控制事务,但实现复杂。消息队列/日志:解耦生产者和消费者,提高系统的可扩展性和稳定性,但增加了系统复杂性。分段锁思想:通过分段锁和内存中的变更批量写入数据库,提高并发性能,但实现复杂度较高。选择合适的方法取决于具体的业务需求和技术栈。希望这些信息对你有所帮助!
2024-11-28 22:21:48
1056
原创 Java 线程池介绍与实践
创建方式:直接使用 ThreadPoolExecutor 构造函数特点提供了更多的配置选项,如核心线程数、最大线程数、线程空闲时间、任务队列等。可以根据具体需求进行灵活配置。适用场景:适用于需要高度定制化线程池的场景,如高性能服务器、复杂业务逻辑等。
2024-11-18 21:48:06
737
原创 如何保证MySQL与Redis缓存的数据一致性?
从上面的四种方案看,似乎没有一种方案真正能解决并发场景下MySQL数据与Redis缓存数据一致性的问题。如果业务要求必须要满足强一致性,那么不管如何优化缓存策略,似乎都无法满足,那最好的办法是不用缓存。强一致性:它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大。解决方案是读写串行化,而此方案会大大增加系统的处理效率,吞吐量也会大大降低。另外在大型分布式系统中,其实分布式事务大多数情况都不会使用,因为维护成本太高了、复杂度也高。
2024-11-15 23:09:45
1151
1
原创 如何在有限内存下对外部大文件进行排序
外部排序算法是一种用于处理无法完全加载到内存中的数据集的排序方法。最常用的外部排序算法是多路归并排序,它分为两个主要步骤:分割 和 合并。分割:将大文件分割成多个小文件,每个小文件的大小应小于可用内存,以便可以对其进行内部排序。合并:将所有已排序的小文件合并成一个大的已排序文件。基于外部排序思想,我们把文件分成79个,分别存储10、11、12、……、87、88开头的数字,平均每个文件大小约为130MB(10GB/79)。
2024-11-11 21:42:12
908
原创 如何在 Java 中使用 Canal 同步 MySQL 数据到 Redis
特别是将 MySQL 数据实时同步到 Redis,可以显著提升应用的性能和响应速度。Canal 是阿里巴巴开源的一个数据库 Binlog 同步工具,可以实时捕获 MySQL 的 Binlog 日志并将其同步到其他存储系统。Canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,并且配置binlog模式为row。的内容,还要注意JDK版本及配置。在 MySQL 中插入、更新或删除数据,观察 Java 应用是否能够实时捕获这些变化并将数据同步到 Redis。
2024-11-07 22:57:55
1402
原创 在docker中搭建redis哨兵环境
哨兵可以监控主节点和从节点的状态,并在主节点失效时自动进行故障转移。本文详细介绍了如何在docker中配置主节点、从节点和哨兵节点,并提供了详细的步骤和示例。出现该问题的原因是redis sentinel(哨兵)会更改节点和哨兵的conf文件,这涉及文件权限问题。最简单的一种处理方案:挂载文件时,选择挂载conf文件所在的目录,而不直接挂载conf文件。:哨兵在报告主节点和从节点的地址时,会使用主机名而不是 IP 地址。你应该能看到主节点和从节点的信息,确认哨兵已经正确监控主从节点。
2024-11-06 14:06:10
1218
原创 Redis 组网方式入门
Redis 提供了多种组网方式,每种方式都有其适用的场景和优缺点。选择合适的组网方式需要根据具体的业务需求、性能要求和运维能力来决定。例如,对于简单的应用,单实例模式或主从复制模式可能就足够了;而对于高可用性和高性能要求的场景,集群模式或哨兵模式可能是更好的选择。希望本文能帮助读者更好地理解和选择适合自己的 Redis 组网方式。
2024-11-05 00:04:47
867
原创 Redis主从复制入门
Redis 主从复制是一种数据复制机制,它允许将一个 Redis 服务器的数据复制到多个其他 Redis 服务器。这种机制可以用来实现读写分离、提高系统的可用性和容错性。
2024-10-27 14:07:08
574
原创 在MySQL中存储IP地址的最佳实践
在现代网络应用中,IP地址是常见的数据类型之一,无论是用于日志记录、访问控制还是数据分析。正确地存储和处理IP地址对于数据库性能和数据准确性至关重要。本文将探讨在MySQL中存储IP地址的不同方法,并提供最佳实践建议。
2024-10-26 23:54:50
1744
原创 IPv6地址的简化规则及Java中的处理方法
通过上述简化规则和Java代码示例,你可以在实际应用中轻松地处理和简化IPv6地址。合理利用这些规则不仅可以提高可读性,还能优化存储和传输效率。希望本文能够帮助你在处理IPv6地址时更加得心应手。
2024-10-26 15:43:20
1385
1
原创 Redis进阶
单个Redis命令的执行是原子性的,但Redis没有在事务上增加任何维持原子性的机制,所以Redis事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。Redis发布订阅(pub/sub)是一种消息通信模式:发送者发送消息,订阅者接收消息。
2024-10-21 23:08:31
352
原创 【并发控制策略详解】悲观锁与乐观锁
悲观锁(Pessimistic Locking)是一种假设最坏情况的锁定策略。它认为在处理过程中很可能发生冲突,因此在整个数据处理过程中会对数据进行锁定。当一个事务获取了某个数据项上的悲观锁之后,其他事务就不能对该数据项进行任何操作,直到第一个事务释放了这个锁。乐观锁(Optimistic Locking)是一种假设最好的情况的锁定策略。它认为在处理过程中不太可能发生冲突,因此允许事务自由地读取数据,但在提交更改前检查是否有其他事务已经修改了该数据。如果检测到数据已被更改,则当前事务会被回滚或者重新执行。
2024-10-20 19:35:45
1116
原创 Redis的Bin目录文件及常用命令
什么是基数:比如数据集{1, 3, 5, 5, 7, 7, 8}的基数集为{1, 3, 5, 7, 8},基数(不重复元素个数)为5。假设西经为负,东经为正,南纬为负,北纬为正,即[-180, 180],[-90, 90]。Redis HyperLogLog是用来做基数统计的算法,它的优点是在输入元素的数量或体积非常大时,计算基数所需要的空间总是固定的、并且是很小的。集合的成员是唯一的,但分数是可以重复的。一个列表最多可以包含。实际应用中,可以继续做二分操作,通常二分操作的次数记为N,它是可以自定义的。
2024-10-20 19:20:24
953
原创 缓存系统的三大挑战:缓存击穿、缓存穿透和缓存雪崩
缓存击穿是指一个非常热门的数据(通常是热点数据)在缓存中过期或被删除后,同时有大量的请求并发访问该数据。由于缓存中数据已过期,这些请求会直接穿透到数据库,对数据库造成瞬间的巨大压力。缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,每次请求都会穿透缓存直接访问数据库,而数据库中也没有该数据。这种情况会导致大量的无效请求直接打到数据库上,增加了数据库的压力。
2024-10-08 16:09:25
892
原创 Redis BigKey问题
例如,如果需要频繁地查询某个范围内的元素,可以考虑使用有序集合(Sorted Set)而不是列表(List)。如果需要在网络上传输BigKey的数据(如主从复制、集群同步等),可能会导致网络传输延迟增加,影响系统的整体性能。例如,将一个大的列表拆分成多个小列表,或者将一个大的哈希表拆分成多个小哈希表。在进行RDB持久化或AOF日志备份时,BigKey会导致备份文件变得非常大,从而增加备份和恢复的时间。通过以上方法,可以有效地发现和解决Redis中的BigKey问题,提高系统的性能和稳定性。
2024-10-08 15:26:21
1311
原创 一个简单的SQL面试题
平时使用join写SQL时一般使用的等值连接,即在on后面紧跟着表的主键等于另一个表的某一列,很少使用不等于或其他比较操作符判断。在语法上,可以使用等值连接以外的方式,这种类型的连接被称为非等值连接或范围连接。但在实际应用中,使用非等值连接可能会导致较大的中间结果集,特别是在数据量大的情况下,这可能会影响查询性能。
2024-10-03 18:27:32
2337
原创 在Java中如何利用ClassLoader动态加密、解密Class文件
在Java开发中,保护代码的安全性是一个重要的课题。为了防止代码被轻易反编译,我们可以使用ClassLoader来动态地对Class文件进行加密和解密。本文将详细介绍如何实现这一过程,并提供完整的示例代码。
2024-09-24 23:03:27
936
4
原创 MySQL索引测试
表中没有任何数据时,无论是否使用索引,查询结果都是一样的。但直接扫描表(全表扫描)可能比使用索引更快,因为即使是空表,访问索引也需要一定的开销,但并不会带来性能提升。使用如下SQL语句建表,并使用b列作为条件查询。按照索引最左匹配原则,此时应该无法使用索引。但如果表中只包含主键列和索引列,此时查询优化器还是会使用索引。在MySQL中,即使表中没有数据,查询优化器也会考虑使用索引来执行查询。但在某些情况下,查询优化器可能会选择不使用索引,这通常是基于成本效益分析的结果。
2024-09-20 19:31:51
425
原创 MyISAM引擎介绍
MyISAM是MySQL的一种存储引擎,它以其简单性和高速度而著称。在早期的MySQL版本中,MyISAM广泛使用,尤其是在那些以读操作为主的应用场景中。然而,随着InnoDB存储引擎的成熟和普及,MyISAM的使用逐渐减少。
2024-09-18 21:16:31
1050
Hyperledger Fabric kafka配置
2018-03-09
java记事本
2015-09-30
FilterAndInterceptor
2013-08-20
WebService开发入门(XFire)
2013-05-09
jQuery 1.4.1 速查表
2013-04-28
经典游戏-俄罗斯方块(二)
2013-03-27
SSI框架整合开发
2013-01-05
struts2_validation
2012-12-24
MD5校验工具
2012-04-24
ecside_1.30_full
2012-03-29
ECSide官方文档
2012-03-29
使用ant从多个SourceFolder的项目中导出jar包的测试项目
2012-03-19
数字转换成中文大写
2012-03-15
功能强大的java版代码行数统计程序
2012-02-21
点灯——好玩的java小游戏【免费】
2010-07-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人