关于hexo的用法
按照 https://hexoscript.github.io/ 的步骤完成
之后去 csdn 上找 hexo butterfly 可以找到文章主题配置等相关的,注意有些可以改,有些不要改,有可能会出现 index.html 为空白的情况
最快速的命令为:hexo clean && hexo g && hexo d文章放到 E:\hexo\hexoblog\source_posts 中,以 .md 的形式,用 Typora 编辑,在每一篇文章的最上面写上如下:
-–
title: 名称
tags: 标签名
categories: 分类名
-–
如果创建新页面的话,则使用hexo new page 对应的名称这个对应的名称是看模板文件中的menu后面的//
接口文档
请求的根路径
http://www.liulongbin.top:3006
评论列表
接口URL: /api/cmtlist
调用方式: GET
参数格式:无
响应格式:
数据名称
数据类型
说明
status
Number
200 成功;500 失败;
msg
String
对 status 字段的详细说明
data
Array
评论列表
+id
Number
评论Id
+username
String
评论人姓名
+content
String
评论内容
+time
String
评论时间
返回示例:
123456789101112131415161718{ "status": 200, "msg": "获取评论列表成功", "data": [ { "id": 2, "username": " ...
二叉搜索树
JavaScript 数据结构与算法(十三)二叉搜索树二叉搜索树二叉搜索树(BST,Binary Search Tree),也称为二叉排序树和二叉查找树。
二叉搜索树是一棵二叉树,可以为空。
如果不为空,则满足以下性质:
条件 1:非空左子树的所有键值小于其根节点的键值。比如三中节点 6 的所有非空左子树的键值都小于 6;
条件 2:非空右子树的所有键值大于其根节点的键值;比如三中节点 6 的所有非空右子树的键值都大于 6;
条件 3:左、右子树本身也都是二叉搜索树;
如上图所示,树二和树三符合 3 个条件属于二叉树,树一不满足条件 3 所以不是二叉树。
总结:二叉搜索树的特点主要是较小的值总是保存在左节点上,相对较大的值总是保存在右节点上。这种特点使得二叉搜索树的查询效率非常高,这也就是二叉搜索树中“搜索”的来源。
二叉搜索树应用举例下面是一个二叉搜索树:
若想在其中查找数据 10,只需要查找 4 次,查找效率非常高。
第 1 次:将 10 与根节点 9 进行比较,由于 10 > 9,所以 10 下一步与根节点 9 的右子节点 13 比较;
第 2 次:由于 10 & ...
二叉树
JavaScript 数据结构与算法(十二)二叉树二叉树二叉树的概念如果树中的每一个节点最多只能由两个子节点,这样的树就称为二叉树;
二叉树的组成
二叉树可以为空,也就是没有节点;
若二叉树不为空,则它由根节点和称为其左子树 TL 和右子树 TR 的两个不相交的二叉树组成;
二叉树的五种形态
上图分别表示:空的二叉树、只有一个节点的二叉树、只有左子树 TL 的二叉树、只有右子树 TR 的二叉树和有左右两个子树的二叉树。
二叉树的特性
一个二叉树的第 i 层的最大节点树为:2^(i-1)^,i >= 1;
深度为 k 的二叉树的最大节点总数为:2^k^ - 1 ,k >= 1;
对任何非空二叉树,若 n0 表示叶子节点的个数,n2表示度为 2 的非叶子节点个数,那么两者满足关系:n0 = n2 + 1;如下图所示:H,E,I,J,G 为叶子节点,总数为 5;A,B,C,F 为度为 2 的非叶子节点,总数为 4;满足 n0 = n2 + 1 的规律。
特殊的二叉树完美二叉树完美二叉树(Perfect Binary Tree)也成为满 ...
树
JavaScript 数据结构与算法(十一)树树结构什么是树?真实的树:
树的特点:
树一般都有一个根,连接着根的是树干;
树干会发生分叉,形成许多树枝,树枝会继续分化成更小的树枝;
树枝的最后是叶子;
现实生活中很多结构都是树的抽象,模拟的树结构相当于旋转 180° 的树。
树结构对比于数组/链表/哈希表有哪些优势呢?数组:
优点:可以通过下标值访问,效率高;
缺点:查找数据时需要先对数据进行排序,生成有序数组,才能提高查找效率;并且在插入和删除元素时,需要大量的位移操作;
链表:
优点:数据的插入和删除操作效率都很高;
缺点:查找效率低,需要从头开始依次查找,直到找到目标数据为止;当需要在链表中间位置插入或删除数据时,插入或删除的效率都不高。
哈希表:
优点:哈希表的插入/查询/删除效率都非常高;
缺点:空间利用率不高,底层使用的数组中很多单元没有被利用;并且哈希表中的元素是无序的,不能按照固定顺序遍历哈希表中的元素;而且不能快速找出哈希表中最大值或最小值这些特殊值。
树结构:
优点:树结构综合了上述三种结构的优点,同时也弥 ...
哈希表
JavaScript 数据结构与算法(十)哈希表认识哈希表哈希表是一种非常重要的数据结构,几乎所有的编程语言都直接或者间接应用这种数据结构。
哈希表通常是基于数组实现的,但是相对于数组,它存在更多优势:
哈希表可以提供非常快速的 插入-删除-查找 操作。
无论多少数据,插入和删除值都只需接近常量的时间,即 O(1) 的时间复杂度。实际上,只需要几个机器指令即可完成。
哈希表的速度比树还要快,基本可以瞬间查找到想要的元素。
哈希表相对于树来说编码要简单得多。
哈希表同样存在不足之处:
哈希表中的数据是没有顺序的,所以不能以一种固定的方式(比如从小到大 )来遍历其中的元素。
通常情况下,哈希表中的 key 是不允许重复的,不能放置相同的 key,用于保存不同的元素。
哈希表是什么?
哈希表并不好理解,不像数组、链表和树等可通过图形的形式表示其结构和原理。
哈希表的结构就是数组,但它神奇之处在于对下标值的一种变换,这种变换我们可以称之为哈希函数,通过哈希函数可以获取 HashCode。
通过以下案例了解哈希表:
案例一:公司想要存储 1000 个人的信息,每一个工号对应一个员工 ...
字典
JavaScript 数据结构与算法(九)字典字典字典特点
字典存储的是键值对,主要特点是一一对应。
比如保存一个人的信息
数组形式:[19,"Tom", 1.65],可通过下标值取出信息。
字典形式:{"age": 19, "name": "Tom", "height": 165},可以通过 key 取出 value。
此外,在字典中 key 是不能重复且无序的,而 Value 可以重复。
字典和映射的关系
有些编程语言中称这种映射关系为字典,如 Swift 中的 Dictonary,Python 中的 dict。
有些编程语言中称这种映射关系为 Map,比如 Java 中的 HashMap 和 TreeMap 等。
字典常见的操作
set(key,value) 向字典中添加新元素。
remove(key) 通过使用键值来从字典中移除键值对应的数据值。
has(key) 如果某个键值存在于这个字典中,则返回 true,反之则返回 false。
get(key ...
集合
JavaScript 数据结构与算法(八)集合集合几乎每种编程语言中,都有集合结构。集合比较常见的实现方式是哈希表,这里使用 JavaScript 的 Object 进行封装。
集合特点
集合通常是由一组无序的、不能重复的元素构成。
数学中常指的集合中的元素是可以重复的,但是计算机中集合的元素不能重复。
集合是特殊的数组。
特殊之处在于里面的元素没有顺序,也不能重复。
没有顺序意味着不能通过下标值进行访问,不能重复意味着相同的对象在集合中只会存在一份。
封装集合ES6 中的 Set 就是一个集合类,这里我们重新封装一个 Set 类,了解集合的底层实现。
集合常见的操作
add(value) 向集合添加一个新的项。
remove(value) 从集合移除一个值。
has(value) 如果值在集合中,返回 true,否则返回 false。
clear() 移除集合中的所有项。
size() 返回集合所包含元素的数量。与数组的 length 属性类似。
values() 返回一个包含集合中所有值的数组。
还有其他的方法,用的不多,这里不做封装。
代码实现12345678910 ...
双向链表
JavaScript 数据结构与算法(七)双向链表单向链表和双向链表单向链表
只能从头遍历到尾或者从尾遍历到头(一般从头到尾)。
链表相连的过程是单向的,实现原理是上一个节点中有指向下一个节点的引用。
单向链表有一个比较明显的缺点:可以轻松到达下一个节点,但回到前一个节点很难,在实际开发中, 经常会遇到需要回到上一个节点的情况。
双向链表
既可以从头遍历到尾,也可以从尾遍历到头。
链表相连的过程是双向的。实现原理是一个节点既有向前连接的引用,也有一个向后连接的引用。
双向链表可以有效的解决单向链表存在的问题。
双向链表缺点:
每次在插入或删除某个节点时,都需要处理四个引用,而不是两个,实现起来会困难些。
相对于单向链表,所占内存空间更大一些。
但是,相对于双向链表的便利性而言,这些缺点微不足道。
双向链表结构
双向链表不仅有 head 指针指向第一个节点,而且有 tail 指针指向最后一个节点。
每一个节点由三部分组成:item 储存数据、prev 指向前一个节点、next 指向后一个节点。
双向链表的第一个节点的 prev 指向 null。
双向链表的最后一个节点的 nex ...
单向链表
JavaScript 数据结构与算法(六)单向链表认识链表链表和数组链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。
数组
存储多个元素,数组(或列表)可能是最常用的数据结构。
几乎每一种编程语言都有默认实现数组结构,提供了一个便利的 [] 语法来访问数组元素。
数组缺点:
数组的创建需要申请一段连续的内存空间(一整块内存),并且大小是固定的,当前数组不能满足容量需求时,需要扩容。 (一般情况下是申请一个更大的数组,比如 2 倍,然后将原数组中的元素复制过去)
在数组开头或中间位置插入数据的成本很高,需要进行大量元素的位移。
链表
存储多个元素,另外一个选择就是使用链表。
不同于数组,链表中的元素在内存中不必是连续的空间。
链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针)组成。
链表优点:
内存空间不必是连续的,可以充分利用计算机的内存,实现灵活的内存动态管理。
链表不必在创建时就确定大小,并且大小可以无限延伸下去。
链表在插入和删除数据时,时间复杂度可以达到 O(1),相对数组效率高很多。
链表缺点:
访 ...