0%

字符串模式匹配——给定两个字符串,主串 haystack,模式串 needle。在 haystack 中查找 needle 出现的首字符位置。

示例:

输入:haystack="hello",needle="ll" 输出:2

"ll" 在“hello”中出现的首字符位置是第三个字符,下标是 2

暴力的简单匹配

思想是,在 haystack 的每个位置,都检查一遍是不是 needle 的首字符,即后续能不能和 needle 匹配上。

使用两层循环很简单,时间复杂度是 O(len_h*len_n),显然过于复杂。

简单匹配的优化方向

既然要优化,我们肯定要知道原来的算法到底在哪里浪费了性能。可以看下面的例子:

haystack="abcabcabe" needle="abcabe"

跟着简单匹配的思路,以 haystack[0] 为起点,然后主串模式串同时向后移动并匹配每一位,我们可以发现最终匹配会停留在:

  • abcabcabe
  • abcabe

即 c 和 e 匹配失败,那么简单匹配会退出这轮子循环,再以 haystack[1] 进行匹配。

此时以人的思维去看,以 b 或 c 为起点肯定匹配不成功,相反 abcabcabe 和abcabe 是显然可以匹配到的。

而且从遍历的角度来看,主串已经走到了 haystack[5],相当于我们已经获取了前 6 位字符的信息了,我们已经知道前 6 位是什么字符了,再从 haystack[1] 开始的话就相当于刚见过人家长啥样就忘了,没有利用到已知信息,这就是问题所在。

阅读全文 »

矩阵在数据表示中举足轻重。为了方便提取矩阵元素通常都是用二维数组进行存储。但是矩阵并不总是满元素矩阵,里面很多的空元素浪费了很多存储空间,因此有几种特殊矩阵的压缩存储方式。

对称矩阵

对一个 n 阶方阵,其元素 a_ij=a_ji, 则称其为对称矩阵。

容易知道,对称矩阵其实只要记录半边的元素即可,使用二维数组会浪费大量空间。

因此我们使用一个 A[n(n+1)/2] 的一维数组存储按行矩阵下三角部分。即 A[0] 存储 a_11,A[1] 存储 a_21,A[2] 存储 a_22,A[3] 存储 a_31 ... 依次按行存储。

因此下三角元素 a_ij,在 A 中的下标即 k=1+2+ ... + (i-1) + j -1=i*(i-1)/2+j-1。

而上三角元素即反转行列序号进行下标计算即可。

注意按行还是按列存储对存储下标计算有影响。

三角矩阵

上/下三角矩阵一样,以下三角矩阵为例。下三角矩阵是下三角有任意元素,但上三角区元素均为同一常量。因此和对称矩阵的存储方式类似,只是在存储完下三角区后,追加一个元素表示上半区的所有元素。

一维数组 A[n(n+1)/2+1]。下三角区元素 a_ij 下标 k=i(i-1)/2+j-1,上三角元素下标 k=n(n+1)/2

三对角矩阵

三对角矩阵也叫做带状矩阵,矩阵内元素 a_ij, 当|i-j|>1 时,a_ij=0。即所有元素集中在主对角线中心的三条对角线上,其余元素为 0。

易知存储上首行和末行只有两个元素,其余每行有三个元素。因此也可以使用 A[3*(n-2)+4] 的一维数组进行存储。

A 中元素 a_ij 的存储下标 k=2i+j-3。

稀疏矩阵

矩阵非零元素比零元素少得多得多,即为稀疏矩阵。例如 521X521 的矩阵中,只有 802 个非零元素。

因此我们肯定选择只存储非零元素即可,但是非零元素不像上面几个一样有分布规律,因此这里还需要记录非零元素的位置信息。

所以采用三元组方式存储,每个存储结构保存位置 i,j,以及值 v。至于实现可以采用结构体数组或是十字链表法。

矩阵压缩的题目大多都是计算下标,注意按行按列的存储方式,注意矩阵起始下标是 1 还是 0,注意存储数组的起始下标是 1 还是 0。

起因

本来在【关于】页挂了个终末之诗,觉得写得很好想分享出去看看。

结果别说看了,别人打开 GitHub 部署的静态网页完全就是 404!用久了传送门都忘掉了 GitHub 是带墙的 ... 只能保存了个没有样式的 html 发过去。

一开始还以为是个别连不上,因为我自己裸连虽然慢了点也能上。后来发现好像是因为上海的网墙矮一点??之前在上海也是能裸连 R6 服务器,回江西那是完全登不上的那种。

所以想着再在国内代码托管平台部署一个了。毕竟虽然没有人看,但偶尔想分享的时候也太不方便了= =

配置

单独配置其中任何一个平台的话,在前面的博客里写的很详细了,默认已经配置好了 GitHub 哈,介绍一些双线部署的小问题。

阅读全文 »

前言

本文是我自己翻译 Microsoft 的 英文原文

因为自己刚学 C++的时候,直接是装的 Visual Studio 2017,一套 20G 的 IDE 解决所有事情,但是用着用着发现了 Visual Studio Code 这个极致现代美感的编辑器!再看 VS 那傻大粗的体量实在不想用。

然而 VSCode 只是个编辑器,要用来写 C++还需要配置相应的编译器环境。网上大部分配置教程都是从下一个 MinGW 出发 ... 然而我本身已经装过了 VS,Microsoft C++环境已经有了,想着能不能直接给 VSCode 用。

但是找了半天没发现什么有用的教程,最后在微软官方文档中找到了英文教程,虽然也不是很全面,但入门使用是够了的。

阅读全文 »

是在 hexo 写的第一篇生活记录吧(大概也是几年来写的第一篇 hhhh

随便写写看看能写出啥

博客的坑

自从开始 Hexo 搭建博客,不知道多少时间都拿去填了这该死的坑。一开始只是想着能跑起来就好,技术专业嘛,注重文本可读性,当个可以远程看的文本笔记就行。主题什么的不重要,字体什么的不重要,只要给我白底黑字,我能读能复习就 ok!!

结果,网站能跑了,开始想想要不给搞个主题配置吧!直接默认风格也太寒颤了,好像隔壁 Next 主题清新的就很和我胃口,装了。 (虽然 Next 主题用的人比默认主题多多了,十个 Hexo 九个 Next,剩下一个是学前端的自定义主题)

博客多了看起来多麻烦,想想要不添加个分类和标签功能吧!嗯嗯都是为了方便找归档博客!诶诶隔壁博客还能放网易云背景音乐啊,带 BGM 看博客肯定很舒服我要了我要了!噢作为一个程序员,大家肯定能理解,别的不折腾,代码高亮主题肯定要折腾一下!!是用 HighlightJS 呢,还是 prismJS 呢,还是 hexo-prism 插件呢!还是一贯的 Google 信仰加持的 Google-code-prettify 呢!折腾了半天还出 BUG 了,甚至不能改回正常的普普通通朴素高亮,重新安了一个 Next 主题 ...

阅读全文 »