[数据结构与算法]
--Allen--
我知道我不知道。
展开
-
C++ 编写一个解释器
前言一直想知道如何编写一门脚本语言,现在终于有机会实现了。非常感谢 Thorsten Ball 的大作:Writing An Interpreter In Go 帮助我实现了这个想法!Go 是一门非常不错的语言,但是为了锻炼一下自己,使用 C++ 实现了书中的想法,项目地址:https://github.com/ivanallen/autumn 。可能你比较好奇为啥这个项目叫 Autumn...原创 2019-11-21 20:12:02 · 6960 阅读 · 6 评论 -
插入排序
插入排序是一种非常基础的排序算法,其复杂度是O(n2)O(n^2),速度比快速排序、归并排序和希尔排序慢。但是这种排序算法非常适合于小数据集排序或对一个已排序的数组插入一个新元素。思路假定待排序序列a0a1...an−1a_0a_1...a_{n-1},算法运行若干步骤后,序列分成了两个部分,第一部分 a0a1...ai−1a_0a_1...a_{i-1}是已经排好的了,第二部分aiai+1...a原创 2016-06-20 15:07:56 · 408 阅读 · 0 评论 -
归并排序
归并排序通过把一个数组的两半有序子数组合并起来,来实现排序。时间复杂度是 O(nlogn)O(nlogn)。一、思路 类似于快速排序,归并排序也是基于分治法的策略。首先,待排序序列被分成两半(所谓“分”)。然后对每一半独立排序(所谓“治”)。最后将两个子数组合并成一个已排序序列(这一步叫Combine)。 图1 Mergesort(n)Mergesort(n) 下面这个程序简要的概括了原创 2016-06-21 10:06:09 · 531 阅读 · 0 评论 -
并查集
一、引例给定 N 个对象,以及若干条连接这些对象的边。求连通分量的个数,或者判断任意两个对象是否连通。如图1,有2个连通分量。 图1 10个顶点及7条边 这个问题乍一看似乎遥不可及,但是如果掌握了并查集,能够轻松解决。二、思路为了方便描述对象,把对象抽象成数字。如果有 N 个对象,那就用数字 0 到 N-1 来表示不同对象。 假定现在有三条命令: union(p, q):表示原创 2016-06-22 18:40:34 · 3283 阅读 · 0 评论 -
快速排序
快排是最快的算法之一,主要使用了分治策略。思路第一步,将待排序序列 aa 分成两部分 bb 和 cc,其中 bb 部分的每个元素小于等于 cc 部分中的所有元素。第二步,递归的使用相同程序处理序列 bb 和 cc 。 图1 Quicksort(n)Quicksort(n) 步骤一具体做法,先选择一个元素 xx,所有小于 xx 的元素放到第一部分 bb 中,所有大于 xx 的元素放到第原创 2016-06-20 17:15:02 · 486 阅读 · 0 评论 -
KMP算法
任何优秀的算法都是简约而美丽的。KMP更是如此。下面这些定义是十分重要的,功欲善其事,必先得其器。一、基本定义(Basic Definitions) 设AA为一个字符集,并且x=x0…xk−1x=x_0…x_{k-1},kk为自然数,xx是长度为 kk 的在AA上的一个字符串。xx 的前缀(prefix)为一个字串uu,其中: u=x0x1…xb−1,b∈{0,1,…,k}u = x_0x原创 2016-06-20 13:45:31 · 1333 阅读 · 2 评论 -
堆排序
堆排序的复杂度是 O(nlogn)O(nlogn)O(nlogn),因为使用了一种特殊的数据结构,因此称之为堆。后面将会解释。定义:设 T=(V,E)T=(V,E)T=(V,E)是一棵完全二叉树,映射 a:V→Ma:V→Ma:V\rightarrow M将树中的节点映射的一个有序集合 MMM,每个顶点的值 a(u)a(u)a(u) 都在集合 MMM 中。解释一下,VVV 表示顶点的集合...原创 2016-06-20 18:17:38 · 641 阅读 · 0 评论 -
数据结构与算法学习库——DSA
介绍不少在校学生在学习数据结构与算法时痛苦不堪,很多数据结构写起来验证也很困难。如果有一个库,能帮助大家解决构建数据结构的困难,以快速验证自己的想法,那多好啊。DSA(Data struct & Algorithm) 就是这样的一个工具。示例我们来看一个示例。#include <iostream>#include <string_view>#inclu...原创 2019-05-01 22:41:17 · 2788 阅读 · 4 评论