算法与数据结构
luqian1996
这个作者很懒,什么都没留下…
展开
-
经典算法与数据结构(7)—— 一致性哈希算法
前言假设现在有一个分布式系统,比如创建一个Tomcat集群部署一个web项目,采用Nginx服务器进行负载均衡。我们知道,nginx常见的负载均衡策略有:轮询(一个一个来)权重(访问比率参照分配给各个服务器的权重)URL hash(server_id = hash(request_url)%server_num),对请求的URL进行哈希,再对服务器个数进行取模,得到相应的服务器序号。...原创 2020-01-31 01:11:04 · 235 阅读 · 0 评论 -
经典算法与数据结构(6)—— 二叉树的常规遍历(递归+非递归+层次遍历)
今天记录的是非常基础的二叉树的遍历,包括递归、非递归、层次遍历三个版本。最简单的当然就是递归版本的遍历啦,非递归版本还是要稍稍动点脑筋的。递归遍历递归版本的没啥好说的,对当前结点的打印有三个位置可以放,分别对应了前序、中序、后序遍历。简单易理解,但就是效率比较低。public class TraverseRecursion { public static void traver...原创 2019-12-12 20:07:58 · 148 阅读 · 0 评论 -
经典算法与数据结构(5)—— 二叉树的Moris遍历 (空间复杂度O(1))
二叉树的遍历(无论是递归还是非递归),都会用到栈结构,其中递归版本用的是系统栈,非递归版本用的是Java自带的Stack结构,空间复杂度均为递归栈的深度,即O(h),h为二叉树的高度。此外,层次遍历的空间复杂度是O(w),w为二叉树的宽度。Moris遍历的神奇之处在于,他的空间复杂度只有O(1),核心思想是利用叶子结点的空指针,下面介绍主要流程和代码实现。Moris遍历的流程Moris遍...原创 2019-12-11 21:01:30 · 513 阅读 · 0 评论 -
经典算法与数据结构(4)—— 图的遍历与常见算法实现(最小路径+最小生成树+拓扑排序)
前言上一篇博客里讲了图结构的代码实现,本篇就记录一下,如何利用上一篇介绍的图结构,进行图的遍历(BFS + DFS)以及实现图相关的常见算法,包括Prim算法、Kruskal算法、Dijkstra算法以及拓扑排序。关于图的这些算法,一直以来只是停留在了解算法思想的程度,还没有动手实现过。全部实现一遍过后,会发现代码量并不大,思想也都比较朴素,没有特别精巧难理解的那种。即便如此,亲手写一遍也还是...原创 2019-12-06 19:01:37 · 271 阅读 · 0 评论 -
经典算法与数据结构(3)—— 图的实现与反序列化
前言根据很多教材上的介绍,图结构的表示一般来说有两种——邻接矩阵法与邻接表法。事实上呢,除了这两种,还有另一种矩阵表示的方法[[weight, from, to], [weight, from, to],…]。那么不管是哪种表示方法,都是一种保存图的方式。如果我们想要反序列化图,把图加载到内存中,要怎么做呢?不管是哪种方式的保存方式,第一步都得先定义图结构,再具体确定如何进行反序列化。图的定义...原创 2019-12-05 16:44:56 · 565 阅读 · 0 评论 -
经典算法与数据结构(2)—— 三大排序算法(快排+堆+归并)
今天来手写一下三大经典排序算法吧,这个是非常基础的算法了。虽说基础吧,但是如果长时间不写,一下子未必能很熟练的写出来~ 把这三个放在一起是因为他们的时间复杂度都是O(NlogN),是效率比较高的排序算法。(随机)快速排序首先是快排,左神讲快排给我留下的印象挺深的,感觉比较好记。大意就是,在数组的左边划分一个less区(默认-1),右边划分一个more区(初始状态是包含最后一个元素)。首...原创 2019-12-04 15:30:30 · 247 阅读 · 0 评论 -
经典算法与数据结构(1)— KMP算法
经典算法的第一篇,记录一下KMP算法好了,因为比较经典巧妙而且我考研的时候忘看了没做出来????????????。KMP算法是三个人一起发明的,三个人的名字首字母分别是K、M、P,所以叫KMP~问题定义给定一个字符串S, 以及另一个字符串P, 判断P是否为S的子串,输出true or false。暴力解法暴力解法比较容易想到,就是遍历S,如果找到和P的首字母相匹配的元素,就继续逐个比对,发生失配时就继续...原创 2019-10-30 13:52:56 · 162 阅读 · 0 评论