自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 收藏
  • 关注

原创 SQL总结

SQL (Structured Query Language) 是一种标准的数据库查询语言,用于管理和操作关系数据库。SQL 包含两部分:数据定义语言 (DDL) 和数据操作语言 (DML)。DDL 用于定义和修改数据库结构,包括创建、修改和删除数据库对象。创建表CREATE TABLE 表名 (列名 数据类型 [约束条件],...[PRIMARY KEY (主键列名)],[FOREIGN KEY (外键列名) REFERENCES 参考表(参考列名)]age FLOAT,修改表。

2024-06-24 14:43:48 1328

原创 使用Java实现哈夫曼编码

哈夫曼编码是一种经典的无损数据压缩算法,它通过赋予出现频率较高的字符较短的编码,出现频率较低的字符较长的编码,从而实现压缩效果。这篇博客将详细讲解如何使用Java实现哈夫曼编码,包括哈夫曼编码的原理、具体实现步骤以及完整的代码示例。首先定义一个内部类Node,用于表示哈夫曼树的节点。每个节点包含字符、频率、左子节点和右子节点。实现接口用于在优先队列中排序。// 字符// 频率// 左右子节点// 判断是否为叶子节点= null));// 根据频率比较节点,用于优先队列。

2024-06-21 22:09:33 605

原创 基数排序详解:LSD和MSD的实现与比较

基数排序是一种基于“位”的排序算法,通过将数据按位进行多次排序来实现最终的排序效果。它特别适用于整数和字符串的排序。基数排序有两种主要的变种:LSD和MSD,它们的主要区别在于排序的方向。通过将计数排序抽象出来,我们简化了LSD和MSD基数排序的实现。这样不仅提高了代码的复用性和可读性,也使得修改和扩展算法变得更加容易。无论是从最低有效位开始排序的LSD基数排序,还是从最高有效位开始排序的MSD基数排序,都可以利用同一个计数排序模块来实现其核心功能。

2024-06-20 20:52:31 372

原创 基础排序算法详解与对比分析

排序算法是计算机科学中最基础和重要的算法之一。本文将详细介绍几种经典的排序算法,包括选择排序、插入排序、希尔排序、堆排序和归并排序,并进行代码实现和对比分析。

2024-06-15 10:56:28 734

原创 在有向无环图(DAG)中实现拓扑排序与最短路径和最长路径算法

首先,我们定义一个简单的图结构,包括节点和边。i ++) {} } }i ++) {} } }i++) {@Override本文介绍了在有向无环图(DAG)中实现拓扑排序、单源最短路径和单源最长路径算法的详细步骤和Java代码。通过比较不同的拓扑排序方法和最长路径算法,我们可以根据实际需求选择最适合的实现方案。希望这些内容能帮助读者更好地理解和应用DAG相关的算法。

2024-06-14 00:45:00 499

原创 最短路径与最小生成树:Dijkstra、Prim与Kruskal算法详解

为了完整性,我们需要定义一个Graph类,以支持上述算法的实现。i ++) {} } }i ++) {} } }i++) {@Override通过对Dijkstra、Prim和Kruskal算法的介绍和代码实现,我们可以更好地理解这三种经典算法在图论中的应用。每种算法都有其适用场景和优劣性,选择合适的算法可以提高解决问题的效率。希望本文能为你在学习和应用图算法时提供帮助。

2024-06-13 08:39:01 1260

原创 Xv6文件系统详解

Xv6文件系统虽然简单,但其设计和实现涵盖了许多现代文件系统的核心概念。通过理解Xv6的磁盘布局、文件读取和写入操作以及崩溃恢复机制,我们可以更好地理解操作系统和文件系统的基本原理。希望这篇文章能帮助您深入了解Xv6文件系统,并为进一步研究和学习提供一个坚实的基础。

2024-06-12 10:44:46 1290

原创 高效Trie实现:子节点的存储数据结构:数据索引字符映射,哈希表以及二叉搜索树

Trie(前缀树)是一种高效的字符串数据结构,广泛用于实现字典和搜索引擎中的自动补全功能。本文将详细探讨三种不同的Trie实现方法:基于数据索引字符映射的Trie、基于哈希表的Trie和基于二叉搜索树(BST)的Trie,并比较它们的优缺点和性能。

2024-06-11 00:00:00 1080

原创 深入了解FAT文件系统

FAT文件系统由于其简单性和兼容性,仍然在许多领域广泛应用。了解其内部结构和工作原理有助于更好地管理和维护存储设备,同时在需要时也可以进行数据恢复和故障排除。希望这篇博客能够帮助你更好地理解FAT文件系统的运作机制。

2024-06-10 00:00:00 1116

原创 深入了解Git:从数据模型到集成IDEA

通过理解Git的数据模型、暂存区、命令行接口,并将其集成到IntelliJ IDEA中,可以极大地提升开发效率。希望本文能够帮助你更好地使用和管理Git仓库,充分利用IntelliJ IDEA的强大功能进行版本控制。

2024-06-09 00:00:00 858

原创 优先队列的实现:基于最小堆的 Java 实现

优先队列是一种抽象数据类型,其中每个元素都有一个与之相关的优先级。在删除操作中,总是删除具有最高优先级的元素(对于最小堆来说是最小值)。优先队列的典型应用包括任务调度、图算法(如 Dijkstra 算法)等。

2024-06-08 00:00:00 1001

原创 前后端不分离与前后端分离的Java Web开发对比介绍

无论是前后端不分离还是前后端分离,最终目标都是提供高效、可靠的Web服务。前后端分离架构使得开发更灵活,前后端团队可以独立工作,提升开发效率和代码维护性。通过示例代码和详细解释,希望能帮助你更好地理解这两种架构模式及其实现方式。如果你有更多的问题或需要更详细的讲解,欢迎留言讨论!

2024-06-07 00:00:00 2009

原创 什么是Web应用--以JavaWeb为例

Web应用是通过Web服务器运行并提供服务的应用程序。Web服务器(如Tomcat)负责接收、解析和处理HTTP请求,并生成响应。Spring Boot等现代开发框架简化了开发和部署流程,但其工作原理与传统的Servlet技术一致,都是为了实现接收请求、处理请求和生成响应的基本流程。理解这些基础知识,可以帮助我们更好地开发和维护高性能的Web应用。希望本文能帮助你更好地理解什么是Web应用,以及它是如何工作的。如果你有更多的问题或需要更详细的讲解,欢迎留言讨论!

2024-06-06 00:00:00 1225

原创 探索文件系统的世界:从基础概念到挂载机制

同时,挂载机制和链接功能进一步扩展了文件系统的灵活性和功能性。因此,磁盘抽象和文件系统的结合,为我们提供了一个强大的数据管理工具,为计算机系统的正常运行和数据管理提供了重要支持。本文将深入探讨以下几个主题:为什么将磁盘抽象为块设备,为什么有了磁盘抽象还需要文件系统,文件系统如何作为虚拟磁盘,文件系统的分类,文件系统中的挂载,以及硬链接和软链接的概念。它在物理磁盘的基础上,通过逻辑结构(如文件和目录)来组织数据,使得用户和应用程序无需直接操作底层的磁盘块和扇区,而是通过更为直观和易用的接口进行数据存取。

2024-06-05 00:00:00 1161

原创 构造一个高效的哈希表:从基本思路到最终实现

在本篇博客中,我们从最基本的思路出发,逐步完善了一个高效的哈希表的实现。我们通过引入哈希函数解决键的类型问题,使用开放地址法解决冲突,通过取模操作减少空间浪费,并最终实现了动态更改哈希表大小以优化性能。这些优化措施使得我们的哈希表在处理不同类型的键和不同规模的数据时都能保持高效运行。希望通过本文的介绍,你对构造高效的哈希表有了更深入的理解,也能在实际应用中更好地利用哈希表这一重要的数据结构。

2024-06-04 00:00:00 410

原创 介绍计算机系统中的I/O设备工作方式

I/O设备是计算机系统的重要组成部分,它们通过多种设备和机制与CPU相连,实现高效、可靠的数据传输和设备管理。设备驱动程序和固件的协同工作,使得计算机系统能够稳定、高效地运行。理解I/O设备的工作原理和连接方式,有助于更好地设计和优化计算机系统。此外,GPU的并行计算能力极大地提升了神经网络等计算密集型任务的处理效率,推动了深度学习和人工智能的发展。

2024-06-03 00:00:00 774

原创 介绍谷歌开发工具中的 Application 面板

Application 面板是 Chrome DevTools 中的一个重要部分,用于管理和调试 Web 应用的客户端存储、服务工作线程(Service Workers)、缓存、Cookie 等。它为开发者提供了对浏览器存储和后台服务的全面控制和洞察。

2024-06-02 00:00:00 709

原创 介绍HDD、SSD、U盘:存储技术的恢复原理与安全保存私密文件的方法

随着数字存储技术的飞速发展,硬盘驱动器(HDD)、固态驱动器(SSD)和USB闪存驱动器(U盘)已经成为我们日常生活中不可或缺的部分。尽管这些设备在存储数据方面表现出色,但数据丢失问题仍然时有发生。在这篇博客中,我们将探讨HDD、SSD和U盘的工作原理、特点、删除过程及其数据恢复原理,并介绍如何安全地保存私密文件。

2024-06-01 00:00:00 2120

原创 HTML、DOM 和 BOM:深入解析网页加载和渲染过程

HTML(HyperText Markup Language)是用于描述网页结构的标记语言。它通过标签(如<div><p><a>等)定义网页的内容和布局,是网页的基础。DOM(Document Object Model)是 HTML 文档的编程接口。它将文档表示为树结构(或节点树),每个节点代表文档的一部分(例如元素、属性、文本)。通过 DOM,开发者可以使用 JavaScript 动态地访问和修改文档的内容、结构和样式。

2024-05-31 00:35:54 1455

原创 基于Chrome DevTools手册,介绍DevTools的使用方法

通过这些详细的步骤和示例,你可以更好地理解和使用谷歌开发者工具(DevTools)来调试、分析和优化网页。在 Console 中输入并执行上述代码,将输出 “Hello, Console!

2024-05-30 00:17:52 1098

原创 可执行文件以及其加载过程

可执行文件是程序经过编译和链接后生成的文件,其中包含了机器指令、数据和必要的元信息,使得操作系统能够加载并执行该程序。Windows:使用PE(Portable Executable)格式,文件扩展名通常为.exe或.dll。macOS:使用Mach-O(Mach Object)格式,文件扩展名通常为.app或.dylib。Linux:使用ELF(Executable and Linkable Format)格式,文件扩展名通常为没有特定的要求,但共享库使用.so。

2024-05-29 00:21:00 1231

原创 spanner,mit6.824论文解读

但T2在T1提交(实时)之后开始,因此外部一致性要求T2看到x=2。提交后,所有读取都应该看到我们的更新。如何确保如果读/写事务T1在只读事务T2开始之前结束,那么TS1 < TS2。T2选择TT.now().latest,这在当前时间之后,即在10之后。情景是T1提交,然后T2开始,T2必须看到T1的写入。我们希望T3看到T2的所有写入,或者一个也不看。一个读/只事务的读取看到的是事务时间戳时的版本。假设我们有两次银行转账,和一个读取两者的事务。没有锁,没有两阶段提交,没有事务管理器。

2024-05-27 00:09:42 539

原创 Distributed Transactions Mit 6.824

当您执行一些并发事务并产生结果时,“结果”既包括输出也包括数据库中的变化。存在一种串行执行事务的顺序,这种顺序产生的结果与实际执行的结果相同。(串行意味着一次一个——没有并行执行。(这个定义应该让你想起线性一致性。您可以通过寻找产生相同结果的顺序来测试执行结果是否是可串行化的。T1;T2T2;T1T1;T2;两者的结果不同;任何一种都可以接受。没有其他结果是可以接受的。实现可能已经并行执行了T1和T2,但它必须仍然产生如同按照串行顺序执行一样的结果。

2024-05-26 00:02:31 898

原创 红黑树基于Java代码的剖析

红黑树通过维护额外的颜色属性和引入旋转操作,确保了树的高度始终保持在 (O(\log n)) 的级别,从而保证了高效的插入、删除和查找操作。通过上述代码剖析,可以清晰地看到红黑树是如何通过颜色调整和旋转来保持平衡的。

2024-05-25 00:16:25 541

原创 递归,进程fork(),以及线程clone()之间的比较

递归、进程fork()和线程clone()递归适用于自然递归问题,代码简洁,但受限于栈空间。进程fork()提供高隔离性,适用于并行处理独立任务,但资源开销大。线程clone()提供高效共享和并发处理,适用于需要高效数据共享和高并发的场景,但同步复杂。理解这三种方法的特点和适用场景,能够帮助开发者在实际项目中做出最优选择,从而提高代码性能和可靠性。希望这篇文章能帮助您更好地理解递归、进程和线程之间的区别和联系。如有任何问题或建议,欢迎在评论区讨论交流。

2024-05-24 00:00:00 1188

原创 现代操作系统之内存虚拟化的处理(结合具体代码示例)

虚拟化内存是一种内存管理技术,通过将物理内存抽象成虚拟地址空间,使得每个进程拥有独立的地址空间。这种方法不仅提升了内存利用率,还提高了系统的安全性和稳定性。虚拟化内存管理通过分页和交换机制,实现了内存资源的高效利用和灵活管理。通过使用 TLB 和优化的页表结构,系统能够快速进行地址转换。同时,操作系统采用多种交换策略,在内存紧张时有效释放资源,确保系统性能和稳定性。了解这些机制和策略,对于深入理解操作系统的内存管理原理,以及优化程序性能,都具有重要意义。

2024-05-23 00:03:04 905

原创 基于链表实现的Map与二叉搜索树的Map对比

Set;总体而言,ULLMap实现简单,适用于小规模数据集,操作效率在键值对数量较少时表现尚可。然而,随着数据规模增大,其操作性能会显著下降。而BSTMap尽管实现复杂,但在大规模数据集下操作效率更高,尤其在平衡树情况下,其查找、插入和删除操作的性能明显优于ULLMap。因此,在需要处理较大数据集或对操作效率要求较高的情况下,BSTMap是更合适的选择。

2024-05-22 00:05:28 1299

原创 结合libc手册描述libc与Linux的爱恨情仇

libc是标准C库,包含了一系列标准函数,这些函数可以被所有C程序以及其他语言的程序使用。提供基础函数:如字符串处理、内存管理、输入输出操作等。封装系统调用:为程序提供一致的接口,使得开发者不必直接处理复杂的系统调用。libc作为Linux系统的标准C库,在程序开发中扮演着基础且关键的角色。它不仅为C语言提供了标准化的函数库和系统调用封装,还通过其高度优化的实现和广泛的功能支持,为高级编程语言提供了可靠的基础。

2024-05-21 00:00:44 1076

原创 二分查找介绍

二分查找是一种在排序数组中查找目标值位置的搜索算法。它通过反复将搜索区间一分为二来实现,直到找到目标值或搜索区间为空。二分查找利用数组已排序的特性,将时间复杂度降低到 O(log N)。

2024-05-20 00:20:05 515

原创 CS61B:并查集

并查集(Union-Find)是一种数据结构,用于处理不相交集合(Disjoint Sets)的合并和查询操作。它非常适合解决动态连通性问题,例如在图论中判断两个节点是否属于同一个连通分量。并查集的主要操作有两个:查找(Find)和合并(Union)。并查集通常使用一个数组来实现,数组中的每个元素表示一个节点,值表示该节点的父节点。如果某个元素是根节点,则其值为负数,表示集合的大小(按大小合并)或秩(按秩合并)。并查集以其高效的操作和易于实现的特性,成为解决连通性问题的常用工具。

2024-05-19 00:00:25 417

原创 Frangipani: A Scalable Distributed File System(解读)

在一段时间内,关于新创建文件的信息只存在于该工作站的缓存(RAM)中。第5节说,当Frangipani工作站释放读锁时,必须使缓存数据失效,并在释放写锁时将修改后的缓存数据写回Petal。如果一个工作站在系统调用完成后,但在发送相应的日志条目到Petal之前崩溃会发生什么?如果一个工作站在系统调用完成后,但在发送相应的日志条目到Petal之前崩溃会发生什么?如果: WS1持有一个锁,WS2认为WS1已经死亡,进行恢复,释放WS1的锁,如果WS1实际上是活着的,它随后能够尝试写入被锁定的数据吗?

2024-05-17 00:23:06 544

原创 Chain Replication for Supporting High Throughput and Availability,Chain Replication笔记

由于头部和尾部的负载可能比中间节点的负载更高,可能出现性能受到头/尾限制的情况,但中间节点却有大量空闲CPU的情况。更好的方法是提前传输状态的快照,然后冻结系统的时间足够长,以发送最后几个更新到新尾部,然后重新配置并解冻,可能使用ZooKeeper的模糊快照概念。现在,假设三个链上的活动大致相等,那么三个服务器的负载也将大致相等。通过这样的布置,请求处理工作可能更加均衡,因为每个服务器参与了多个分片组,而且分片的大小相对较小。对于主/备份系统,服务器在一些组中是主服务器,在其他组中是备份服务器。

2024-05-16 00:01:33 642

原创 详述进程的地址空间

表头:地址 (范围) ,权限 (rwxsp),对应的文件: offset, dev, inode, pathname。进程的地址空间 = 内存里若干连续的 “段”libc后的空白部分,是未被初始化的变量。合法的地址 (可读或可写)管理进程地址空间的系统调用。Execve 之后……

2024-05-15 00:19:35 1257

原创 Dash Shell手册解读

Dash (Debian Almquist Shell) 是一种符合 POSIX 标准的 Unix Shell,是 /bin/sh 的一个实现,目标是最小化和提高速度。Dash 是从 NetBSD 的 ash (Almquist SHell) 演变而来,并在 2002 年被重新命名为 Dash。Dash 特别适用于脚本执行,因为它启动速度快,执行效率高。掌握 Dash 的这些高级功能将使你能够编写更有效、更健壮的 Shell 脚本,不仅能够提高个人的工作效率,也能在整个系统层面带来性能的提升。

2024-05-14 00:02:11 991

原创 Git深入指南:核心概念和操作

通过本指南,您应该能够掌握Git的核心操作及一些高级功能,这将帮助您更有效地使用Git管理您的代码库和团队协作.持续实践是精通Git的关键,不断探索新的工具和命令可以帮助您更好地解决实际问题。

2024-05-13 08:20:52 1410 1

原创 Zookeeper笔记,MIT6.824

一旦旧协调器意识到会话已经失效,它可以创建一个新的会话,但此时它知道自己不再是协调器。因此,虽然可能存在一小段时间内的竞争情况,但在会话超时后,ZooKeeper会自动防止旧的协调器修改状态,确保新的协调器能够顺利被选举。写请求被转发到一个称为 leader 的服务器,其余的ZooKeeper服务器,称为Follower,它们从leader接收消息(主要是状态),并商定状态更改。使用 ZooKeeper ,我们能够实现我们的应用程序所需要的所有协调原语,即使只有写入是可线性化的。

2024-05-12 14:37:07 1077

原创 多年后,再探算法和数据结构

多年来,通过深入学习和实践各种编程语言,我对数据结构和算法在程序设计中的中心地位有了新的认识。本次从汇编语言到高级编程语言的探讨,展示了无论技术如何进步,构成程序的核心—算法和数据结构—始终保持其基础和不变的角色。

2024-05-09 00:11:26 448 1

原创 fork,execve,_exit从第一个程序到所有程序

这样,我们就看到了一个完整的程序生命周期:创建、执行和终止,都是通过操作系统提供的系统调用来管理的。系统已经启动,并且我们需要从一个简化的 shell 启动一个程序,如。linux中的pstree的systemd的来历。→ 程序 (状态机) 执行 + 系统调用。操作系统会加载 “第一个程序”

2024-05-08 00:01:50 1233

原创 Raft共识算法图二解释

由领导者调用以复制日志条目,同时也作为心跳信号,以维持权威并防止超时。您的日志中可能有与领导者日志不同的条目。因为#3 规定只有在存在冲突条目。:由候选者调用,用于在选举中收集选票。即使领导者没有发送任何条目,也。:所有服务器的共通行为规则。:追随者的特定行为规则。:候选人的特定行为规则。:领导者的特定行为规则。

2024-05-07 12:56:53 1429

原创 Raft共识算法笔记,MIT6.824,

在Go中实现这一点的一种方法是,领导者在每个迭代中都在一个单独的goroutine中发送AppendEntries RPC,以便领导者可以并发地发送RPC。简而言之,日志在分布式系统中的作用是有序地记录命令,确保一致性,防止丢失,并帮助系统在发生故障或重启后保持一致状态。多数投票的一个关键特性是,任意两个交集中的服务器都可以传达关于先前决策的信息,例如,另一个 Raft 领导者已经在这个任期内被选举出来。Raft 可以在缺失一个服务器的情况下继续运行,但是必须尽快修复失败的服务器,以避免降到少数派以下。

2024-05-06 00:00:29 1121 1

空空如也

空空如也

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

TA关注的人

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