随笔分类 -  数据结构与算法

摘要:什么是跳表 跳表(skiplist)本质上是一种查找结构,用于解决算法中的查找问题(Searching),即根据给定的key,快速查到它所在的位置(或者对应的value)。对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低, 阅读全文
posted @ 2023-03-10 16:28 唐磊(Jason) 阅读(123) 评论(0) 推荐(0) 编辑
摘要:什么是深度、广度优先搜索 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法就是基于“图”这种数据结构的。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。 代码实现 图的存储邻接表存储方式的实现: public class Graph { // 无向图 阅读全文
posted @ 2023-03-07 09:48 唐磊(Jason) 阅读(252) 评论(0) 推荐(0) 编辑
摘要:定义 图是一种非线性的数据结构,表示多对多的关系。图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。拿微信举例子吧。我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边 阅读全文
posted @ 2023-03-06 10:14 唐磊(Jason) 阅读(87) 评论(0) 推荐(0) 编辑
摘要:定义 Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。最后构造出来的就是下面这个图中的样子。 Trie树的实现 Trie 树主要有两个操 阅读全文
posted @ 2023-02-28 14:39 唐磊(Jason) 阅读(118) 评论(0) 推荐(0) 编辑
摘要:编程语言提供的字符串查找函数,它们的底层就是依赖的字符串匹配算法。 BF算法 BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。它的主要思想是在主串中,检 阅读全文
posted @ 2023-02-27 17:35 唐磊(Jason) 阅读(75) 评论(0) 推荐(0) 编辑
摘要:定义 堆是一种特殊的树,首先,它是一个完全二叉树,其次它的每个节点的值都必须大于(或小于等于)其子节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。 堆的实现 堆是一颗完全二叉树,所以优先使用数组存储,相 阅读全文
posted @ 2023-02-22 17:57 唐磊(Jason) 阅读(60) 评论(0) 推荐(0) 编辑
摘要:定义 树是一种非线性表结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为 阅读全文
posted @ 2023-02-22 10:57 唐磊(Jason) 阅读(132) 评论(0) 推荐(0) 编辑
摘要:定义 二分查找(Binary Search)算法,也叫折半查找算法。它针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 时间复杂度 我们假设数据大小是 n,每次查找后数据都会缩小为原来的 阅读全文
posted @ 2023-02-21 17:23 唐磊(Jason) 阅读(73) 评论(0) 推荐(0) 编辑
摘要:散列表的定义 散列表(hash table),又名‘hash表’,它用的是数组支持按照下标随机访问数据(时间复杂度O(1))的特性,所以散列表其实就是基于数组结构的一种扩展。简单的来说,就是把键值通过散列函数求得hash值之后,对数组容量进行取模运算,得到存放在数组位置的下标值,当我们按照键值查询元 阅读全文
posted @ 2023-02-17 11:18 唐磊(Jason) 阅读(193) 评论(0) 推荐(0) 编辑
摘要:如何理解递归 递归是一种应用非常广泛的算法(或者编程技巧),很多数据结构和算法的编码实现都要用到递归。举个生活中用到递归的例子,周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办?别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。于 阅读全文
posted @ 2023-02-15 17:52 唐磊(Jason) 阅读(49) 评论(0) 推荐(0) 编辑
摘要:定义 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表和数组一样,作为最底层的数 阅读全文
posted @ 2023-02-15 11:15 唐磊(Jason) 阅读(68) 评论(0) 推荐(0) 编辑
摘要:栈的定义 栈是一种操作受限的线性表数据结构,仅允许在一端插入或删除数据。栈中的数据后进者先出。 栈的实现 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。如下是顺序栈的代码实现: // 基于数组实现的顺序栈 public class Arra 阅读全文
posted @ 2023-02-14 15:28 唐磊(Jason) 阅读(29) 评论(0) 推荐(0) 编辑
摘要:关于这个系列 程序=算法+数据结构 掌握了数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样。因为这样的你,就像是站在巨人的肩膀上,拿着生存利器行走世界。数据结构与算法,会为你的编程之路,甚至人生之路打开一扇通往新世界的大门。 学习算法与数据结构对我们的帮助: 建立时间复杂度、空间复杂度 阅读全文
posted @ 2023-02-14 11:48 唐磊(Jason) 阅读(31) 评论(0) 推荐(0) 编辑
摘要:定义 队列是一种操作受限的线性表数据结构,它的特点是只允许在表的前端进行删除操作,而在表的后端进行插入操作。即先进者先出。队列只支持两个基础操作,入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。 顺序队列和链式队列 队列可以用数组来实现,也可以用链表来 阅读全文
posted @ 2023-02-14 10:50 唐磊(Jason) 阅读(57) 评论(0) 推荐(0) 编辑
摘要:为什么需要复杂度分析 数据结构与算法要解决的是“快”和“省”的问题,即如何让代码运行的更快,如何让代码更省存储空间。那么,执行效率就是算法一个非常重要的考量指标。事后统计法虽然也能帮助我们了解算法的执行效率,但是它有很大的局限性。一是非常依赖测试环境,不同级别的硬件设备,会显示出截然不同的结果;二是 阅读全文
posted @ 2023-02-13 15:55 唐磊(Jason) 阅读(130) 评论(0) 推荐(0) 编辑
摘要:数组是数据结构中最简单,基础的结构,并且也是我们刚接触代码就会学习到的数据结构。那么我们对数组真的足够了解了吗? 定义 数组是一种线性表数据结构,它用一段连续内存空间,来存储一组具有相同类型的数据。 对于上面数组的定义有几个关键点:线性表,连续内存空间,相同类型数据。 线性表,顾名思义,就是数据像一 阅读全文
posted @ 2021-04-09 10:30 唐磊(Jason) 阅读(64) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示