数据结构重读 – 最小生成树(Prim和Kruskal)

假设要在n个城市之间建立通信网络,则连通n个城市只需要n-1条线路。现在想节省光缆,使得路径和最小。

这一问题就是最小代价生成树问题(Minimum Cost Spanning Tree),简称MST。

MST性质:假设N=(V, {E})是一个连通图,U是顶点集合V的一个非空子集,若(u, v)是一条具有最小权值的边,u属于U且v属于V-U。则必存在一棵包含边(u, v)的最小生成树。

因此,可以采用贪心算法解决。

1、Prim(普里姆)算法

我们需要设置[......]

继续阅读

数据结构重读 - 图的遍历(概念)

图的遍历:从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。

图比树复杂,为了避免同一顶点被访问多次,可以设置一个辅助数组,初始值置为False或者0。当访问到后,设置值为真或被访问的次序ID。

图遍历主要有两种:深度优先搜索、广度优先搜索。

深度优先遍历

是树的先根遍历的推广。

从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v相连通的路径都被访问到。然后再另选一个未被访问的结点做为起始点。

代[......]

继续阅读

MySQL中随机select记录

我有这个需求:

数据库中的uid离散分布不连续,需要随机select某一条记录。

1、最懒做法
select uid, uname from user order by RAND() limit 1
这个非常慢,因为几乎要遍历整个表。

2、用id随机范围。

其实如果我们能得到min(uid)和max(uid),然后随机这之间的某一个ID,再where >= 就可以了。

首先是获取min和max的uid:
select min(uid), max(uid)[......]

继续阅读

数据结构重读 - 关节点(割点)和重连通分量

对于一个连通图,如果删除了结点v以及相关联的边之后,图被分割成了两个或以上的连通分量,则称v是该图的一个关节点(articulation point),也叫割点

如果一个图中不存在关节点(割点),则该图为重连通图(biconnected graph)。显然重连通图是很稳定的,例如一个航空网络是重连通的,则当某调航线因为外部条件被破坏,那么旅客总可以从别的航线绕道到达目的地。

如果在连通图上至少要删除k个顶点才能破坏图的连通性,则称此图的连通度为k

对于如下的连通图G:[......]

继续阅读

数据结构重读 - 图的链式存储(邻接表)和BFS图遍历算法

前面实现的邻接矩阵面临一个巨大的问题:对于稀疏矩阵,将耗费巨大的资源,而大部分都是0。

现实中,绝大多数矩阵都是稀疏的!

我们可以采用如下的邻接表方法存储。

首先定义每个弧如下:

ivex是在顶点在数组中的下标。

next是一条链表,即某个顶点i的所有邻接结点的弧组成。
// Arc
struct Arc
{
int ivex; // The vex position in vexs array
struct Arc* next;
};
然后对于每[......]

继续阅读