07 2020 档案
摘要:什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯” 返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回
阅读全文
摘要:前言 搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。 当你在搜索框中,一不小心输错单词时,搜索引擎会非常智能地检测出你的拼写错误,并且 用对应的正确单词来进行搜索。 如何量化两个字符串的相似度? 计算机只认识数字,所以要解答上面的问题,我们就要先来看,如何量化两个字符串之间
阅读全文
摘要:前言 上一节通过两个经理案例初步认识动态规划,今天这一节主要讲动态规划的理论知识。 “一个模型三个特征”理论讲解 实际上,动态规划作为一个非常成熟的算法思想,这部分理论总结为“一个模型三个特征”。 一个模型 一个模型指动态规划适合解决的问题模型。这个模型定义为“多阶段决策最优解模型”。 一般是用动态
阅读全文
摘要:前言 今天开始学习动态规划,一共有三节,分别是:初识动态规划、动态规划理论、动态规划实战。今天这一节就是初识动态规划。 动态规划比较适合用来求解最优问题,比如最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。 下面会通过两个非常经典的动态规划问题模型来展示为什么需要动态规划,以
阅读全文
摘要:什么是搜索算法 上一节介绍了图的基本概念,这一节介绍图的搜索算法。 图的搜索算法,最直观的理解就是从一个顶点到另一个顶点的路径。 最简单的是广度优先搜索和深度优先搜索,这也是这一节介绍的内容。另外还有A*、IDA*等启发式搜索算法。 本节内容以无向图为例,以下代码是图的代码实现。 // 无向图 cl
阅读全文
摘要:基本概念 图是一种非线性的数据结构,相比树来说,更加复杂。 图的元素叫顶点,树的元素叫节点。 度:顶点相连的边的条数叫度。 图的分类有无向图、有向图、带权图 无向图 边没有方向的图员无向图。无向图中的顶点相连的边的条数叫度。例如微信上的好友关系。 有向图 边有方向的图叫有向图。有向图中分为入度和出度
阅读全文
摘要:配置,是应用程序很重要的组成部分,常常用于提供信息,像第三方应用登录钥匙、上传格式与大小限制等等。 ASP.NET Core提供一系列配置提供程序读取配置文件或配置项信息。 ASP.NET Core项目启动时默认加载的配置有: 命令行参数 环境变量 appsettings.json、appsetti
阅读全文
摘要:什么是服务器 服务器指ASP.NET Core应用运行在操作系统上的载体,也叫Web服务器。 Web服务器实现侦听HTTP请求,并以构建HttpContext的对象发送给ASP.NET Core应用。 Kestrel Kestrel是ASP.NET Core默认指定的Web服务器。 作为边缘服务器,
阅读全文
摘要:主机定义 主机是封闭应用资源的对象。 设置主机 主机通常由 Program 类中的代码配置、生成和运行。 HTTP项目(ASP.NET Core项目)创建泛型主机: public class Program { public static void Main(string[] args) { Cre
阅读全文
摘要:上一节我们学习了堆和堆排序的一些理论知识(点击查看),今天我们就来讲一讲,堆这种数据结构的几个非常重要的应用。 应用一:优先级队列 优先队队列,是一个按优先级进出的特殊队列,一般的队列是先进先出,而优先级队列是优先级高的先出。 优先级队列与堆非常相似,一个堆可以看作一个优先级队列。往优先队队列插入一
阅读全文
摘要:什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件。每个中间件: 选择是否将请求传递到管道中的下一个中间件。 可在管道中的下一个中间件前后执行。 ASP.NET Core请求管道包含一系列请求委托,依次调用。工作原理: PS:类似于ASP.NET里的Handler(处理程序)和Modu
阅读全文
摘要:今天我们来学习堆和堆排序。 什么是堆 堆是一种特殊的树,满足以下两点要求: 堆是一个完全二叉树。 堆中每个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 通过要求二可知,堆有两种类型,大顶堆和小顶堆: 对于每个节点的值都大于等于子树中每个节点值的堆,叫作“大顶堆”。 对于每个节点的值都小
阅读全文
摘要:ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法。 什么是依赖注入 我们看一下下面的例子: public class MyDependency { public MyDependency() { } public Task WriteMessage(st
阅读全文
摘要:Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道。 Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务。服务是一个提供应用功能的可重用组件。 通过Configure方法配置应用的请求处理管道(中间件)。 下面是VS通过A
阅读全文
摘要:前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助。 课程大纲 本系列课程主要分为三个部分:基础篇、实战篇和部署篇。 希望通过本系列课程,能让大家初步掌握使用ASP.NET Core开发。 课程大纲: 基础篇 Startup 依赖注入 中间件 主机 服务器 配置 选项 环境
阅读全文
摘要:前言 在排序那一节里,讲到排序时,利用递推公式推导时间复杂度来求解归并排序、快速排序的时间复杂度,但有些情况,例如快速排序的平均时间复杂度,利用递推公式,会涉及很复杂的数据推导。今天学习一种特殊的树来分析递归算法的时间复杂度,那就是递归树。 递归树与时间复杂度 递归算法的思路是把大问题分成小问题来解
阅读全文
摘要:前言 二叉查找树是最常用的一种二叉树,它支持快速查找、插入、删除操作。性能与树的高度成正比,理想情况下,时间复杂为是O(logn)。 不过频繁的更新,二叉树的高度会远大于log2n,极端情况会退化成链表,时间复杂度变为O(n)。 因此需要设计一种平衡二叉查找树的结构,今天讲的红黑树就是平衡二叉查找树
阅读全文
摘要:二叉查找树 二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。 二叉查找树要求,在树中的任意一个节点,其左子的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。 二叉查找树的查找操作 对比当前节点(首个是根节点),相等则返回。 大于则从右子树查找 小于则从左子树查找 直到叶
阅读全文
摘要:概念 树:是一种数据结构,像一颗倒挂的树。树的每个元素叫作“节点”;用来连续相邻节点之间的关系,叫作“父子关系”。 关于高度(Height)、深度(Depth)、层(Level) 节点的高度=节点到叶子节点的最长路径(边数)。 节点的深度=根节点到这个节点所经历的边的个数。 节点的层数=节点的深度+
阅读全文
摘要:前言 上一节我们讲了哈希算法的四个应用,分别是安全加密、数据校验、唯一标识、散列函数。今天再来看看剩下的三个应用:负载均衡、数据分片、分布式存储。 可能大家已经发现了,这三个应用都是与分布式相关的。没错,今天我们来学习一下,哈希算法是如何解决这些分布式问题的。 应用五:负载均衡 负载均衡算法有很多,
阅读全文
摘要:什么是哈希算法 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。而通过原始数据映射之后得到的二进制值串就是哈希值。 一个优秀的哈希算法要满足几点要求: 从哈希值不能反向推导出原始数据(所以哈希算法也叫意向哈希算法); 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,
阅读全文
摘要:有两种数据结构(散列表和链表)经常会被放在一起使用。前面的章节中有两个地方讲到散列表和链表的组合使用,分别是: 《数据结构与算法之美》04——链表 《数据结构与算法之美》13——跳表 另外,Java中有一个容器LinkedHashMap也使用到散列表和链表。 下面我们来看看这几个问题,散列表和链表是
阅读全文
摘要:通过上一节的学习,我们知道,散列表的查询效率并不能简单说成是O(1)。它跟散列函数、装载因子、散列冲突等地都有关系。 今天我们来学一下,如何设计一个可以应对各种异常情况的工业级散列表,来避免在散列冲突的情况下,散列表性能的急剧下降,并且能抵抗散列碰撞攻击? 下面我们从散列函数、装载因子、散列冲突等方
阅读全文
摘要:今天我们来介绍一个新的数据结构:散列表(Hash Table),平时也叫“哈希表”或“Hash表”。 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。 下面用个例子来介绍一下。 假如我们有89名选手参加学校运动会。为了方便记录成绩,每个选手都有一个参
阅读全文

浙公网安备 33010602011771号