航 行 日 志

2021.10.09

  • 博客崩了 我也是 昨晚的感触没了

2021.08.06

  • 采用OnCDP融合腾讯CDN和又拍云CDN
  • 又拍云参数全程不跟随导致JS页面乱格式 已恢复

2021.07.27

  • 航行日志倒序排列
  • 更改数据库密码

2021.07.21

2021.07.13

  • 缓存插件换为W3 Total Cache Pro
  • 对象缓存为Redis 数据库缓存为 MemCached

2021.07.10

  • CDN层面上精细配置缓存规则,接入Google Adsence

2021.06.30

  • Vcaptcha人机验证更改为Tencent-Captcha滑动验证

2021.06.22

  • 11:31迁移数据库时 删错数据库,好在恢复较快未产生影响
  • 上传GIF图时上传失败系统进入死循环导致不停上传,但未真正上传到云存储上,未查明原因

2021.06.19

  • 博客微信小程序V1.0.0上线
  • 增添回到顶部按钮
  • 更换腾讯云CDN缓存规则

2021.06.15

  • 更改七牛云gravatar国内镜像 functions.php#632-638
  • 更换首页字体为宋体
  • 更换泛域名AlphaSSL证书

2021.06.10

  • 更改鼠标样式与动效 增加Dark / Light切换

2021.05.29

登录时报错Sorry,the version of V3.JS is too low, please upgrade!待排查

2021.05.17

  • 更换 腾讯云CDN

2021.05.04

  • 文章增添 快速索引目录

2021.05.01

  • 更改footer 更改首页引导气泡
  • 增添vaptach验证码

2021.04.28

  • 启用Redis对象缓存,停用WP rocket缓存

2021.04.27

  • 又拍云CDN增添 cdn.blog.wang19.cn 加速CDN域名 并配置停留页
  • 增加博客时间计数器

2021.03.30

  • 迁回香港腾讯轻量I
  • 主题更改为Twenty Fifteen
  • 航行日志字体反色 具体ffffff为000000

2021.03.30

  • 增加登陆页面验证码 关闭评论 
  • 增加复制后提示版权出处弹窗 航行日志嵌入服务器状态

2021.03.24

  • 服务器增添 上海腾讯轻量云III
  • CDN更改为又拍云CDN
  • 回源路线:主路线:上海121* 备用路线:香港119* 香港43*

2021.03.22

  • 紧急事件 危险程度IV
  • 问题:回滚快照后服务器引导区出现问题导致无法开机 
  • 解决方案:云端备份暂时迁移至备用服务器II  主服务器I问题待解决

2021/03/10

  • 升配 增添香港2备用服务器(真奢侈)

2021/03/04

  • 页面色号更改为Arduino电路板色号#105A63

2021/02/28

  • 又拍云blog-upload.wang19.cn图片节点加了防盗链

2021/02/22

  • 写了脚本把随想加了密码
  • 音乐分享跳转到mu3c
  • 主菜单的一级栏目由文章替换为页面 例如友链、关于

2021/02/19

2021/02/15

  • 国内CDN由 又拍云 更改为 百度云加速

2021/02/01

  • 紧急事件 危险程度II
  • 问题:图片加载不出来 排查出是W3C Total Cache插件缓存出问题了 
  • 解决方案:更换缓存插件为WP-Rocket

2021/01/27

  • 紧急事件 危险程度II
  • 问题:CSS莫名其妙失效 切换主题后貌似又好了

2021/01/14

  • 去除顶部图片 主题改为黑底白字 简约明了

2021/01/05

  • 紧急事件 危险程度II
  • Nginx防火墙策略设置错误导致在上传音频的时候误封自己的IP

2020/12/27

  • 博客稳定航行六个月 

2020/11/29 1.2.0

  • 开启Redis数据库写入内存,实现动静分离
  • 静态文件托管又拍云,加速域名blog-upload.wang19.cn
  • 切换Twenty Sixteen主题

2020/11/25

  • 迁移到腾讯轻量,开启宝塔网站加速

2020/11/05

  • 经过反复宕机与配置 实现DNS路线选择与负载均衡

2020/11/03

  • 紧急事件 危险程度IV
  • 问题:由于服务器I (QYIDC)到期停机和配置错误问题
  • 解决方案:续费一个月赎回数据

2020/10/30

  • 由于腾讯cdn无法实现页面压缩 迁至又拍云CDN

2020/10/16

  • 腾讯云CDN

2020/10/08

  • 全站迁移到QYIDC的VPS (HK GIA)

2020/09/03 1.1.0

  • 部署SSL证书 全站开启HTTPS
  • CSS JS文件利用Jsdelivr CDN加速
  • Nginx配置伪静态
  • 大文件上传GitHub仓库利用Jsdelivr加速

2020/08/09

  • 更换Hestia主题 更换域名为com

2020/08/06

  • 由腾讯云洛杉矶服务器迁到阿里云张家庄机房

2020/08/05

  • 首次全站迁移 由三丰云迁至腾讯云洛杉矶服务器

2020/07/28

  • 重新整理分类目录与站点地图

2020/07/20

2020/06/25 – 07/11

2020/06/15   06/18

  • 紧急事件 危险程度IV
  • 受到CC攻击  网页被劫持 百度云加速10G防御已被攻破
  • 原因 :网页被劫持–>DNS/Domain解析错误导致网页被劫持
  • 解决方案 :更改DNS

2020/06/02 梦开始的地方

  • 站点建立
  • 基于Wordpress
  • 三丰云虚拟空间 百度云加速CDN与DNS托管

基础3丨栈

  1. 先进后出 后进先出

从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。

  • 数组栈
// 基于数组实现的顺序栈
public class ArrayStack {
 private String[] items; // 数组
 private int count; // 栈中元素个数
 private int n; //栈的大小

// 初始化数组,申请一个大小为n的数组空间
 public ArrayStack(int n) {
 this.items = new String[n];
 this.n = n;
 this.count = 0;
 }

// 入栈操作
 public boolean push(String item) {
 // 数组空间不够了,直接返回false,入栈失败。
 if (count == n) return false;
 // 将item放到下标为count的位置,并且count加一
 items[count] = item;
 ++count;
 return true;
 }
 
 // 出栈操作
 public String pop() {
 // 栈为空,则直接返回null
 if (count == 0) return null;
 // 返回下标为count-1的数组元素,并且栈中元素个数count减一
 String tmp = items[count-1];
 --count;
 return tmp;
 }
}

栈的扩容

 

基础2丨链表

链表

一组任意的存储单元存储线性表存储元素,可以线性也不可不线性,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串。

单链表

我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。如图所示,我们把这个记录下个结点地址的指针叫作后继指针 next。

随机访问O(n)

我们习惯性地把第一个结点叫作头结点,把最后一个结点叫作尾结点。其中,头结点用来记录链表的基地址。有了它,我们就可以遍历得到整条链表。

而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址 NULL,表示这是链表上最后一个结点

双向链表

循环链表

插入和删除O(1)

双向循环链表

继续阅读基础2丨链表

基础1丨数组

数组

  • 优点:支持随机访问,适合查找操作
  • 劣势:是插入和删除,平均复杂度为O(n);
  • 数组越界问题

假如插入一个新的数组,需要将数组复制然后将新数组的位置进行赋值

数组是线性表的一种,连续的内存空间 数据类型相同,而且只有前和后两个方向,其他的线性表还有 链表 栈 数组 队列

ETC

为什么数组下标从0开始而不是从1开始?

数组的插入和查找实际上就是下标位置的偏移,New_address=base_address+n*address

如果下标从0开始的话公式就要改成

New_address=base_address+(n-1)*address

这样一来,cpu就要出做一个减法的操作;不过多半还是按照以前的习惯继承下来,C/JAVA 亦如此,但也不是全部 比如python下标还有附属的

从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”。前面也讲到,如果用 a 来表示数组的首地址,a[0]就是偏移为 0 的位置,也就是首地址,a[k]就表示偏移 k 个 type_size 的位置,所以计算 a[k]的内存地址只需要用这个公式:a[k]_address = base_address + k * type_size

但是,如果数组从 1 开始计数,那我们计算数组元素 a[k]的内存地址就会变为:a[k]_address = base_address + (k-1)*type_size对比两个公式,我们不难发现,从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始。

不过我认为,上面解释得再多其实都算不上压倒性的证明,说数组起始编号非 0 开始不可。所以我觉得最主要的原因可能是历史原因。C 语言设计者用 0 开始计数数组下标,之后的 Java、JavaScript 等高级语言都效仿了 C 语言,或者说,为了在一定程度上减少 C 语言程序员学习 Java 的学习成本,因此继续沿用了从 0 开始计数的习惯。实际上,很多语言中数组也并不是从 0 开始计数的,比如 Matlab。甚至还有一些语言支持负数下标,比如 Python

继续阅读基础1丨数组

04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

上一节,我们讲了复杂度的大 O 表示法和几个分析技巧,还举了一些常见复杂度分析的例子,比如 O(1)、O(logn)、O(n)、O(nlogn) 复杂度分析。掌握了这些内容,对于复杂度分析这个知识点,你已经可以到及格线了。但是,我想你肯定不会满足于此。

今天我会继续给你讲四个复杂度分析方面的知识点,最好情况时间复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度(average case time complexity)、均摊时间复杂度(amortized time complexity)。如果这几个概念你都能掌握,那对你来说,复杂度分析这部分内容就没什么大问题了。

……………………………………………………………………………………………………………………………………..

// n表示数组array的长度
int find(int[] array, int n, int x) {
int i = 0;
int pos = -1;
for (; i < n; ++i) {
if (array[i] == x) {
pos = i;
break;
}
}
return pos;
}

最好情况时间复杂度就如名字所示,如果数组的第一个数就是我们想要查找的树,就不用进行遍历查找剩下的N-1种情况了,这时候时间复杂度为O(1);如果最后一个数才是我们要查找的,也就是说需要遍历N次 时间复杂度为O(n);

顾名思义,最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。就像我们刚刚讲到的,在最理想的情况下,要查找的变量 x 正好是数组的第一个元素,这个时候对应的时间复杂度就是最好情况时间复杂度。

最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。就像刚举的那个例子,如果数组中没有要查找的变量 x,我们需要把整个数组都遍历一遍才行,所以这种最糟糕情况下对应的时间复杂度就是最坏情况时间复杂度。

要查找的变量 x 在数组中的位置,有 n+1 种情况:在数组的 0~n-1 位置中和不在数组中。我们把每种情况下,查找需要遍历的元素个数累加起来,然后再除以 n+1,就可以得到需要遍历的元素个数的平均值,即:

刚这个公式简化之后,得到的平均时间复杂度就是 O(n)。

 

均摊时间复杂度

均摊时间复杂度就是一种特殊的平均时间复杂度