不管是做前端还是后端,都可能会遇到路由匹配的需求。如果是静态路由,可以直接用哈希表进行存储,查找时直接从哈希表查即可,速度非常快,复杂度 O(1)。
但在实际场景中,更多的是动态路由的匹配,动态路由直接用哈希表就有点力不从心了。动态路由可以用前缀树这个结构。
打造一款简洁高效且比较有颜的终端
作为程序员,经常要和终端打交道。但是默认的终端bash,不仅丑,而且难用至极。
这里推荐使用zsh,被誉为终极shell,但刚安装的zsh默认状态下,也是丑与难用,需要配置一下,才能打造一款舒适的终端shell。
本文就使用zsh来配置一款简洁高效且颜值还不错的终端。
链表反转.md
链表是一个很简单的结构,虽然简单,但对于链表节点的操作,以及对于边界细节的处理,是面试中经常问到的。而且由于链表的定义符合递归定义,因此有时候考察递归思想时,也用链表来考察。
VirtualBox中Ubuntu20.04设置桥接网络.md
在虚拟机VirtualBox中安装UbuntuServer进行实验,默认使用NAT网络模式,但是宿主机无法联通虚拟机,因此将NAT模式改为桥接模式。
Arch安装手记.md
arch安装手记
其实arch的安装并不复杂,如果你使用图形化安装工具安装过其他linux发行版,那么你应该知道安装时会进行一系列的设置,设置分区,设置用户名等等。
arch的安装没有图形化的工具,因此需要使用命令行来设置。其设置的内容也和图形化安装并无任何差异。
下面整理了一下安装一个arch所基本的命令。
字符串匹配算法-Rabin Karp算法
一个很简单的问题,给定一个字符串txt和一个模式串pat,写一个函数search来输出字符串txt中所有和pat相等的子串。
例如,给定txt=”this is a test text”, pat=”text”,返回 [10]
这个问题非常简单,我们只需要暴力穷举所有txt中所有长度等于len(pat)的子串,并判断其是否和pat相等即可。相等就返回其起始索引。
在判断子串是否和pat相等时,我们需要逐位去比较。这样,这个问题的复杂度就是 O(mn)。这种算法我们称为朴素字符串匹配算法。
很显然,这样的算法效率并不高。
traefik自定义中间件
Træfɪk自定义中间件
Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。
Traefik是golang写的,与docker,k8s深度集成,支持服务的自动发现与热部署。
从Traefik2.0版本开始,其加入了中间件,功能更丰富,但是目前(v2.2)官方还不支持以插件的形式自定义中间件。因此,如果要自定义中间件的话,需要在源码上做改动。
滑动窗口算法思想
滑动窗口算法思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。
滑动窗口的思想非常简单,它将子数组(子字符串)理解成一个滑动的窗口,然后将这个窗口在数组上滑动,在窗口滑动的过程中,左边会出一个元素,右边会进一个元素,然后只需要计算当前窗口内的元素值即可。
一道SQL练习题
SQL技能是开发人员的基本技能,因此面试开发时,都会问到SQL相关的知识。
我在帮助公司招人时,也会出一道SQL的题目,来考察候选人的SQL技能。
下面这道题就是我面试时用到的,一个题,几个小题,难度逐步增大,考察候选人对于SQL的理解与应用。
减治策略和分治策略
在算法设计与分析里,有这么两个算法,减治策略和分治策略。减治我还是第一次听说,分治之前听说过,但说实话,减治和分治什么区别,有时候还真说不上来。今天趁着这个机会,再复习一下这两个算法分析策略。