数据结构与算法
Ruo_Xiao
己所不欲,勿施于人。
展开
-
如何在海量数据中判断某个数据是否存在?
它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。如果置为 0,那么“宋江”就不高兴了,如果不变,显然又会增加对“吴用”的误判率(已经被删除,但该位置还是1)。在后来的改进中,对位图的每个单元增加了计数器,计数器初始值为 0,每映射一个数据,计数器加 1,每删除一个数据,计数器减 1。回想一下,在 java 中我们可以使用列表、集合等数据结构来存放数据,如 hashmap,然后判断某个数据是否存在,但在此问题中显然不适用,因为上亿的数据在内存较小的计算机中无法存放。转载 2023-01-29 11:47:19 · 946 阅读 · 0 评论 -
数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)
回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束。与贪心算法不同的是,回溯算法理论上是可以得到最优解,而贪心算法则尽可能在快的情况下得到较理想的结果。下面的栗子就是八皇后问题,是一个典型的回溯算法应用栗子。其实本质上就是遍历所有的可能性,最后满足条件者打印出来。#include <iostream>unsigned int g_count = 0;bool isOK(uns.原创 2021-05-25 09:41:47 · 207 阅读 · 0 评论 -
数据结构与算法 / 冒泡排序及其优化的三种方式
一、一般写法统一使用交换函数:void swap(int& a, int& b){ int tmp = a; a = b; b = tmp; return;}void BubbleSort(int arr[], int len){ int i = 0; int tmp = 0; for (i = 0; i < len - 1; i++) //确定排序趟数 { int j = 0;转载 2021-04-28 10:06:13 · 211 阅读 · 0 评论 -
堆内存和数据结构堆之间的关系是什么?
数据结构中的堆和内存中的堆是两个完全不同的概念。它们除了名字一样没有什么必然的联系。就跟苹果一样,一个是水果一个是品牌。前者是组织数据的一种手段(或者叫工具),后者只是指明数据存储在哪种内存区之上。其实在远古时代,闲置内存确实是用最小堆来构建的,当然了现在废弃了这种方法,但是称呼延续了下来。(SAW:Game Over!)...原创 2021-03-30 11:10:01 · 630 阅读 · 1 评论 -
数据结构与算法 / 默克尔树
最近在学习 git 原理时,涉及到了默克尔树,这里总结下该数据结构。默克尔树于 1979 年由美国计算机科学家拉尔夫·默克尔(Ralph Merkle)提出,本质上是一种树状数据结构,由数据块、叶子节点、中间节点和根节点组成。所以,一组合,就叫“Merkle Tree”。默克尔树各部分的构成关系如下图:要得到这样一棵默克尔树,首先要对底部数据块进行哈希运算,用每个数据块对应的哈希值生成叶子节点。再对相邻的 2 个叶子节点进行哈希运算,得到的哈希值生成中间节点,最后对相邻的 2 个中间节点进行原创 2021-03-21 09:51:37 · 1768 阅读 · 0 评论 -
数据结构与算法 / 编辑器和编译器如何判定括号是否合法
一、整体思路使用栈这种数据结构。遍历字符串,遇到左括号则入栈,遇到右括号则判断此时的栈顶的括号是否和右括号对应,如果是则 pop 栈顶;如果不是则直接可以判定该字符串中括号不匹配。二、栗子#include <stack>#include <string>#include <iostream>char leftOf(char c);bool isValid(std::string str){ std::stack<char>原创 2021-03-19 13:54:32 · 247 阅读 · 0 评论 -
数据结构与算法 / 分治算法
一、本质分而治之。将原问题拆分成 n 个规模较小而结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到了原问题的解。二、实际应用1、归并排序。2、10 G的数据进行排序,而计算机只有 4G 内存,如何完成。答案:将 10 G 数据分成 100个文件,每个文件在进行排序,最后将排序好的文件两两合并,最后得到排序好的文件。参考:极客时间《数据结构与算法之美》王争这门课真心推荐,内容很经典、栗子很形象,里面还包含了很多面试题目。真是居家旅行必备良药。..原创 2020-11-19 20:38:52 · 198 阅读 · 0 评论 -
数据结构与算法 / 排序算法 / 堆排序
一、定义借助堆结构实现的排序算法被称为堆排序。二、过程说明1、建堆(1)方法1原地建堆,对于数组来说,从前往后;对于树来说,从下向上。将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据的操作,即:从下向上堆化。直至所有的元素均完成所有插入操作,此时堆就建立完成了。(2)方法2原地建堆,对于数组来说,从后往前;对于树来说,从上向下。从数组倒数第一个非叶子节点向下进行堆化,之后是倒数第二个非叶子节点向下堆化,直至堆化到数组第一个节点,从而完成堆的建立。(3)方法 2原创 2020-11-19 20:10:02 · 150 阅读 · 0 评论 -
数据结构与算法 / 排序算法 / 基本概念
1. 概念 满有序度:两两一对的数量。 有序度:满足排序规则的对数。 逆序度:未满足排序规则的对数。 排序的过程,即为有序度递增的过程。当有序度等于满有序度时,数组有序。2. 公式满 有 序 度 = ( n − 1 ) ∗ n / 2 逆 序 度 = 满 有 序 度 − 有 序 度。3. 栗子 对于集合(3, 4, 2, 1),可得下列有序排列: ( 3 , 4 ) , ( 3 , 2 ) , ( 3 , 1 ) ( 4 , 2 ) , ( 4 , 1 )转载 2020-11-18 19:44:58 · 130 阅读 · 0 评论 -
数据结构与算法 / 跳表
一、诞生原因解决链表查询时耗时过长的问题。二、基本信息英文全称:Skip List 。链表 + 多级索引(链表) = 跳表三、原理说明顾名思义,跳表的查询是在多个链表之间跳跃查询的,其路线类似于走台阶,如下图所示:举个栗子:某一时刻,想查询代号为 8 的节点的数据,按照常规链表查询,需要从最左侧挨个查询至最右侧,遍历次数为 8 ,时间复杂度为 O(n) 。若添加一级索引,遍历次数为 5;若再添加二级索引,遍历次数为 4,遍历路线犹如下台阶一跳一跳的,故该结构名为.原创 2020-11-18 12:32:21 · 216 阅读 · 0 评论 -
数据结构与算法 / 霍夫曼树、霍夫曼编码和解码
一. 诞生原因找出存放一串字符所需的最少的二进制编码。二. 构造方法首先统计出每种字符出现的频率,即:概率、权值。例如:频率表A:60, B:45, C:13 D:69 E:14 F:5 G:3第一步:找出字符中频率最小的两个,小的在左边,大的在右边,组成二叉树。在频率表中删除此次找到的两个数,并加入此次最小两个数的频率和。F 和 G 最小,如下图所示,从字符串频率计数中删除 F 与 G,并返回 G 与 F 的和8 给频率表。第二步:频率表A:6...转载 2020-11-18 07:26:50 · 871 阅读 · 0 评论 -
数据结构与算法 / 贪心算法
一、诞生原因有如下场景:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。为了达到上述目的,贪心算法是其中的一个解决方案。例如,路径选择问题,从 S 城市至 E 城市,在只能路过 2 个城市的情况下,如何走的最短,如下图所示:一、基本信息英文全称:greedy algorithm二、原理说明每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。转为解决上图的问题的语言:保证每次从当前城市走到下一个城市的路径最.原创 2020-11-17 20:22:20 · 192 阅读 · 0 评论 -
数据结构与算法 / 总章
图来自:https://blog.csdn.net/ityqing/article/details/82838524(SAW:Game Over!)原创 2020-11-17 19:25:20 · 147 阅读 · 0 评论 -
数据结构与算法 / 字符串匹配算法汇总
零、前言一、单模式串匹配1、BF:简单粗暴,主串和模式串都不太长,时间复杂度为 O(m*n) 。2、KP:字符集范围不要太大且模式串不要太长, 否则 hash 值可能冲突,时间复杂度为 O(n) 。3、naive-BM:模式串最好不要太长(因为预处理较重),比如 IDE 编辑器里的查找场景; 预处理的时间复杂度为O(m*m),匹配的时间复杂度为 O(n),实现较复杂,需要较多额外空间。4、KMP:适合所有场景,整体实现起来也比 BM 简单,时间复杂度为 O(n+m),仅需一个 next.原创 2020-11-17 18:36:21 · 308 阅读 · 0 评论 -
数据结构与算法 / 字符串匹配 / Trie 树
一、诞生原因传统字符串比较时,需要将待比较的字符串与字符串集合中每一个串进行比较,结果比较浪费时间。Trie 树的发明就是为了解决上述问题。二、基本信息又称字典树,是一种树形结构,是一种哈希树的变种。三、原理通过树形结构,将字符串集合中各个串的前缀统一为一个,这样每次查找串时相同的前缀的串仅需要比对同一个前缀就行了。栗子:假如字符串集合中仅仅包含 26 个英文字母并且都为小写,那么该字符串集合组成的 Trie 树的部分如下图所示:每个节点实际上是一个包含 26 个元素的数原创 2020-11-17 16:56:40 · 176 阅读 · 0 评论 -
数据结构与算法 / LRU 缓存淘汰算法
一、诞生原因缓存是一种提供数据读取性能的技术,在硬件设计、软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等。但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即:移出缓存,从而保证缓存中的数据始终是常用的。常用的机制里面包括 LRU 缓存淘汰算法。二、设计原则全称:LeastRecently Used如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。所以淘汰的数据应该是许久没有访问到的数据。三、所用的数据结构双向链表:用于.原创 2020-11-17 13:46:50 · 257 阅读 · 0 评论 -
数据结构与算法 / 字符串匹配 / BF、PK 算法
零、前言为了下面便于说明,先定义两个名词,分别是主串和模式串。在字符串 A 中查找字符串 B,则 A 为主串,B 为模式串。假设,主串中字符数量为 L1,模式串的字符数量为 L2 。一、BF 算法1、基本信息BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。2、查找流程从主串第一个位置开始匹配模式串,匹配完成之后,模式串移动一个字符,移动次数为 L1 - L2 + 1 次完成对主串的匹配。上述过程中可以的优化的点是每次匹配时发现原创 2020-11-16 17:58:06 · 623 阅读 · 0 评论 -
数据结构与算法 / 堆结构
一、基本信息1、本质一颗特殊的树。2、特性完全二叉树。 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。3、分类对于每一个节点的值都大于等于子节点的值的情况,该堆被称为大顶堆。对于每一个节点的值都小于等于子节点的值的情况,该堆被称为小顶堆。4、存储方式对于完全二叉树而言,数组存储方式是最节省内存的。二、实际应用1、堆排序2、查找第K大(小)元素3、优先队列4、求动态集合中位数(SAW:Game Over!)...原创 2020-11-16 13:12:07 · 146 阅读 · 0 评论 -
数据结构与算法 / UUID 和 GUID 区别和联系
1、英文全称UUID:通用标识码,Universally Unique Identifier 。 GUID:全球唯一标识符,Globals Unique Identifiers 。2、UUID 是一种标准,GUID 是 UUID 的众多实现之一。3、UUID 由开放软件基金会(OSF)定义;GUID 是微软对UUID这个标准的实现。4、格式UUID:由一个由 4 个连字号“-”将 32 个字节长的字符串分隔后生成的字符串,总共 36 个字节长,格式为8-4-4-4-12。比如:747d6原创 2020-10-27 10:51:28 · 1792 阅读 · 0 评论 -
数据结构与算法 / 红黑树
一、定义根节点是黑色的。 叶子节点是空的且是黑色的。 任何相邻的节点不能都为红色。 任意节点到其每个叶子节点的路径上,黑色的节点的数量相同。二、性质 红黑树解决了 AVL 树增、删时耗时过大的问题。 因为,定义中 3 和 4 使得红黑树的根节点到叶子节点的最长的可能路径不多于最短的可能路径的两倍长,导致该树是大致平衡的树,所以对于增、删的操作没有那么的严...原创 2019-11-21 07:18:09 · 190 阅读 · 0 评论 -
数据结构与算法 / 二叉搜索树(Binary Search Tree)
一、定义若左子树不空,则左子树上的所有的节点都小于它的根节点。 若右子树不空,则右子树上的所有的节点都大于它的根节点。 左右子树都是二叉查找树。 所有的节点均不相等。二、性质对二叉树进行中序遍历,可以得到有序序列,时间复杂度为O(n)。 二叉查找树的高度决定了其查找效率。三、时间复杂度分析假设节点的数量为 n 。最好的情况,该树是一棵完全二叉树,那么其查找的时间复杂...原创 2019-11-20 22:44:05 · 334 阅读 · 0 评论 -
数据结构与算法 / 平衡二叉树(AVL树)
一、定义左右两个子树的高度差不超过 1 。 左右两个子树都是平衡二叉树。二、性质树的高度良好的维持在 O(logn) 。 该树是高度平衡的二叉树,解决了二叉查找树退化成链表的问题。三、时间复杂度 增、删、查的时间复杂度的平均和最坏都维持在O(logn),推导过程如下链接。https://mp.csdn.net/postedit/103172135四、源码...原创 2019-11-21 06:53:56 · 277 阅读 · 0 评论 -
数据结构与算法 / B- Tree 和 B+ Tree
一、M 阶 B - Tree(B Tree)特点根节点的 key 数量,1 <= sum <= m-1 。 非根节点 key 数量,m/2 <= sum <= m-1。 所有节点中的 key 都按照从小到大排列。每个 key 的左子树中所有 key 都小于它,其右子树中所有的 key 都大于它。 所有的叶子节点都位于同一层。 所有节点都存有子节点的指针、索引...原创 2019-11-10 19:50:11 · 214 阅读 · 0 评论 -
数据结构与算法 / 排序算法(3)
一、桶排序(Bucket sort)1、原理 将要排序的数据分到几个有序的桶里,每个桶里的数据再进行排序。桶内的数据排序完毕之后,再把桶里的数据依次取出,组成的序列就是有序的了。2、原地排序? 属于原地排序算法。主要看桶内排序是否时原地排序算法,若选择插入排序,则桶排序就是属于原地排序,若选择了快速排序,则不属于原地排序。3、稳定性算法? ...原创 2019-10-22 06:29:14 · 277 阅读 · 0 评论 -
数据结构与算法 / 排序算法(2)
一、归并排序1、原理 采用分治思想。将数组分成前后两部分,先将这两部分进行排序,然后再将二者合并即可。2、原地排序? 不属于原地排序。因为每次合并都需要申请大小为 n 的临时数组用于保存合并之后的结果,所以空间复杂度为O(n)。3、稳定性排序? 属于稳定排序算法。为了达到上述目的,只需要在合并时将前后两部分相同的元素中的属于前面部分的数据...原创 2019-10-18 10:55:44 · 177 阅读 · 0 评论 -
数据结构与算法 / 排序算法(1)
零、前言1、常用的排序算法总结排序算法种类 时间复杂度 是否基于比较 冒泡、插入、选择 O(n^2) √ 快排、归并 O(nlogn) √ 桶、计数、基数 O(n) × 2、算法的内存消耗 - 原地排序 指的是空间复杂度是 O(1) 排序算法。4、算法的稳定性 原来序列中相等的元素,经过...原创 2019-10-17 21:52:22 · 1831 阅读 · 0 评论 -
数据结构与算法 / 哈希算法
一、定义 将任意长度的二进制串映射为固定长度的二进制串,这个映射法则就是哈希算法。映射之后的二进制串就是哈希值。二、应用场景1、安全加密2、唯一标识3、数据校验4、散列函数5、负载均衡6、数据分片7、分布式存储三、源码Github(SAW:Game Over!)...原创 2019-10-16 08:49:16 · 103 阅读 · 0 评论 -
数据结构与算法 / 散列表(HashTable)
一、散列思想 通过散列函数通过Key值计算得出数组下标,然后利用数组支持下标随机访问的特性,在时间复杂度为O(1)的情况下找到所需要的信息。散列函数Key------------->散列值(哈希值)(哈希函数)二、散列函数 顾名思义,其是一个函数,函数原型大概如下:...原创 2019-10-16 07:03:47 · 200 阅读 · 0 评论 -
数据结构与算法 / 队列(queue)
@time 2019-08-04@author Ruo_Xiao一、定义 队列是一种操作受限的线性表,只能从一端插入从另一端弹出的数据结构。二、特性 先进者先出,后进者后出。三、分类1、基于数组实现的队列,名为顺序队列。实现一个有界队列。2、基于链表实现的队列,名为链式队列。实现一个无界队列。3、若队列收尾相连,则该队列名为循...原创 2019-08-04 20:59:36 · 250 阅读 · 6 评论 -
数据结构与算法 / 栈(stack)
@time 2019-07-24@author Ruo_Xiao@reference 极客时间 -> 数据结构与算法之美--------------------------------------------@time 2019-07-28@modify 增加了对栈在函数调用中的应用、表达式计算中的应用和在括号匹配中的应用的说明...原创 2019-07-26 08:41:10 · 129 阅读 · 0 评论 -
数据结构与算法 / 数组(Array)
@time 2019-07-18@author Ruo_Xiao@notice 64位OS一、基础知识1、数组的定义 数组是一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同数据类型的数据。2、连续的内存空间和相同的数据类型 这种数据的组织方式,直接导致了数据具有核心特性:随机访问。 实现公式(寻址公式)如...原创 2019-07-20 08:34:36 · 183 阅读 · 0 评论 -
数据结构与算法 / 概念
@time 2019-07-15@author Ruo_Xiao一、概念1、数据结构:一组数据的存储结构。2、算法: 操作数据的一组方法。3、二者的关系:(1)数据结构是为算法服务的,算法是作用在特定的数据结构之上的。(2)数据结构是静态的,它只是组织数据的一种方式。如果不再其基础上进行操作,构建算法,孤立存在的数据结构是没有意义的。4、拓...原创 2019-07-15 13:12:13 · 232 阅读 · 0 评论 -
数据结构与算法 / 冒泡排序最坏情况下的时间复杂度解析
冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。 举个例子来说,一个数列 5 4 3 2 1 进行冒泡升序排列, 第一次大循环从第一个数(5)开始到倒数第一个数(1)结束,比较过程:先比较5和4,4比5小,交换位置变成4 5 3 2 1;比较5和3,3比5...原创 2019-06-04 13:01:30 · 11501 阅读 · 0 评论