【算法】《算法图解》第九章学习笔记:迪杰斯特拉算法
一、迪杰斯特拉算法概述迪杰斯特拉算法(Dijkstra’s algorithm)是一种解决带权有向图上单源最短路径问题的贪心算法,由荷兰计算机科学家艾兹赫尔·迪杰斯特拉(Edsger W. Dijkstra)于1956年提出。该算法常用于路由协议,也可以用作其他图算法的子程序。 (一)算法适用场景迪杰斯特拉算法适用于: 带权有向图(每条边都有权重) 所有权重都为非负值(不能有负权边) 需要找出从一个顶点到图中所有其他顶点的最短路径 (二)算法基本思想迪杰斯特拉算法的核心思想是: 从起点开始,逐步扩展到图中的其他顶点 每次选择当前未访问的距离最小的顶点 更新该顶点的所有邻居的距离值 重复这个过程,直到所有顶点都被访问过 二、算法步骤详解(一)算法流程 创建两个集合:已访问顶点集合和未访问顶点集合 将起点的距离设为0,其他顶点的距离设为无穷大 重复以下步骤,直到所有顶点都被访问:a. 从未访问顶点中选择距离最小的顶点b. 将该顶点标记为已访问c. 更新该顶点的所有邻居的距离 (二)图示说明以《算法图解》中的例子为例,假设我们要找从起点到终点的最短路径: 起点的距离为0,其...
【算法】《算法图解》第二章学习笔记:数组、链表与选择排序
前言继第一章介绍了算法的基本概念和二分查找后,《算法图解》第二章将带领我们进一步探索数据组织的方式,引入了两种基础且重要的数据结构:数组(Array)和链表(Linked List)。理解它们的特性和区别对于后续学习更复杂的算法至关重要。此外,本章还介绍了第一个排序算法——选择排序(Selection Sort)。笔者将结合书中内容和个人理解,对本章知识点进行梳理。 一、内存工作原理简介在探讨数组和链表之前,我们有必要简单了解一下计算机是如何存储数据的。想象一下,计算机的内存就像一个巨大的柜子,里面有很多抽屉。每个抽屉都有编号(内存地址),可以存放数据。 存储数据:当程序需要存储数据时,会向操作系统请求一块内存空间。操作系统找到合适的”抽屉”并将数据放进去。 读取数据:当程序需要读取数据时,会根据内存地址找到对应的”抽屉”,取出里面的数据。 这种机制是数组和链表实现的基础。 二、数组(Arrays)数组是一种将相同类型的元素存储在连续内存空间中的数据结构。这意味着数组中的所有元素都是紧挨着存放的。 (一)数组的特点 连续存储:这是数组最核心的特点。由于元素是连续存储的,我们可...
【算法】《算法图解》第三章学习笔记:递归的奥秘
前言《算法图解》第三章为我们揭示了编程中一个强大且富有魅力的概念——递归(Recursion)。递归是一种解决问题的方法,它将问题分解为规模更小的相同问题,直到问题小到可以轻松解决。理解递归对于掌握更高级的算法(如快速排序、归并排序等)至关重要。本篇笔记将跟随书中的脚步,探索递归的原理、运作方式以及其在编程实践中的应用。 一、什么是递归递归,简单来说,就是一个函数直接或间接调用自身的过程。书中用了一个生动的例子来解释:你找到一个上了锁的神秘手提箱,奶奶告诉你钥匙在另一个盒子里。你打开那个盒子,发现里面又是一个盒子… 这个寻找钥匙的过程,就是递归的体现——不断重复相同的动作(打开盒子),直到找到钥匙(达到某个终止条件)。 在编程中,递归函数会不断地调用自己,每次调用处理问题的一个更小的部分,直到达到一个无法再分解的”基本情况”。 二、递归函数的两个基本要素每个递归函数都必须包含两部分,以确保其能正确执行并最终停止: 基线条件(Base Case):这是递归函数停止调用自身并开始返回结果的条件。没有基线条件,递归函数就会无限地调用下去,直到耗尽所有内存(导致栈溢出)。基线条件是递归...
【算法】《算法图解》第七章学习笔记:树
前言在前面的章节中,我们学习了数组、链表、散列表等基本数据结构,以及一些基础算法。本章将介绍一种非常重要的数据结构——树(Tree),特别是二叉搜索树(Binary Search Tree)。树结构在计算机科学中应用广泛,从文件系统到数据库再到人工智能,都能看到树的身影。《算法图解》第七章深入浅出地介绍了树的基本概念、实现和应用,帮助读者理解这一关键数据结构。 一、树的基本概念(一)什么是树树是一种分层数据的抽象模型,它由一系列节点组成,这些节点通过边相连。树具有以下特性: 树有一个根节点(Root),它是树的起始点 除根节点外,每个节点都有且仅有一个父节点 每个节点可以有零个或多个子节点 节点之间没有循环连接(这意味着树是无环的) 没有子节点的节点称为叶节点(Leaf) 树的常见术语: 节点(Node): 树中的基本单位,包含数据和指向其他节点的链接 边(Edge): 连接两个节点的线 根(Root): 树顶部的节点,是树中唯一没有父节点的节点 叶节点(Leaf): 没有子节点的节点 父节点(Parent): 有子节点的节点 子节点(Child): 有父节点的节点 兄弟节...
【算法】《算法图解》学习笔记总览
前言《算法图解》(Grokking Algorithms) 是由 Aditya Y. Bhargava 编写的一本算法入门书籍,以其通俗易懂的语言和生动形象的图解闻名。本书特别适合算法初学者,通过简明的解释和丰富的插图,将复杂的算法概念转化为易于理解的内容。笔者通过系统学习这本书,记录了各章节的学习笔记,本文作为总结和导航,帮助读者快速了解全书内容并方便查阅各章节的详细笔记。 一、《算法图解》整体内容概述《算法图解》从基础的算法概念开始,逐步深入到更复杂的算法思想,全书共13章,涵盖了以下核心内容: (一)基础算法与数据结构 二分查找:一种针对有序数组的高效查找算法,时间复杂度为O(log n) 数组与链表:两种基本数据结构,各有优缺点 递归:一种解决问题的重要思想,通过函数调用自身来解决问题 栈:一种后进先出(LIFO)的数据结构,用于实现递归 **散列表(哈希表)**:通过键值对实现快速查找的数据结构 (二)排序算法 选择排序:一种简单直观的排序算法,时间复杂度为O(n²) 快速排序:一种高效的分治排序算法,平均时间复杂度为O(n log n) 归并排序:另一种分治排序算法...
【算法】《算法图解》第一章学习笔记:算法简介与二分查找
前言《算法图解》是一本入门算法的优秀读物,以图文并茂的方式讲解了各种基础算法。笔者最近在学习此书,特此记录学习笔记。本篇笔记主要记录第一章的核心内容,包括什么是算法、二分查找的思想及其实现、以及衡量算法效率的大O表示法。 一、什么是算法算法(Algorithm)是一组用于完成特定任务的指令。简单来说,就是解决问题的方法和步骤。一个好的算法,不仅要能够正确解决问题,还要追求更高的效率,即用更少的时间和更少的内存。 二、二分查找二分查找(Binary Search)是一种高效的查找算法,但它有一个重要的前提:输入的数据必须是有序的。 (一)算法原理二分查找的原理非常简单。想象一下在电话簿里找一个名字,或者在字典里查一个单词。我们通常不会从第一页开始逐个查找,而是会: 打开书大约中间的一页。 比较中间的条目与我们要查找的目标。 如果目标条目在当前条目的前面,则在书的前半部分重复此过程。 如果目标条目在当前条目的后面,则在书的后半部分重复此过程。 重复以上步骤,直到找到目标或确定目标不存在。 这个过程就是二分查找。每次查找都将搜索范围缩小一半,因此效率很高。 例如,在一个包含 100...
【求职】计算机行业面试常见问题与回答技巧
一、前言计算机行业的面试过程通常包含多个环节,从技术能力评估到软技能考察,再到文化匹配度判断。无论是应届毕业生还是经验丰富的工程师,了解面试中常见的问题类型及有效的回答策略,对于成功获得理想职位至关重要。本文将系统地介绍计算机行业面试中常见的问题类型,并提供相应的回答技巧和准备方法,帮助读者在面试中展现最佳状态。 二、技术面试常见问题(一)编程基础与算法 数据结构与算法问题 常见问题: “请实现一个算法来解决X问题” “分析这个算法的时间和空间复杂度” “如何优化这个解决方案?” 回答技巧: 123451. 理解问题:先确保完全理解题目要求,必要时可向面试官提问澄清2. 思考过程:说出思考过程,包括可能的解决方案及其优缺点3. 编写代码:清晰地编写解决方案,注意代码风格和命名规范4. 测试验证:主动提供测试用例,验证解决方案的正确性5. 分析复杂度:主动分析时间和空间复杂度,并讨论优化可能 示例回答框架:“这个问题看起来可以用X方法解决。我的思路是先…然后…最后…。这个算法的时间复杂度是O(X),空间复杂度是O(Y)。如果要进一步优化,我们可以考虑…” 编程语言特性 常见...
【求职】计算机行业求职简历中的专业术语解析
一、前言在计算机行业求职过程中,一份专业的简历往往充斥着各种技术术语和框架名称。这些术语不仅展示了求职者的专业背景,也是HR和技术面试官快速评估候选人技能水平的重要依据。然而,对于初入职场的新人或者跨领域求职的人才来说,如何准确理解和恰当使用这些专业术语可能是一个挑战。本文旨在解析计算机行业求职简历中常见的专业术语,帮助求职者更好地展示自己的技术实力,同时也为招聘方提供一个术语参考。 二、后端开发相关术语(一)框架与API开发 RESTful API 当简历中出现”基于Flask/FastAPI等框架开发高效RESTful API接口”时,实际上是在描述一种遵循REST架构风格的API设计和实现能力。 12REST (Representational State Transfer) 是一种设计风格,而非标准。RESTful API 使用HTTP请求来执行CRUD操作(创建、读取、更新、删除)。 具体技能点包括: 理解并实践REST架构约束(无状态、统一接口等) 合理设计API资源路径和HTTP方法 实现适当的状态码和错误处理机制 优化API性能和响应时间 Web...
【求职】Vue前端面试问题
前言Vue.js作为当前最受欢迎的前端框架之一,在求职市场中占据重要地位。无论是Vue 2还是Vue 3,掌握其核心概念和面试技巧都是前端开发者必备的技能。本文整理了Vue面试中最常见的问题类型,并提供了详细的回答思路和代码示例,帮助求职者在面试中展现专业水平。 一、Vue基础概念面试问题(一)Vue核心特性1. 请解释Vue的核心特性标准回答: Vue.js具有以下核心特性: 响应式数据绑定: 数据变化时自动更新视图 基于Object.defineProperty(Vue 2)或Proxy(Vue 3)实现 支持双向数据绑定 12345678910111213141516<template> <div> <input v-model="message" placeholder="输入内容"> <p>{{ message }}</p> </div></template><script>e...
【求职】Java面试问题
前言Java作为企业级开发的主流语言,在求职市场中占据重要地位。无论是初级开发者还是资深工程师,掌握Java面试的核心问题和回答技巧都至关重要。本文整理了Java面试中最常见的问题类型,并提供了详细的回答思路和技巧,帮助求职者在面试中脱颖而出。 一、Java基础知识面试问题(一)面向对象编程1. 请解释Java中的面向对象三大特性标准回答: Java面向对象编程有三大核心特性: 封装(Encapsulation): 将数据和操作数据的方法封装在类中 通过访问修饰符(private、protected、public)控制访问权限 提供getter/setter方法来访问私有属性 12345678910111213public class Student { private String name; // 私有属性,实现封装 private int age; // 提供公共方法访问私有属性 public String getName() { return name; } p...

