自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ms17-010 ms12-020 ms-08-067

攻击者可以利用此漏洞通过特制的Office文档或网页诱使用户打开,一旦用户打开了这些包含恶意内容的文件或访问了嵌入恶意控件的网页,就可以在受害者的系统上执行任意代码,从而完全控制受影响的系统。该漏洞的严重性在于其易于被利用且影响范围广,它被用于多起大规模的网络攻击事件中,最著名的例子就是2017年的WannaCry勒索软件疫情,该事件导致全球数十万台未打补丁的Windows计算机被感染,造成了巨大的经济损失和数据损失。因此,所有受影响的用户和组织都被强烈建议安装此安全补丁以保护自己的系统免受此类攻击。

2024-06-27 23:02:37 419

原创 基础编程函数题

j -= gap)//实现组内的插入。// 消除负号的影响,abs()函数需要#include <stdlib.h>while(carry) { //拓展结果的总位数记录进位的数,直到进位为0。//num记录各个位上的数字,全初始化为0。gap /= 2)//分组(增量由大到小)//低位向高位的进位。carry/=10;

2024-05-23 18:25:02 2353

原创 Web安全基础

安全头(CORS, Content Security Policy, X-Frame-Options等): 通过设置HTTP头部增强安全性,如CORS用于控制资源的跨域访问,Content Security Policy限制加载的资源类型和来源,X-Frame-Options防止点击劫持。这有助于防止恶意网站读取另一个网站的数据。输入验证(Input Validation): 对用户输入的数据进行严格检查,确保数据格式正确、符合预期,并过滤掉潜在的恶意代码,如SQL注入和跨站脚本(XSS)。

2024-05-22 11:18:09 307

原创 网络安全应急响

网络安全应急响应是网络安全管理中的关键环节,旨在应对突发的安全事件,减少损害,恢复系统正常运行,并防止同类事件再次发生。此外,随着网络环境的不断变化和威胁的演进,应急响应也需要持续的学习和适应,以保持其有效性。快速采取行动限制事件影响范围,如隔离受感染系统、关闭特定服务或端口。准备应急工具和资源,如备份系统、取证工具等。逐步恢复服务和系统功能,确保数据的完整性。分析事件原因,评估响应效果,改进响应计划。建立应急响应团队,明确成员角色和责任。进行系统和数据的验证,确保无残留威胁。

2024-05-22 11:17:53 296

原创 系统安全加固

系统安全加固是指通过一系列措施和方法,提高计算机系统、网络系统或其他IT系统的安全性,以防止未经授权的访问、攻击、数据泄露或破坏。通过这些措施的综合应用,可以显著提升系统的安全性,降低遭受攻击的风险。然而,安全是一个持续的过程,需要不断地评估、调整和改进策略以应对新的威胁和挑战。备份与灾难恢复计划:定期备份重要数据,并制定详细的灾难恢复计划,确保在遭遇攻击或系统故障时能够快速恢复。更新与补丁管理:定期检查并安装操作系统、应用程序和固件的最新安全更新和补丁,以修复已知的安全漏洞。

2024-05-21 15:50:27 360

原创 某为2017秋招-测试工程师笔试选择和判断

代码评审是一个跨职能的活动,需要不同角色的参与来获得全面的反馈。代码评审是一个系统性的检查过程,旨在发现错误、不良编程习惯、不符合编码规范的问题,并且也包括提高代码的可读性、可维护性以及确保代码遵循最佳实践。在这个阶段,软件产品会被分发给一组外部用户(通常是非专业的最终用户群体),他们在实际使用场景中对软件进行测试,从而收集反馈、识别缺陷和评估产品的用户体验。这些准则确保了软件在发布前已经经过全面的测试,满足预定的需求和规范,没有显著的错误或缺陷,并且相关的文档和审批流程都已经完成和一致。

2024-05-21 00:15:00 349 1

原创 机器学习算法

机器学习算法是通过自动分析和学习数据中的模式和规律,从而对未知数据进行预测、分类、聚类、降维等任务的一系列方法。:在这种类型的机器学习中,算法在训练过程中会接收到带有标签的数据,即每个数据点都有关联的目标变量或结果。:这是一种相对较新的学习范式,它通过设计预训练任务,使模型在无明确外部标签的情况下从数据本身学习有用的表示。算法需自行发现数据中的结构,如聚类相似的数据点或降低数据的维度。:介于监督学习和无监督学习之间,利用大量无标签数据和少量有标签数据进行学习,旨在减少手动标注数据的成本。

2024-05-20 01:00:00 211

原创 软件需求(Software requirements)

收集和管理软件需求是一个迭代和渐进明细的过程,涉及与用户和利益相关者的密切沟通。良好的需求工程实践包括需求调研、需求分析、需求规格说明编制、需求验证和确认,以及需求变更管理。精确、完整、一致且可验证的需求是确保软件项目成功的关键。软件需求是指在软件开发过程中,为了满足特定用户或利益相关者的期望和目标,软件系统必须具备的功能、性能、约束条件及其它特性。它是软件开发的基石,直接影响软件设计、实现、测试和最终产品的质量。:限制软件设计和实现的外部因素,如法律规定、技术标准、预算限制、时间表等。

2024-05-20 00:15:00 509

原创 软件过程模型

随着软件开发实践的演进,混合模型和适应性模型(如敏捷方法)在现代软件工程中变得日益流行,因为它们能更好地适应快速变化的需求和环境。软件过程模型,也称为软件开发模型,为软件开发的全过程提供了一个结构化的框架,包括所有相关的活动、任务和阶段。:这是最传统的软件开发模型,它将软件生命周期划分为线性序列的阶段,包括需求分析、设计、编码、测试和维护。:如Scrum、极限编程(XP)等,强调快速响应变化、个体和交互重于过程和工具、可工作的软件重于详尽的文档、客户合作以及基于反馈的迭代开发。

2024-05-19 00:30:00 350

原创 软件工程定义

软件工程是一门应用计算机科学、经济学、管理学和其他工程学科的知识、原理和方法,以系统化、规范化、量化的方式开发、运行和维护软件的应用学科。软件工程的核心思想围绕着规划、设计、构造和维护软件的过程管理,强调团队合作、标准化、复用性以及持续改进。软件工程还强调文档的重要性,包括需求文档、设计文档、测试计划和用户手册等,以确保软件开发的透明度、可追溯性和可维护性。随着技术的不断发展,软件工程领域也在不断吸收新的技术和理念,如云计算、大数据、人工智能、微服务架构等,以适应快速变化的市场需求。

2024-05-19 00:15:00 341

原创 软件工程的基本原理

随着技术的进步和行业的发展,这些原理也在不断演进,融入了更多现代软件工程实践,如敏捷开发、DevOps等理念。:软件开发被视为一个有序的、分阶段的过程,从需求分析、设计、实现、测试到维护,每个阶段都有明确的目标和交付物。:认识到软件工程是一个不断进化的过程,倡导学习文化,鼓励团队成员不断吸收新知识和技术,改进开发过程和方法。:识别项目中的潜在风险,并制定相应的缓解策略,以减少不确定性和潜在的负面影响。:鼓励软件组件和服务的重用,以提高开发效率,减少错误,和降低开发成本。

2024-05-18 00:15:00 276

原创 面向对象分析中的类图(Class Diagram)用例图(Use Case Diagram)顺序图(Sequence Diagram)

面向对象分析(Object-Oriented Analysis, OOA)中的类图(Class Diagram)是UML(Unified Modeling Language)的一种图形表示法,用于展示系统中的类、接口、对象以及它们之间的静态结构和关系。这些图是与实现平台无关的,专注于描述系统的概念模型,随着分析的深入,类图会逐渐细化,为面向对象设计和后续的实现阶段奠定基础。用例图的绘制和分析是面向对象分析的重要步骤,它帮助团队聚焦于系统的功能需求,明确谁(参与者)需要什么(用例),以及如何与系统交互。

2024-05-18 00:00:00 1869

原创 软件危机(Software crisis)

为缓解和解决软件危机,软件工程学科应运而生,提倡使用系统化的、规范化的软件开发方法和工具,包括软件生命周期模型、需求管理、设计模式、测试策略、配置管理等,以提高软件开发的效率、质量和可维护性。此外,敏捷开发、DevOps文化以及持续集成和持续部署(CI/CD)等现代软件开发实践也被广泛采纳,以更快响应变化,提高软件交付的速度和质量。:软件中存在大量缺陷和错误,导致系统不稳定,容易崩溃,或者不能满足用户的实际需求。:随着软件规模的扩大和功能的增加,维护工作变得越来越复杂和困难,成本高昂。

2024-05-17 03:00:00 270

原创 技术可行性分析和经济可行性分析

评估项目所需技术的当前发展水平。:详细列出项目实施过程中的所有预期成本,包括但不限于初始投资成本(如土地、设备、原材料)、运营成本(人力、维护、能源)、融资成本和沉没成本。:识别项目实施过程中可能遇到的技术风险,如技术失败、延期、兼容性问题、安全性风险等,并评估这些风险的潜在影响及应对措施。:识别可能影响项目经济可行性的各种风险,如市场风险、金融风险、技术风险、政策风险等,并评估其对预期收益的影响。:综合以上分析,判断项目是否在经济上可行,提出实施、调整或放弃的建议,并指出关键的成功因素和潜在的风险点。

2024-05-17 02:45:00 1552

原创 McCabe度量法

McCabe度量法,又称为环路度量(Cyclomatic Complexity)或循环复杂度,是由Thomas J. McCabe Sr.在1976年提出的一种用于软件工程中的程序复杂性度量方法。这种方法基于程序的控制流图(Control Flow Graph, CFG),通过计算程序图中的独立环路数量来量化程序的复杂程度。

2024-05-16 10:06:57 573

原创 白盒测试技术和黑盒测试技术

黑盒测试技术,也称为功能测试或行为测试,也是一种软件测试方法,它关注的是软件的外部行为,而不是内部结构或工作原理。黑盒测试的重点在于验证软件是否满足规格说明的要求,检查软件功能是否正确,界面和用户交互是否符合预期,以及系统的行为是否符合用户需求。:测试程序中所有可能的执行路径至少一次。:利用正交表从大量的输入参数组合中选择有代表性的子集作为测试用例,以达到用最少的测试用例覆盖最多参数组合的目的。:结合判定覆盖和条件覆盖,确保每个逻辑判断的每个可能的结果以及每个逻辑表达式的每个可能的布尔结果都被测试到。

2024-05-16 10:06:25 644

原创 分治算法(Divide-and-Conquer Algorithm)

通过递归或迭代的方式,将数组分为左半部分和右半部分,分别求各自的最大子数组和,再比较两者以及跨越中间元素的子数组和,取最大值作为整个数组的最大子数组和。分治算法常常表现为一种递归算法实现,因为它天然符合递归调用的模式:每次递归调用处理一个子问题,直到子问题简单到可以直接求解为止,然后通过递归返回机制将子问题的解逐层向上合并。:将两个大矩阵分解为四个较小的子矩阵,递归地计算这四个子矩阵的乘积,然后利用这些结果组合得到原矩阵乘法的最终结果,相比传统的矩阵乘法算法减少了乘法运算次数。

2024-05-15 13:44:47 420

原创 最长公共子序列(Longest Common Subsequence, LCS)

否则,最长公共子序列可能来自 X[1..i−1] 与 Y[1..j] 的最长公共子序列,也可能来自 X[1..i] 与 Y[1..j−1] 的最长公共子序列,取两者中的较大值。[ L[i][j] = \begin{cases} L[i-1][j-1] + 1, & \text{如果 } x_i = y_j \ \max(L[i-1][j], L[i][j-1]), & \text{如果 } x_i \neq y_j \end{cases} ],yn​,它们的最长公共子序列 Z=z1​,z2​,…

2024-05-15 13:44:28 344

原创 回溯算法(Backtracking Algorithm)

回溯算法通过逐步构造候选解并检验其合法性的方式来探索解空间,当遇到无效解或不符合约束条件的情况时,会撤销(回溯)部分或全部已作出的选择,然后转向其他可能的解路径继续搜索。:在搜索过程中,每当做出一个选择(扩展当前的部分解),立即检查新形成的解状态是否满足所有约束条件。:当遇到无效状态或到达解空间的边界未找到解时,算法会退回至上一个决策点,撤销最近一次选择,并尝试其他可行的选项。这个过程反复进行,直到找到一个有效的解或遍历完所有可能的解路径。:确定问题的解的形式及其所有可能的候选解构成的空间。

2024-05-14 12:33:55 333

原创 贪心算法(Greedy Algorithm)

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下看似最优(即最有利)的选择,从而希望导致全局最优解的算法策略。贪心算法通常用于解决具有某种最优子结构和贪心选择性质的问题,即问题的整体最优解可以通过一系列局部最优的选择来构造。:分析或证明所设计的贪心算法确实能够得到问题的全局最优解,或者至少是近似最优解。:问题的整体最优解可以由其子问题的最优解构建而成,即局部最优解能直接拼接成全局最优解。:在每一步决策中,算法选择当前状态下最优(或近似最优)的选项,不考虑未来步骤的影响。

2024-05-14 12:33:28 436

原创 背包相关问题

背包问题是一种经典的组合优化问题,通常表述为:给定一组物品,每种物品有一个重量和一个价值,以及一个容量有限的背包。以0/1背包问题为例,可以定义一个二维数组dp[i][w] 表示在前 i 个物品中,背包容量为 w 时能获得的最大价值。解释:在物品 i 的决策时刻,可以选择不取该物品(保留前 i−1 个物品的最大价值),或者取该物品(牺牲 wi​ 容量,加上物品 i 的价值)。的函数,它接受物品的重量列表、价值列表以及背包容量作为参数,返回能装入背包的最大价值。通过双重循环计算出每一项。即为所求的最大价值。

2024-05-13 10:41:05 477

原创 Kruskal算法

Kruskal算法是由约瑟夫·克鲁斯卡尔(Joseph Kruskal)在1956年提出的,用于解决加权无向图的最小生成树问题。最小生成树是指一个包含图中所有顶点的无环子图,且其所有边的权重之和最小。函数接收加权无向图作为输入,返回最小生成树的边及其权重列表。在遍历结束后,输出了最小生成树包含的所有边及其对应的权重。:当加入的边数量达到图中顶点数减一(即n-1,n为顶点数),或者所有边都已检查过且没有合适的边可加入时,算法结束。类实现并查集,用于检测边的加入是否导致环路。

2024-05-13 10:40:35 421

原创 Prim算法(Prim‘s Algorithm)

Prim算法的基本思想是逐步从一个顶点开始,每次选择一条与当前生成树相连且权重最小的边,将其加入到生成树中,直到生成树包含图中的所有顶点。注意,这里仅输出了最小生成树包含的顶点,若需要输出具体的边信息,可以在算法中额外记录边的添加情况。:为了高效地找到与当前生成树相连的最小权重边,通常使用优先队列(如二叉堆)存储候选边,这样每次都能直接获取当前最小权重边。:算法每次选择与当前生成树相连的、权重最小的边,确保每一步都是局部最优选择,最终得到全局最优解(即最小生成树)。实现了Prim算法的核心逻辑,使用列表。

2024-05-12 08:26:19 548

原创 Dijkstra算法

Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻(Edsger W. Dijkstra)于1959年提出的,是一种解决带权图中单源最短路径问题的经典算法。该算法主要用于寻找图中从给定的源点(起点)到所有其他顶点的最短路径。在有向图或无向图中,只要边的权重非负,Dijkstra算法都能准确地找出从源点到每个顶点的最短路径。:虽然基础版本的Dijkstra算法可以用普通队列实现,但为了提高效率,通常会使用优先队列(如二叉堆)来存储未访问节点,这样每次都能直接获取距离源点最近的未访问节点。

2024-05-12 08:25:50 431

原创 广度优先搜索(Breadth-First Search, BFS)

它按照层次顺序从根节点开始,依次访问离根节点最近的节点,直至遍历到整个树或图。:在无权图中,BFS从源节点出发找到的任一目标节点的路径是所有从源节点到该目标节点的路径中最短的(即经过的边数最少)。:在树形结构中,BFS按层次顺序遍历节点,先访问同一层次的所有节点,再向下一层推进。:相对于深度优先搜索(DFS),BFS可能需要更大的内存空间,因为它通常需要存储整层节点以确保按照正确的顺序访问。:当队列为空且没有新的节点加入时,说明所有与起始节点连通的节点都已被访问,BFS结束。记录已访问节点,避免重复访问。

2024-05-11 11:31:19 512

原创 深度优先搜索(Depth-First Search, DFS)

DFS沿着一条路径深入搜索,直到到达叶子节点(在图中为无法继续前进的节点)或到达目标节点为止。:在无环图中,DFS能保证访问到每一个节点,并且对于无向图而言,有前序遍历、中序遍历和后序遍历三种方式,分别对应于访问节点、访问左子树和访问右子树的顺序不同。:DFS可以结合记忆化技术(即备忘录或动态规划的思想),避免重复搜索已经访问过且状态相同的子树,从而提高搜索效率,常用于解决最优化问题。:当当前节点的所有邻居节点均已被访问(或当前节点无邻居),回溯到前一个节点,继续处理其未访问的邻居。

2024-05-11 11:30:38 527

原创 B+树(B+ Tree)

由于数据只存储在叶子节点,且所有查询最终都会到达叶子节点,B+树的所有查询(包括点查询和范围查询)的时间复杂度均为O(logn),而B树的非叶子节点查询可能需要回溯到叶子节点获取数据,效率略逊一筹。这样,遍历所有数据只需沿着叶子节点的链表进行。:相比于B树,B+树的分支因子(每个节点的孩子数量)通常更大,这意味着在同样的空间内,B+树可以存储更多的关键字,进一步降低树的高度,提高查询效率。:与B树不同,B+树的内部节点(非叶子节点)只存储关键字和指向子节点的指针,不存储实际的数据记录。

2024-05-10 13:41:07 399 1

原创 B树(B-Tree)

B树相对于二叉搜索树(Binary Search Tree, BST)的优势在于,由于每个节点可以有多个子节点,B树在相同的高度下能容纳更多的数据,从而降低了树的高度,使得在大规模数据集上进行查找、插入、删除等操作时的平均时间复杂度更优。节点的子节点数通常被称为阶(degree),记作t,一个t-阶B树的每个节点最多有2t−1个关键字,并且最多有2t个孩子节点。常见的B树阶数通常在22到6464之间。即,每个节点的所有左孩子的关键字均小于当前节点的关键字,而所有右孩子的关键字均大于当前节点的关键字。

2024-05-10 13:39:43 422

原创 哈希查找(Hashing Search)

哈希表通过哈希函数(Hash Function)将输入的关键字映射到一个固定大小的地址区间(通常为数组索引),并使用冲突解决策略(如开放寻址法、链地址法等)处理可能出现的哈希冲突(不同的关键字映射到同一地址)。哈希查找的优势在于查找速度快,但前提是需要有足够的内存空间存储哈希表,并且哈希函数的设计至关重要。在实际应用中,为了保持较低的冲突率和较高的查找效率,哈希表的大小通常会略大于已存储元素的数量。如果包含,则查找成功,返回关键字对应的值;:使用哈希函数将待查找的关键字转化为哈希表中的一个地址(索引)。

2024-05-09 22:03:00 813

原创 二分查找(Binary Search)

二分查找(Binary Search)是一种在有序数组或有序区间中查找特定元素的高效算法。其基本思想是每次都通过与区间的中间元素比较,将待查找的区间缩小为之前的一半,直到找到目标值或区间被缩小为零。:二分查找仅需要常数级别的额外空间,用于存储中间索引等临时变量,因此空间复杂度为O(1)。通过不断比较中间元素与目标值,调整查找区间,找到目标值时返回其索引,未找到时返回。,说明区间已被缩小为零,目标值不存在于数组中,返回特定的“未找到”标记(如。:确定待查找的有序数组或区间,设其起始索引为。

2024-05-09 22:01:52 299

原创 顺序查找(Sequential Search)

尽管顺序查找在数据结构较大时效率较低,但其算法简单、易于实现,且对数据结构无特定要求(如无需预先排序或建立索引),适用于数据规模较小或数据无序、无法进行高效查找的情况。顺序查找(Sequential Search)是最简单的查找算法之一,其基本思想是从数组或列表的起始位置开始,逐个检查每个元素,直到找到目标值或遍历完整个数据结构。已超出数据结构的范围(即指向了最后一个元素之后的位置),说明目标值不存在于数据结构中,返回特定的“未找到”标记(如。找到目标值时返回其索引,未找到时返回。如果是,查找结束,返回。

2024-05-08 11:36:34 309

原创 堆排序(Heap Sort)

堆是一种特殊的树形数据结构,通常是一个完全二叉树,满足堆序性质:对于最大堆,父节点的值总是大于或等于其子节点的值;堆排序的基本思想是先将待排序的序列构造成一个大顶堆(或小顶堆),然后将堆顶元素(即当前最大值或最小值)与末尾元素交换,再将剩余元素重新调整为堆,如此反复,直至整个序列有序。:将堆顶元素(即当前最大值或最小值)与末尾元素交换,此时末尾元素已处于正确位置,而原来的堆顶元素成为新的末尾元素。:堆排序不是稳定的排序算法,因为相同的元素可能会因为堆调整过程中的位置交换而改变排序后的相对顺序。

2024-05-08 11:32:43 547

原创 归并排序(Merge Sort)

将两个已排序的半序列合并成一个完整的有序序列。合并的过程是:从两个半序列的起始位置开始,依次比较它们的当前元素,将较小者放入结果序列,并将相应的指针向后移动一位。当一个半序列遍历完后,将另一个半序列剩余的元素直接追加到结果序列。其基本思想是将待排序的序列分成两半,分别对这两半进行排序,然后将两个已排序的半序列合并成一个完整的有序序列。函数中,从两个子序列的起始位置开始,依次比较并合并元素,直至一个子序列遍历完,将另一个子序列剩余元素追加到结果序列。:对每一半分别进行归并排序。函数合并两个已排序的子序列。

2024-05-08 11:30:57 231

原创 快速排序(QuickSort)

其基本思想是采用分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。:重新排列数列,使所有比基准小的元素都出现在基准的左边,所有比基准大的元素都出现在基准的右边。在实际应用中,为了减少不必要的数据复制,可以采用in-place版本的快速排序,即在原数组上进行分区操作,而非创建新的子数组。:递归地对基准左边和右边的两个子序列分别进行快速排序。

2024-05-07 12:01:01 280

原创 插入排序(Insertion Sort)

插入排序的基本逻辑,遍历数组并将每个元素插入到已排序部分的正确位置。每次插入后,已排序部分的长度增加1,直至整个数组排序完成。每次插入后,已排序部分的长度增加1,未排序部分的长度减1。:插入排序是原地排序算法,只需要常数级别的额外空间用于临时存储待插入的元素,因此空间复杂度为 O(1)。:初始时,已排序部分仅包含数组的第一个元素,其余元素被视为未排序部分。:插入排序是稳定的排序算法,即相同值的元素在排序前后相对位置不会改变。:从已排序部分的末尾开始,向前遍历,将。插入该位置,完成一轮插入。

2024-05-07 11:58:58 368

原创 冒泡排序(Bubble Sort)

虽然冒泡排序在实际应用中由于其较高的时间复杂度(尤其是在处理大规模数据时效率较低)而较少被直接使用,但它作为最基础的排序算法,易于理解、实现简单,常被用于教学和小型数据集的排序。冒泡排序(Bubble Sort)是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。随着遍历次数的增加,未排序部分逐渐减小,直至没有任何元素需要交换,即整个数组已排序。如果没有发生交换,说明后续的元素已经有序,无需继续进行后续的遍历,从而优化了算法在最好情况下的性能。

2024-05-06 13:10:37 529

原创 选择排序(Selection Sort)

这段代码实现了选择排序的基本逻辑,遍历数组并找到当前未排序部分的最小元素,将其与未排序部分的第一个元素交换位置。:持续进行上述两步操作,每次都会将当前未排序部分的最小元素放到已排序部分的末尾。:从待排序的数列中,找到当前未排序部分(即整个数组或已排序部分之后的部分)中的最小(或最大,取决于排序方式)元素。:选择排序不是稳定的排序算法,因为在寻找最小元素的过程中,可能会改变相等元素的相对位置。:将找到的最小元素与未排序部分的第一个元素交换位置,这样最小元素就被放到了正确的位置。

2024-05-06 13:05:27 399 1

原创 平衡树(Balanced Tree)

平衡树(Balanced Tree)是一种特殊的二叉查找树(Binary Search Tree, BST),其主要目的是在保持二叉查找树基本特性的基础上,通过额外的约束条件确保树的高度尽可能均衡,从而保证在插入、删除和查找等操作时能保持较高的性能。平衡树的关键特性是任何节点的两个子树的高度差最多为1,这有助于确保在最坏情况下的操作时间复杂度接近于O(log n),其中n是树中节点的数量。:如同一般的二叉查找树,平衡树中的每个节点的值均大于其左子树中所有节点的值,且小于其右子树中所有节点的值。

2024-05-05 10:47:02 481

原创 堆(Heap)

堆通常以数组形式实现,利用完全二叉树的性质来优化空间使用和提高操作效率。这意味着除了可能缺少最后一个层级的某些节点(因为填充是从左到右进行的),堆的其余部分都被完全填满,且所有非叶子节点的左子节点和右子节点都存在(如果允许的话)。总结来说,堆是一种以数组为基础、具有特定排序规则的完全二叉树结构,常用于实现优先队列和相关算法,其主要优势在于插入、删除堆顶元素的高效性,时间复杂度为 O(log n)。:堆的堆序性质确保了父节点与子节点之间的关系符合最大堆或最小堆的规则,使得堆顶元素始终是最大或最小值。

2024-05-05 10:46:44 415

原创 统计字符(1009)

/ 假设输入不会超过99个字符加上末尾的'\0'#include <ctype.h> // 提供isalpha, isdigit等函数。

2024-05-04 17:30:19 144

空空如也

空空如也

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

TA关注的人

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