随笔分类 - 数据结构与算法
1
摘要:1.不带权值的最短路径 对于不带权值的最短路径而言,我们可以采用广度优先遍历的方法,同时在遍历的过程中记录其上一个节点即可。如下图所示,我们找寻从 A 顶点到 H 顶点的最短路径: 从上图中可以看到,在广度优先遍历到第 2 层时,已经找到了 H 节点,此时直接返回即可。 2.Dijkstra算法 迪
阅读全文
摘要:1.定义 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成的,通常表示为 $G(V,E)$,其中,G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。 在图的定义中,需要注意以下几个点: 图中的数据元素称之为顶点(Vertex); 在图结构中,不允许没有顶点; 在图中,
阅读全文
摘要:1.定义 1.1 哈夫曼树 哈夫曼树是一种最基本的压缩编码方法。对于如图所示的两棵二叉树,每个叶子节点都带有权值: 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度。例如,树 a 中根节点到结点 D 的路径长度为 4,树 b 中根节点到结点 D 的路径长度为
阅读全文
摘要:1.定义 倒排索引常使用在搜索引擎当中,是搜索引擎为文档内容建立索引,实现内容快速检索必不可少的数据结构。倒排索引是由单词的集合“词典”和倒排列表的集合“倒排文件”组成的。 倒排索引的存储:内存索引和B+树索引。 1.1 正排索引 假设目前有两个 HTML 页面,一个页面内容是 "I like se
阅读全文
摘要:1.简介 跳跃表(Skip List)是在链表的基础上增加了“跳跃”的功能,即加上了【多级索引】,通过索引来快速查找,可以支持快速的删除、插入和查找操作。它实际上是一种增加了前向指针的链表,是一种随机化的数据结构。其具有如下性质: 由很多层链表组成 每一层都是一个有序的链表 最底层(level 1)
阅读全文
摘要:1.简介 字典树也称为前缀树、单词查找树。其基本性质如下: 根节点不包含字符,除根节点外每一个节点都只包含一个字符 从根节点到某一结点,路径上经过的字符连接起来,为该节点对应的字符串 每个节点的所有子节点包含的字符都不相同 其结构如下图所示: 通过其结构可以得知,其搜索一个单词的时间复杂度为 $O(
阅读全文
摘要:1.BF算法 BF 算法,即暴力(Brute Force)算法,是普通的【模式匹配】算法,BF 算法的思想就是将目标串 S 的第一个字符与模式串 T 的第一个字符进行匹配,若相等,则继续比较 S 的第二个字符和 T 的第二个字符;若不相等,则比较 S 的第二个字符和 T 的第一个字符,依次比较下去,
阅读全文
摘要:1.B-树 B-树是一颗 m 阶的平衡树(Balance),其通常应用于文件索引系统的实现。一颗 m 阶的 B- 树需要满足如下条件: 树中每个节点最多含有 m 个孩子 除根节点和叶子节点之外,其它每个节点至少有 $\lceil m/2 \rceil$ 个孩子 除根节点之外的节点的关键字的个数 n
阅读全文
摘要:1.红黑树 相比于 AVL 树而言,红黑树并不是一颗平衡树,其节点的左、右子树高度差,长的不超过短的 2 倍。 红黑树的特点如下: 树的每一个节点都有一个颜色; 空节点是黑色; 根节点是黑色; 不能出现连续的红色节点; 从根节点到每一个叶子节点的路径上,黑色节点的数量是相同的; 如下图所示,为一颗典
阅读全文
摘要:AVL 树就是在 BST 树的基础上,引入了 “节点平衡” 的概念,即任意一个节点的左右子树的高度差不超过 1,为了维持节点的平衡,引入了四种旋转操作: 左孩子的左子树太高,进行【右旋】操作; 右孩子的右子树太高,进行【左旋】操作; 左孩子的右子树太高,进行【左-右旋转】操作,也叫【左平衡】操作;
阅读全文
摘要:BST树称为【二叉搜索树(Binary Search Tree)】或者【二叉排序树(Binary Sort Tree)】,它或者是一颗空树,或者是具有如下性质的二叉树: 若左子树不为空,则左子树上所有节点的值均小于它的根节点的值; 若右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 左右子
阅读全文
摘要:一个良好的分布式哈希方案,应该具有良好的单调性,即服务节点的增减不会造成大量哈希的重新定位。 首先,一致性哈希算法会将整个哈希值空间理解成一个环,其取值范围是 $0\sim2^{32}-1$ 共 4G 的整数空间: 然后,将所有的服务器进行哈希,最终落在这个一致性哈希环上。现在假设有 A、B、C 三
阅读全文
摘要:1. 定义 如果查找关键字时不需要比较就可以获得需要记录的存储位置,这就称作【散列技术】。它是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字 key 对应一个存储位置 f(key)。把这种对应关系 f 称为【散列函数】,又称【哈希(hash)函数】,采用散列技术将记录存储
阅读全文
摘要:1.冒泡排序 特点:相邻元素两两比较,把值大的元素往下交换。 缺点:冒泡排序的时间复杂度太高 冒泡排序的过程如下图所示,其展示了一趟排序的过程,在下一趟的排序过程中,最后一个排序完成的元素无需进行遍历,重复此过程,直到整个数组排序完成: 其实现代码如下: void bubbleSort(vector
阅读全文
摘要:1. 二叉堆 1.1 二叉堆的定义 二叉堆在逻辑上是一颗完全二叉树,而在存储方式上还是用数组进行存储的。二叉堆具有如下性质,如果当前节点在数组中的索引为 ,那么有: 其左子节点在数组中的索引为 $2i+1$; 其右子节点在数组中的索引为 $2i+2$; 其父节点在数组中的索引为 $(i-1)/2$;
阅读全文
摘要:二分搜索算法适用于有序数组。如果按照暴力搜索算法,那么需要从头到尾遍历数组元素,时间复杂度为 O(n),而如果使用二分搜索,那么其时间复杂度为 O(logn),根据时间复杂度曲线图可知,二分搜索的算法效率要优于线性查找。 二分搜索的实现可以分为非递归和递归两种。 1. 非递归版本 如果使用非递归版本
阅读全文
摘要:1. 栈的实现 特点:先进后出、后进先出 1.1 顺序栈 顺序栈是依赖数组实现的。 其代码实现如下: class SequenceStack { public: SequenceStack(int size = 10); ~SequenceStack(); public: // 入栈 void pu
阅读全文
摘要:1. 链表实现 特点: 每一个节点都是在堆内存上独立 new 出来的,节点内存不连续。即逻辑地址连续,而物理地址不连续。 优点: 内存利用率高,不需要大块连续内存 插入和删除节点不需要移动其它节点,时间复杂度 O(1) 不需要专门进行扩容操作 缺点: 内存占用量大,每一个节点多出存放地址的空间 节点
阅读全文
摘要:1.数组实现 数组的特点:内存是连续的,即物理地址是连续的。 优点: 随机访问的时间复杂度为 O(1); 末尾位置增加元素的时间复杂度为 O(1); 访问元素前后相邻位置的元素非常方便; 缺点: 非末尾位置增加元素需要进行大量的数据移动,时间复杂度为 O(n); 搜索的时间复杂度: 无序数组采用线性
阅读全文
摘要:算法简介 在一个数组中,存在一个众数,众数的数量要大于数组大小的一半。设计时间复杂度为 O(n),空间复杂度为 O(n) 的算法: 在数组中找出该众数。 该算法维护了两个变量:候选人 candiate 和投票数目 count。其基本算法步骤如下: 初始化 candiate 为任意值,count 的值
阅读全文
1

浙公网安备 33010602011771号