JasonBourne

数据结构与算法:Trie树

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。 Trie树的实现 Trie 树主要有两个操作,一个是将字符串集合构造成 Trie 树。这个过程分解开来的话,就是一个将字符串插入到 Trie 树的过程。另一个是在 ...

数据结构与算法:跳表

跳表(skiplist)本质上是一种查找结构,用于解决算法中的查找问题(Searching),即根据给定的key,快速查到它所在的位置(或者对应的value)。 实现原理 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)。假如我们每相邻两个节点增加一个指针,让指针指向下下...

数据结构与算法:递归

如何理解递归 递归是一种应用非常广泛的算法(或者编程技巧),很多数据结构和算法的编码实现都要用到递归。举个生活中用到递归的例子,周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办?别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的...

数据结构与算法:队列

队列是一种操作受限的线性表数据结构,它的特点是只允许在表的前端进行删除操作,而在表的后端进行插入操作。即先进者先出。队列只支持两个基础操作,入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。 顺序队列和链式队列 队列可以用数组来实现,也可以用链表来实现。用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。 用数组实现队列需要两...

数据结构与算法:链表

定义 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表和数组一样,作为最底层的数据结构,是很多其他数据结构的底层实现,比如可以用链表来实现队列、栈等等。相比数组对连续内...

数据结构与算法:堆

堆是一种特殊的树,首先,它是一个完全二叉树,其次它的每个节点的值都必须大于(或小于等于)其子节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。 堆的实现 堆是一颗完全二叉树,所以优先使用数组存储,相比与链表法可以更节省存储空间。因为我们不需要存储左右子节点的指针,单纯地通过数组的下标,...

数据结构与算法:散列表

散列表(hash table),又名‘hash表’,它用的是数组支持按照下标随机访问数据(时间复杂度O(1))的特性,所以散列表其实就是基于数组结构的一种扩展。简单的来说,就是把键值通过散列函数求得hash值之后,对数组容量进行取模运算,得到存放在数组位置的下标值,当我们按照键值查询元素时,我们用同样的方法将键值转化数组下标,从对应的数组下标的位置取数据。散列表这种数据结构虽然支持非常...

数据结构与算法:图

图是一种非线性的数据结构,表示多对多的关系。图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 拿微信举例子,我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就...

数据结构与算法:深度广度优先搜索

什么是深度、广度优先搜索 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法就是基于“图”这种数据结构的。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。 图的存储邻接表存储方式的实现: public class Graph { // 无向图 private int v; // 顶点的个数 private LinkedList&l...

数据结构与算法:复杂度分析

为什么需要复杂度分析 数据结构与算法要解决的是快和省的问题,即如何让代码运行的更快,如何让代码更省存储空间。那么,执行效率就是算法一个非常重要的考量指标。事后统计法虽然也能帮助我们了解算法的执行效率,但是它有很大的局限性。一是非常依赖测试环境,不同级别的硬件设备,会显示出截然不同的结果;二是测试结果受到数据规模的影响,数据规模较小时,无法表现出一些算法的特性。而时间、空间复杂度分析就可以帮...

数据结构与算法:二叉树

树是一种非线性表结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。 树的各种概念 如下图,A 节点就是 B 节点的父节点,B 节点是...

数据结构与算法:二分查找

二分查找(Binary Search)算法,也叫折半查找算法。它针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 时间复杂度 我们假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。 可以看出来,这...

数据结构与算法:字符串匹配算法

编程语言提供的字符串查找函数,它们的底层就是依赖的字符串匹配算法。 BF算法 BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。 它的主要思想是在主串中,检查起始位置分别是 0、1、2….n-m 且长度为 m 的 n-m+1 个子串,...