- 博客(102)
- 问答 (1)
- 收藏
- 关注
原创 JavaEE 初阶第二十期:网络编程“通关记”(二)
本文介绍了JavaEE中TCP流套接字编程的核心概念和实现方法。重点讲解了ServerSocket和Socket两个关键类的使用方式,包括构造方法和常用API。通过一个EchoServer示例代码,展示了TCP服务端的基本实现流程:建立连接、处理请求、响应客户端。同时指出了开发中需要注意的三个关键问题:缓冲区刷新、文件泄露和多线程处理。与UDP协议相比,TCP是有连接的协议,需要显式管理连接状态。最后提供了多线程解决方案,使服务器能同时处理多个客户端请求。文章为Java网络编程初学者提供了实用指导。
2025-08-22 16:08:20
175
14
原创 Java数据结构第二十六期:解密位图,海量数据处理的 “空间魔法”
本文介绍了Java中的位图数据结构及其应用。位图是一种紧凑表示布尔值的数组,每个元素对应一个位,适合处理海量不重复整数数据。通过40亿整数查询案例,展示了位图如何用476MB空间解决内存不足问题。文章详细讲解了位图实现原理,包括set()、get()、reSet()方法的核心位运算逻辑,并提供了完整的Java实现代码。最后指出位图在高效存储、集合运算、去重计数及布隆过滤器等场景的重要应用价值,特别适合处理大规模数据的布尔状态判断需求。
2025-08-18 02:03:32
702
28
原创 回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(一)
这篇文章介绍了四种常见排列组合问题的算法解法:全排列、子集、子集异或总和及含重复元素的全排列。作者通过决策树分析、递归回溯和剪枝优化等技巧,详细讲解了每个问题的解决思路,并提供了完整的Java代码实现。文章重点阐述了如何利用布尔数组标记元素使用状态以避免重复,以及通过排序和条件判断来优化剪枝策略。这些方法体现了回溯算法在解决组合问题中的高效性和灵活性。
2025-08-17 16:07:47
1037
38
原创 JavaEE 初阶第十九期:网络编程“通关记”(一)
本文介绍了JavaEE网络编程基础,重点讲解了UDP数据报套接字的使用方法。主要内容包括:1.网络编程概念与应用场景,说明通过网络获取资源与本地操作的区别;2.Socket套接字分类,对比TCP和UDP协议的特点;3.详细讲解UDP数据报套接字API,包括DatagramSocket和DatagramPacket类的使用;4.通过EchoServer和EchoClient示例演示简单的网络通信流程;5.扩展实现字典服务器功能,展示如何基于UDP构建英译汉服务。
2025-08-16 15:48:07
1243
29
原创 JavaEE 初阶第十八期:叩开网络世界的大门
本文介绍了JavaEE初阶网络基础知识,主要包括:1)网络发展史,从独立封闭的主机系统到TCP/IP协议推动的网络互连;2)网络分类,区分局域网(LAN)和广域网(WAN);3)IP地址与端口号的概念及作用;4)网络协议的定义、功能及其五元组标识方法;5)协议分层的优势,通过解耦简化复杂网络通信;6)TCP/IP五层模型(物理层、数据链路层、网络层、传输层和应用层)的功能划分。这些内容为理解现代网络通信奠定了理论基础。
2025-08-12 17:57:01
848
43
原创 JavaEE 初阶第十七期:文件 IO 的 “管道艺术”(下)
本文介绍了JavaEE中文件操作的基础知识:1. 使用OutputStream实现文件写入,包括单个字节和字节数组写入方式,通过FileOutputStream示例演示了追加写入操作;2. 讲解了字符流Reader和Writer的使用方法,分别展示了按字符读取和字符数组读取的实现代码;3. 提供了文件搜索的完整示例,通过递归扫描目录查找指定文件并支持用户交互式删除功能。文章包含多个可直接运行的代码示例,涵盖了Java文件IO的基础操作和实际应用场景。
2025-08-11 17:18:28
434
5
原创 JavaEE 初阶第十六期:文件 IO 的 “管道艺术”(中)
本文介绍了Java文件操作和内容读取的基础知识。在文件操作部分,演示了如何打印目录文件、创建目录、重命名文件以及检查用户权限,提供了File类的常用方法示例。在文件内容读取部分,重点讲解了数据流的概念,区分了字节流和字符流,并以InputStream为例详细说明了文件读取的三种方法:无参数读取单个字节、1个参数批量读取和3个参数指定位置读取。文章通过具体代码示例展示了如何使用FileInputStream读取文件内容,包括ASCII码输出和字节数组处理方式,类比了"食堂打饭"的生动场景帮
2025-08-11 10:45:31
945
24
原创 动态规划算法的欢乐密码(四):简单多状态DP问题(下)
本文讲解了四种股票买卖问题的动态规划解法。1)含冷冻期问题:定义三种状态(买入、可交易、冷冻期),通过状态转移方程计算最大利润;2)含手续费问题:将状态分为"买入"和"卖出",在卖出时扣除手续费;3)最多交易两次问题:增加交易次数维度,处理不同交易次数下的状态转移;4)最多交易k次问题:在第三种问题基础上,将交易次数扩展为k次。所有解法都采用动态规划,通过状态转移方程和适当的初始化来计算最大利润,时间复杂度均为O(n)。
2025-08-09 21:42:40
758
33
原创 JavaEE 初阶第十五期:文件 IO 的 “管道艺术”(上)
本文介绍了JavaEE中文件操作的基础知识,包括文件概念、路径和类型,以及Java中的File类操作。文件作为数据存储的基本单位,包含内容和元信息,通过树形结构组织管理。文件路径分为绝对路径和相对路径,文件类型主要有文本文件和二进制文件。Java通过File类提供文件操作功能,包括创建、删除、判断文件属性等,并支持绝对路径和相对路径处理。文章通过代码示例演示了File类的常用方法,如获取文件信息、检查文件属性等,为Java文件操作提供了基础指导。
2025-08-07 18:43:19
637
25
原创 飞算JavaAI深度解析:从入门到对比
飞算JavaAI是一款专注于Java业务逻辑代码生成的AI工具,能够将自然语言需求自动转化为完整的业务模块代码。用户通过官网注册后,输入业务需求即可快速生成包含Controller、Service、Dao层的标准化代码。相比通用大模型和代码补全工具,飞算JavaAI在Java业务开发领域具有更高的效率和专业性,特别适合快速搭建项目原型和批量生成CRUD代码。虽然有时需要微调,但它能显著提升开发效率,让开发者更专注于业务逻辑设计。未来AI代码生成技术有望实现更复杂的业务理解和框架支持。
2025-08-05 17:11:43
681
原创 JavaEE初阶第十四期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十二)
在JUC常见类部分,详细讲解了Callable接口实现带返回值的多线程计算、ReentrantLock的可重入特性及与synchronized的区别、Semaphore信号量机制的资源管理,以及CountDownLatch的线程协调功能。在线程安全集合部分,分析了多线程环境下ArrayList的安全使用方案,重点对比了Hashtable与ConcurrentHashMap的锁机制差异,指出ConcurrentHashMap通过分段锁实现更高并发性能的优势。
2025-08-05 01:24:25
893
19
原创 JavaEE初阶第十三期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十一)
本文介绍了JavaEE中的锁策略和CAS机制。主要对比了乐观锁与悲观锁、重量级锁与轻量级锁、挂起等待锁与自旋锁、公平锁与非公平锁等策略的特点及应用场景。详细讲解了synchronized的工作原理,包括其锁升级机制(偏向锁→自旋锁→重量级锁)和优化策略(锁消除、锁粗化)。此外,深入解析了CAS(比较并交换)机制的原理、在原子类和自旋锁中的典型应用,以及可能出现的ABA问题及其解决方案(引入版本号)。文章通过代码示例展示了AtomicInteger和自旋锁的实现方式,帮助读者理解多线程编程中的关键同步机制。
2025-08-03 17:09:19
861
33
原创 JavaEE初阶第十二期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十)
本文介绍了JavaEE中定时器的实现原理与代码实践。首先讲解了标准库中的Timer类使用方法,通过TimerTask实现定时任务调度。接着详细阐述了自主实现定时器的过程:1)使用优先级队列(堆)存储任务,按执行时间排序;2)创建检测线程循环检查任务是否到期;3)通过synchronized解决线程安全问题;4)使用wait/notify机制避免忙等待问题。文章最后给出了完整实现代码,包括MyTimerTask任务封装类和MyTimer定时器类,演示了如何使用自定义定时器安排多个任务按预定时间执行。
2025-07-27 23:59:27
605
49
原创 JavaEE初阶第十一期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(九)
线程池是多线程编程中的重要组件,通过预创建线程并循环使用,解决了频繁创建/销毁线程的开销问题。文章详细介绍了线程池的核心概念,包括核心线程与临时线程的区别、任务队列机制和四种拒绝策略(AbortPolicy、CallerRunsPolicy等)。特别讲解了ThreadFactory工厂模式的应用,并对比了标准库提供的四种线程池创建方式(Fixed/Cached/SingleThread/Scheduled)。最后展示了一个简单线程池的实现方案。
2025-07-26 17:20:38
1039
41
原创 JavaEE初阶第十期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(八)
阻塞队列是一种线程安全的队列,通过put和take方法实现阻塞式操作,当队列满/空时会自动阻塞线程。文章详细讲解了生产者消费者模型,类比包饺子过程说明其工作原理,并分析了该模型的三大优点(平衡处理能力、解耦、支持并发)和三大缺点(复杂性、资源开销、性能瓶颈)。随后展示了Java标准库中的BlockingQueue接口实现类,并通过代码示例演示基本用法。最后完整实现了一个自定义的阻塞队列MyBlockingQueue,包括数组存储结构、线程安全控制(synchronized)以及阻塞唤醒机制。
2025-07-21 16:05:49
1036
48
原创 动态规划算法的欢乐密码(三):简单多状态DP问题(上)
《算法的魔法世界》专栏通过四个经典动态规划问题展示了解题思路:1.按摩师问题使用状态转移方程f[i]=g[i-1]+nums[i]和g[i]=max(f[i-1],g[i-1]);2.环形房屋抢劫问题转化为两次线性打家劫舍;3.删除点数问题通过预处理数组转化为类似打家劫舍问题;4.粉刷房子问题通过三维状态表示颜色选择。每个问题都详细分析了状态表示、转移方程和边界条件,提供了完整的Java实现代码,展示了动态规划在优化问题中的灵活应用。
2025-07-19 18:30:01
1077
43
原创 JavaEE初阶第九期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(七)
假设有一个几个G的大文件,当我们想打开文件查看内容时,如果把整个文件加载显示出来显示给用户,就会有明显的卡顿,但按照懒汉模式,只加载一小部分就显示给用户,效率就会大大提高。刚才的单例模式只是在第一次调用的时候,才会涉及到线程安全问题,只要对象创建完毕,后序都是直接返回的操作,就不涉及修改了。如果所有的代码都是一个人写的,那么有没有单例无所谓,就能人为保证只有一个实例,这些规则自己都能遵守,但在实际工作中,多人一起分工协作,某人对某个方法进行封装,别人无法调用,强制去使用某种规则。
2025-07-18 00:34:37
624
40
原创 Java数据结构第二十五期:红黑树传奇,当二叉树穿上 “红黑铠甲” 应对失衡挑战
本文详细介绍了红黑树的概念、性质及Java实现。红黑树是一种自平衡二叉查找树,通过颜色属性(红/黑)和特定规则确保近似平衡。文章重点讲解了红黑树的节点定义、插入操作(包括颜色调整和旋转处理)以及验证方法(检查颜色连续性和路径黑节点数量)。此外,还对比了AVL树与红黑树的特性差异,并列举了红黑树在编程语言库、数据库系统和文件系统等领域的应用场景。全文提供了完整的Java代码实现,包括节点结构、插入逻辑和旋转操作等关键算法。
2025-07-16 15:29:07
1268
43
原创 JavaEE初阶第八期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(六)
本文介绍了Java多线程编程中的volatile关键字和wait/notify机制。volatile通过内存屏障保证变量修改的可见性,但无法保证原子性,与synchronized作用不同。wait/notify用于线程间协调,wait会让线程释放锁并进入等待队列,notify/notifyAll则唤醒等待线程。文章通过多个代码示例演示了这些机制的使用场景和注意事项,包括如何避免线程饿死、正确使用同步块等,并分析了wait的两个阻塞阶段和notify的随机唤醒特性。
2025-07-09 21:55:34
1338
62
原创 优选算法的链脉之韵:链表专题
本文介绍了链表算法中的常用技巧和典型例题解析。重点讲解了虚拟头节点、快慢指针等技巧的应用,并通过5道经典题目(两数相加、两两交换节点、重排链表、合并K个有序链表、K个一组翻转链表)详细展示了链表操作的实现方法。每道题目都提供了完整的Java代码实现,包括如何处理边界条件、反转链表的具体步骤以及分治思想的应用。这些例题涵盖了链表操作的核心知识点,对提高链表算法解题能力具有重要指导意义。
2025-07-07 01:39:39
1710
41
原创 JavaEE初阶第七期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(五)
本文探讨了Java多线程编程中的两个核心问题——死锁和内存可见性。在死锁部分,通过经典案例展示了多线程竞争资源导致的互相等待现象,分析了死锁的四个必要条件,并给出了通过破坏循环等待条件来避免死锁的解决方案。在volatile部分,揭示了编译器优化可能导致的内存可见性问题,通过具体代码示例说明volatile关键字如何确保变量的内存可见性,防止线程因寄存器缓存而读取到过期数据。文章通过理论分析结合代码实践,为JavaEE初学者提供了处理并发问题的实用方法。
2025-07-04 16:58:35
1258
45
原创 JavaEE初阶第六期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(四)
JavaEE初阶教程:深入理解synchronized关键字 摘要: 本文详细讲解了Java中synchronized关键字的使用方法和特性。synchronized通过加锁机制实现线程互斥,确保代码块的原子性执行。关键特性包括:1)互斥性,同一时刻只允许一个线程执行同步代码;2)可重入性,同一线程可多次获取同一把锁。文章通过多个代码示例对比了不同加锁位置(循环内/外)对性能的影响,并分析了synchronized与C++锁机制的差异。此外还介绍了synchronized修饰成员方法和静态方法的不同效果,以
2025-07-01 19:45:15
1994
42
原创 JavaEE初阶第五期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(三)
本文介绍了Java线程的状态与线程安全问题。首先通过代码示例展示了线程的6种状态(NEW、RUNNABLE、BLOCKED等)及其转换条件,说明操作系统线程生命周期与Thread对象的不完全一致性。然后通过count++案例分析了线程不安全的原因:多线程并发修改共享变量、非原子性操作、指令重排序和内存可见性问题。文章指出,线程安全的核心在于确保多线程环境下程序的正确性,而线程不安全主要源于CPU调度随机性导致的操作时序错乱。最后解释了原子性概念,强调其对于数据一致性的重要性。
2025-06-30 21:31:22
1099
29
原创 贪心算法的 “反直觉” 时刻(一):重新认识局部最优
《贪心算法:魔法世界中的最优解探索》 贪心算法是一种通过局部最优选择寻求全局最优解的算法策略,其核心在于"活在当下"的决策思路。本文通过四个经典例题展示了贪心算法的实际应用: 柠檬水找零问题中,优先使用10美元找零的策略可确保交易顺利进行; 数组减半问题证明,反复减半当前最大元素是最优操作方案; 最大数构造问题通过自定义排序规则实现最优排列; 摆动序列问题通过识别波峰波谷来获取最长子序列。 每个案例都包含详细的代码实现和数学证明,揭示了贪心算法虽简单但需要严谨验证的特点。这些例题展示了贪
2025-06-28 22:48:50
1035
26
原创 JavaEE初阶第四期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(二)
后台进程,当线程没运行完,进程可以就结束,无论有多少个后台进程,都无法阻止进程结束。对应的还有前台进程,当线程没运行完,进程就不会结束,当有多个线程时,就得所有线程结束才能结束进程。虽然join会触发阻塞,但也不一定会触发,比如在主线程等待t线程之前,t线程已经结束了,此时join就不会阻塞。调用start的方法本身就很快,一旦执行start,代码就会自动往下执行,不会产生任何的阻塞等待。当然也可以让两个线程同时等待对方,但是这样写代码是意义的,会造成两个线程都无法结束,都无法完成对方的等待操作。
2025-06-24 22:28:52
1054
41
原创 Java数据结构第二十四期:探秘 AVL 树,当二叉搜索树学会 “自我调节”
本文介绍了AVL树的基本概念和实现原理。首先回顾二叉搜索树的特点及其局限性,引出AVL树的必要性。AVL树通过平衡因子(左右子树高度差不超过1)实现自平衡,确保操作时间复杂度维持在O(logN)。文章详细阐述了AVL树的节点定义、插入操作、四种旋转调整方式(右单旋、左单旋、左右双旋、右左双旋)的实现逻辑,并提供了验证AVL树平衡性的方法。最后分析AVL树的性能特点:查找、插入、删除均为O(logN)时间复杂度,具有高效查找优势,但需付出额外存储和维护平衡的开销。
2025-06-23 11:32:40
880
26
原创 JavaEE初阶第三期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(一)
本文介绍了Java多线程编程基础,包括线程概念、创建方式及实际应用。首先解释了线程与进程的关系,指出线程作为轻量级进程可提高资源利用率。然后详细讲解了四种创建线程的方法:继承Thread类、实现Runnable接口、使用匿名内部类以及lambda表达式,通过代码示例展示了每种方法的具体实现。文章还介绍了Thread.sleep方法的使用,并演示了如何通过jconsole工具观察线程运行状态。最后通过"吃烧鸡"的比喻,生动说明了多线程模型的优缺点,强调合理使用线程数量才能达到最佳性能。
2025-06-21 20:10:32
771
12
原创 JavaEE初阶第二期:计算机是如何 “思考” 的(下)
简单来说,当你打开一个应用程序(比如浏览器、文本编辑器、游戏),操作系统就会为它创建一个或多个进程。比如当我们打开任务管理器的时候,第一个标签页就是进程,里面的内容就是在这台运行起来的程序,也就是进程。描述:操作系统使用结构体把一个进程的关键属性表示出来,这样的结构体还有一个统称,PCB(进程控制块)。这个名称适用于各种操作系统,但具体到不同的操作系统上,会有专门的对应的名字,比如在Linux上称为task struct。组织:操作系统使用一定的数据结构,把上述对象变量组织起来,从而实现增删查改的功能。
2025-06-15 20:12:32
928
5
原创 JavaEE初阶第一期:计算机是如何 “思考” 的(上)
寄存器和内存都是计算机中用于存储数据的重要组件,但它们在功能、速度、容量和用途上有着显著的区别。CPU,全称中央处理器,被誉为计算机的“大脑”。它是计算机的核心计算单元,负责解释计算机指令、处理计算机软件中的数据,并管理计算机的各项操作。CPU和程序员的关系是非常密切的,因为程序员写的代码都是靠CPU运行的。内存速度较慢、容量较大、成本较低、易失性(大多数RAM是易失性存储器,这意味着当计算机断电时,存储在内存中的数据会丢失)。常见的指令类型有数据传输指令、算术指令、逻辑指令、控制流指令等。
2025-06-14 21:23:47
910
2
原创 动态规划算法的欢乐密码(二):路径问题
这里与上一题不同的是,上一题的参数是两个整数,这道题是一个二维数组,需要注意下标的映射,原始数组的下标与填表时的下标是[i-1][j-1]。接下来根据最近的一步划分问题,如下图所示,可以从A、B、C到达最后一行,那么此时的最小路径和分别为dp[i-1][j-1](表示为x)、dp[i-1][j](表示为y)、dp[i-1][j+1](表示为z),到达最后一行的状态表示dp[i][j]为前一个位置的最小路径和再加上它本身,所以状态转移方程为dp[i][j]=min(x,y,z)+matrix[i][j]。
2025-06-13 22:38:55
1236
25
原创 二叉树深搜:在算法森林中寻找路径
根据前面学过的知识,对一棵二叉搜索树进行中序遍历,得到的结果是一个有序序列,所以我们可以先定义一个全局变量prev,当遍历到某一个节点时,用prev存储前一个节点值,如下图所示,根据中序遍历,当我们遍历到1时,将prev赋值为1,然后进行比较,后面的数如果越来越大,那就是二叉搜索树。当我们遍历到某一节点时,如果发现左右子树均为空,并且节点值为0,那我们就可以把这个节点剪掉。从根节点出发,先去遍历左子树,当遇到叶子节点时,返回该节点的布尔值,然后回溯到它的父亲节点,然后遍历右子树,再回溯父亲节点并遍历自身。
2025-05-15 19:56:36
1459
59
原创 MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)
一次查询需要从多张表中获取到数据,成为联合查询,或者叫表联合查询。在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就要从多个表中获取数据,如下图所示:要获取学生的基本信息和班级信息就要从学生表和班级表中获取,这时就需要使用联合查询。
2025-04-23 22:53:56
1831
105
原创 动态规划算法的欢乐密码(一):斐波那契数模型
当我们支付cost[i]向后走两步到达i+2位置时,再从i+2位置到达终点,花费为dp[i+2]+cost[n],所以递推公式为dp[i]=Math.min(dp[i+1],dp[i+2])+cost[i]。而题目也已经将前三个状态给了出来,dp[0]=0、dp[1]=1、dp[2]=1。接着利用之前的状态来推导dp[n]的值,根据最近的一步或者两步来划分问题:先到达dp[n]的前一个位置dp[n-1],然后支付cost[n-1]走一步,到达dp[n]花费为dp[n-1]+cost[n-1];
2025-04-19 20:48:26
1236
75
原创 MySQL数据库精研之旅第九期:深入数据库设计的智慧迷宫
在⼀个表中出现了两个强相关的关系,而且这两个强相关关系又存在传递现象,即通过学生Id可以找到学生记录,学生记录中包含学院名,每个学院又有自己的电话和地址。关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式),越高的范式数据库冗余越小。比如我们登录优快云账号时,账号与密码可以保存在一个账号,登录成功之后,会显示自己的用户信息,一个账号对应一个用户,那我们就可以创建两张表user和account。
2025-04-17 15:42:31
1228
69
原创 MySQL数据库精研之旅第八期:玩转数据库约束
指定了唯一约束的列,该列的值在所有记录中不能重复,比如⼀个⼈的身份证号,学生的学号等。之所以要使用外键,是因为外键可以更方便地维护数据,比如上图中班级编号就可以简化为1个数字,又比如在填表过程中填到一半,系统出现了崩溃,导致数据不全。通常把主键列设置为自动增长,让数据库维护主键值,这样我们写入数据时,不用人为的去维护主键值,只需要写入业务值即可。外键约束也是对数据的一种校验,从表中使用了主表中的某个值,这个值必须存在于主表中。应用于⼀个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性。
2025-04-15 15:27:19
1763
74
原创 巧用递归算法:破解编程难题的“秘密武器”
递归与循环一样,都是去执行相同的子问题,那么二者之间是可以相互转化的,那么我们什么时候用循环迭代效率更好,什么时候用递归效率更高。如下图所示,递归的细节展开图与二叉树的深搜极其相似。我们要想将递归转化为循环的话,就得借助栈来实现,因为当我们遍历一个子问题,我们需要保存上一个的信息方便调用方法执行右侧。但一个递归的细节展开图越复杂时,用递归就比较好解决;如果展开图只有一个分支,用循环迭代就比较方便。
2025-04-12 15:53:06
1531
72
原创 优选算法的妙思之流:分治——归并专题
如果p1所指的元素比p2所指的元素大,那么p1后面的元素就都是比p2大,就可以快速的统计出数目,然后再让p2++。找完右区域的逆序对,然后对右区域进行排序。方法2也同理,如果nums[p1]>= nums[p2],就让p1向右移动,直到nums[p1]<nums[p2],再让p2向右移动,p1同样不用回退。当我们在左右区域里面分别寻找逆序对时,如果数组长度较大,那么我们还可以再接着划分,继续按照上面的思路来找出逆序对的总数,这个部分就可以在递归中完成,所以我们在处理一左一右时也可以排个序。
2025-04-06 21:29:07
1858
64
原创 MySQL数据库精研之旅第七期:CRUD的趣味探索(下)
可以创建⼀张与 t_recored 表结构相同的表,把去重的记录写⼊到新表中,以后查询都从新表中查,这样真实的数据不丢失,同时⼜能保证查询效率。因为*是SQL语言级别的,对于所有的数据库软件都通用,并且在MYISAM存储引擎中有一个变量记录了行数,count(*)就可以直接通过这个变量返回数据数量,效率相对来说更高。执行Delete时不加条件会删除整张表的数据,谨慎操作。AUTO_INCREMENT是自增操作,当插入一条数据时,当前列的值加1,数据库会自动帮我们维护这个值,并且这个值会被记录在数据库内部。
2025-04-05 20:55:10
968
60
原创 优选算法的妙思之流:分治——快排专题
接下来进行分类讨论:如果nums[i]=0,我们让nums[left+1]与nums[i]进行交换,然后i++,left++,就能保证[left+1,i-1]区间还都是1,还可能有一种极端情况,就是i=left+1,自身与自身进行交换,还是得需要left和i++,综上我们就可以写成nums[++left]与nums[i++]进行交换。第二种解法,利用大根堆,创建一个大小为k的大根堆,将数组的前k个元素丢进大根堆中,然后再将数组剩余的元素与堆顶元素比较,如果小就交换并调整堆,最后堆里面就是最小的k个数;
2025-04-05 00:02:43
1336
68
原创 MySQL数据库精研之旅第六期:CRUD的趣味探索(中)
至于原因:查询结果是根据表中的列或者是根据表中列进行运算的结果,from用来确定是在哪个表里面查,先经过where条件过滤,再返回到查询列表中得到我们想要的结果。上面这条SQL语句不能有效地去限制结果集的个数,这样的查询是不安全的,因为这样查询,结果集过大有可能会把服务器的资源消耗殆尽。并且两个列的值是在同一个数据中的,不能进行跨行比较,比如王五的语文成绩不能与钱七的英语成绩进行比较。指定了排序的列,返回的结果集是针对当前排序列进行排序的结果,排序是在额外的空间中进行的(使用的是临时表的空间)。
2025-04-02 08:02:47
1355
56
空空如也
优快云文章离奇消失
2025-06-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人