自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序人生

不想被定义,所以要编程

  • 博客(18)
  • 资源 (2)
  • 收藏
  • 关注

原创 计数排序

在所有基于比较的排序算法中,最快的算法其时间复杂度为O(NlogN),事实上可以证明,这已经是基于比较的排序算法的时间复杂度下界了。但有一种实现简单的非比较排序算法可以突破基于比较的排序算法这一时间下界——计数排序(Counting Sort)。如果我们的待排序序列为整数且有一个已知的数值范围K,那么计数排序可以在O(N+K)的时间复杂度内将序列排序好。在多数情况下计数排序的效率比任何基于比较...

2018-10-30 22:03:35 181

原创 Bellman-Ford算法及其优化

与Dijkstra算法一样,我们定义一幅加权有向图的结构如下://带权有向图struct EdgeWeightedDigraph{ size_t V; //顶点数 size_t E; //边数 map<int, forward_list<tuple<int, int, double>> adj; //改进后的邻接表,tuple存储的是边集}Be...

2018-10-30 12:09:29 2190

原创 有向无环图的最短路径求解算法

对于最短路径问题,Dijkstra算法只能求解所有边的权值都是非负的加权有向图,而Bellman-Ford算法虽然可以求解有负权值边的图的最短路径,但效率并不高。对于有向无环图,下面这种基于Dijkstra和拓扑排序的算法可以在线性时间内解决单点最短路径问题,且能够处理负权重的边,甚至能够求出最长路径。该算法的思想很简单:按照拓扑顺序放松顶点。因为每条边v→w都只会被放松一次,当v被放松时有:...

2018-10-29 21:45:34 3777

原创 Dijkstra算法

Dijkstra算法是求解带权有向图中两点之间最短路径的经典算法,它采用贪心策略,维护一个向量dis用来表示从起点到其余顶点的路径“长度”。其主要原理如下:1.定义一个向量dis[],下标表示顶点,即dis[v]的值表示为从起点到v点的已知最短路径长度。初始化向量时,若v不是起点的相邻顶点,则dis[v]=∞,起点dis[0]=0。2.定义向量edge[],下标和值都表示顶点,假设edge...

2018-10-29 18:16:55 1501

原创 最小生成树及其求解算法

最小生成树图论中,树是图的一种特殊形式,它的众多性质中有两个是求解最小生成树的Prim算法和Kruskal算法的基础:(1)用一条边连接树中的任意两个顶点都会产生一个新的环;(2)从树中删去一条边将会得到两棵独立的树。无权图中的边只是单纯的作为联系两个顶点的抽象概念,而带权图(也称加权图)中为边增加了权重,使得顶点之间的路径形式变得更丰富多样。图的生成树是它的一棵含有其所有顶点的无...

2018-10-24 21:03:47 2060

原创 强连通分量求解算法

强连通分量在有向图中,如果顶点v和w相互可达,则称这两个顶点之间强连通。一幅图中任意两点之间强连通则称这幅图为强连通图。有向图的极大强连通子图就是有向图的强连通分量(Strongly Conneted Component)。强连通有如下性质:(1)自反性:任意顶点v和自身是强连通的。(2)对称性:如果v和w是强连通的,那么w和v也是强连通的。(3)传递性:如果v和w是强连通的且...

2018-10-23 20:32:14 5011 1

原创 图的连通分量寻找

连通分量无向图G的极大连通子图称为G的连通分量(Connected Component)。任何连通图(任意两个顶点之间可达的图)都只有一个连通分量,即自身,非连通图有多个连通分量。深度优先搜索的特点非常适合用于求解图的连通分量,每一次深度优先遍历所经过的顶点就是一个连通分量。因此只需要对图的每一个顶点调用一次深度优先遍历(注意标记访问过的顶点),就可以求得所有的连通分量。/* s...

2018-10-22 00:26:14 3428

原创 有向图及拓扑排序

有向图在无向图中,边没有方向,两条边之间的顶点是单向可达的,而有向图的边是单向的。虽然边的性质不同,但我们仍然可以用邻接表来表示有向图。对有向图的结构定义如下:#include <map>#include <forward_list> using namespace std; struct DirectedGraph{ size_t V, E;...

2018-10-20 23:06:53 16613 2

原创 无向图及其深度优先搜索和广度优先搜索

无向图图(Graph)是表示事物与事物之间的关系的数学对象,是数学领域的重要分支——图论(Graph Theory)的研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。无向图中边(edge)仅仅是两个顶点(vertex)之间的连接,是比较简单的图。我们定义无向图的结构如...

2018-10-19 21:46:44 4470

原创 红黑树及其插入、删除操作

在二叉搜索树中,基本操作如结点的插入、删除、查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示)。因此我们需要对二叉搜索树做出一些改进和限制,从而使其拥有更好更稳定的性能上界保证。红黑树就是一种自平衡的二叉搜索树。定义红黑树除了满足二叉搜索树的性质以外,还有以下性质:(1)红黑树的结点都是带有“颜色”属性的,...

2018-10-19 13:57:05 2168

原创 二叉搜索树结点的查找、插入、删除

       二叉搜索树(Binary Search Tree,BST),要么是一颗空树,要么是一颗具有如下性质的二叉树:对于二叉搜索树的任意结点来说,若它的左子树非空,则左子树上所有结点的值均小于它的值; 若它的右子树不空,则右子树上所有结点的值均大于它的值; 它的左、右子树也分别为二叉搜索树。       定义一颗二叉搜索树的结点结构如下:struct BST_Node{ ...

2018-10-16 18:29:20 1024

原创 快速排序优化

       快速排序是一种以分治为基本思想的排序算法,它将待排序数组分成两个子数组,将两部分再独立地排序。其中涉及到三个重要操作:选择基准元素、切分、对切分得到的子数组进行快排(分治)。因此对快速排序的优化也应针对这三部分进行。优化基准元素选择       快速排序最理想的情况是每次都能将序列切分成相同大小的两部分,因此切分所用的基准元素如何选择就成了影响算法性能的关键。最简单的实现就是...

2018-10-14 12:25:15 418

原创 希尔排序

       对于大规模乱序数据插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。希尔排序简单改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。希尔排序把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分成一组。因此希尔排序也叫缩小增...

2018-10-13 17:39:12 329

原创 二叉树的前中后序遍历

       本文源码示例是自己在LeetCode上做的相关题目而来。前序遍历       遍历思想:根节点→左子树→右子树递归版本/** * Definition for a binary tree node. * struct TreeNode * { * int val; * TreeNode *left; * TreeNode *rig...

2018-10-12 01:13:15 553

原创 孤儿进程和僵尸进程

       孤儿进程和僵尸进程与Linux的进程回收机制有关。在Linux中,使用系统调用exit函数族使进程结束运行。在用户程序中即使程序员没有写入调用exit的代码,系统也会在最后执行exit的系统调用。       在多进程环境下,子进程的结束状态应该让父进程知道,因为父进程可能会需要子进程的一些信息。程序都会有返回值,子进程的主函数会把返回值通过系统调用exit提交给内核(因此exi...

2018-10-09 21:42:53 1054

原创 Linux进程的内存空间布局

       此文也可看作是Linux下C程序的内存空间布局(虚拟地址),因为在Linux下的C编译器本质上也是一个进程,编译器再强大也得在操作系统的保护模式下运行。内存空间布局       在Linux中,进程的内存空间按低地址到高地址的顺序分为:代码段text、数据段data、bss段、堆、栈和内核数据区(命令行参数和环境变量等)。如下图所示:       从C程序的角度来说,...

2018-10-09 11:51:41 4964

原创 内核级线程与用户级线程

       回想大二刚上操作系统课的时候老师讲了进程和线程的知识,当时模棱两可,写下了一篇疏浅的博客(点击打开链接)。现在转眼即将毕业,为了找工作开始系统地复习学过的知识,看了《操作系统真象还原》后,加上这么长时间的知识积累,对线程实现也有了进一步了解。执行流       操作系统就是一个无限循环,处理器不断取指、执行、取指……就是计算机所做的事情。通过加入中断调用让处理器先执行其他指令...

2018-10-07 22:26:25 1439

原创 中断

定义       在计算机科学中,中断指计算机CPU获知某些事,暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后再继续执行之前的程序。整个过程称为中断处理,简称中断,而引起这一过程的事件称为中断事件。中断是计算机实现并发执行的关键,也是操作系统工作的根本。分类       中断按事件来源分类,可以分为外部中断和内部中断。中断事件来自于CPU外部的被称为外部中断,来自...

2018-10-03 18:54:31 17245

million_nodes.txt

内含100万个节点,可用于计算连通分量的各类算法(Union-Find、Quick-Find等)的测试。

2018-03-26

crore_numbers.txt

1000万个整数,范围是0~9999999,随机排列,可用于排序算法的性能测试。

2018-03-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除