位运算、位图法以及状态管理

背景 前几天读某个框架的代码,一路下来读着挺顺畅的,唯有读到某处的时候卡顿了,这个地方主要判断是否属于某种状态,但是有点不直观,主要是它使用了位运算中的或运算。虽然不是很直观,但是觉得特别的,因为平常就是四则运算比较多,涉及位运算确实少。于是记了下来,后来回忆其实JDK里面也有不少涉及位运算来管理判断状态的,比如JDK的线程池就有使用。 位运算 在 Java 语言中,位运算有如下这些: 左移(&l … 继续阅读

最短路径算法-Dijkstra算法

Dijkstra算法 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 Dijkstra算法关注的问题 在无向图 G=(V,E) 中,假设每条 … 继续阅读

图论基础-图的遍历

图的遍历 图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。 图的遍历分两种,深度优先和广度优先。 深度优先 深度优先搜索法是树的先根遍历的推广,它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则退回到已 … 继续阅读

图的连通性判断-java实现

图的连通性判断 用Java实现了一个图的连通性判断,主要是用了广度优先遍历BFS来实现的。 算法思想 判断图是否是连通的,可以通过深度优先遍历的方法判断。 具体实现为:在图中选定任一一个顶点,对该顶点进行深度优先遍历,如果在这个遍历过程中所有的顶点都被遍历到,则该图为连通;反之,若存在没有被遍历到的顶点,则说明该图是非连通的。 public boolean isConnected() { int … 继续阅读

图论基础

图论的概述 图论(Graph Theory)是离散数学的一个分支,是一门研究图(Graph)的学问。 图是用来对对象之间的成对关系建模的数学结构,由”节点”或”顶点”(Vertex,复数为Vertices)以及连接这些顶点的”边”(Edge)组成。 图的顶点集合不能为空,但边的集合可以为空。 图的类型 图的分类:无权图和有权图 … 继续阅读

一个系统设计:给所有当天生日的用户发一封生日邮件

问题描述 以前曾经思考过类似的问题,比如腾讯公司,每逢生日,都会给用户发一封邮件。按QQ的用户规模,假设全国每人一个QQ,那么用户表有14亿条。如何给当天生日的人发送祝福邮件?这问题其实挺有意思的,很多可以思考和优化的点,于是我也想了一个初步方案。 一个系统设 系统总人数为Total。 假设,用户用户生日是分布均匀的,也就是说,每天的生日人数=1/365 * Total = 1/365 * 14亿 … 继续阅读