- 博客(83)
- 收藏
- 关注
原创 [ 数据结构 ] 弗洛伊德算法(Floyd)--------最短路径问题
因为默认开始只有两种路线:直连/不直连,两种情况下默认前驱节点都是出发点,即出发点到任何顶点的前驱节点都是自己,至于后续的改动,不管最短路线改为非直连的两段还是三段,也只是针对不直连的路(即65535),而直连的两个顶点相关数据无需改动,前驱自然就是终点的前驱节点,即出发点。观察:虽然F作为中间点,但是测试时中间点第一个就用F,CD的距离和前驱都未能更新,仅更新了DE之间和DG之间数据,而当F之后的E作为中间点,CD之间数据才能更新,即CD的前驱为F,为什么会如此?为什么如此初始化前驱关系表?
2023-01-10 00:00:34
494
原创 [ 数据结构 ] 迪杰斯特拉算法(最短路径问题)
访问情况数组(用以标记顶点已访问)+前驱节点数组(用以输出最终的最短路径)+距离数组(表示出发点到各顶点的最短距离)说明:主要广度优先搜索,同时定义。
2023-01-09 22:47:06
172
原创 [ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法
【代码】[ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法。
2023-01-09 22:12:53
149
原创 [ 数据结构 ] 集合覆盖问题(贪心算法)
因为当多个电台都能覆盖3个地区时,我们选择了第一个,这考虑的过于简单,比如第一个电台如果包月太贵那么是否应该考虑选第2个呢。说明:整个过程中,其实重难点在第2步中如何选择能覆盖最多地区的电台,并不是选择最大的电台,而是k电台与allAreas的。如果最大,说明k就是本轮我们选择的结果,allAreas其实应该理解为目前未被电台覆盖的地区。ps:该算法的解并不一定是最优解,只是。
2023-01-09 20:36:04
461
原创 [ 数据结构 ] 字符串匹配(暴力匹配)
str2[j]),令 i = i - (j - 1),j = 0。3)用暴力方法解决的话就会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着判断,浪费了大量的时间。(采用KMP算法优化)1)如果当前字符匹配成功(即 str1[i] == str2[j]),则 i++,j++,继续匹配下一个字符。2)现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1。1)有一个字符串 str1= ““abcdefg””,和一个子串 str2=“fg”
2023-01-09 18:50:18
3
原创 [ 数据结构 ] 背包问题(动态规划)
有一个背包,容量为4磅,现有如下物品1)要求达到的目标为装入的背包的总价值最大,并且重量不超出2)要求装入的物品不能重复(01背包)
2023-01-09 18:41:22
237
原创 [ 数据结构 ] 汉诺塔--------分治算法最佳实践
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。温馨__提示__:递归调用的过程中,别认为起始柱一直就是A,也别认为目标柱一直就是C,传参不同,柱子的作用就不同了。如果我们有 n >= 2 情况,我们总是可以看做是两个盘(最下边的盘+上面的盘)把 B 塔的所有盘 从 B->C。把最下边的盘 A->C。
2023-01-09 14:39:31
182
原创 [ 数据结构 ] 图(Graph)--------深度优先、广度优先遍历
为什么要有图?无论是线性表还是树结构,局限于表示一个直接前驱和一个直接后继的关系(一对一/一对多),当我们需要表示的关系时, 这里我们就用到了图节点间的连接成为边,节点称为顶点,一个顶点到另一个顶点所经过的边叫路径,边有方向的叫有向图,边没有方向的叫无向图,边带权值的叫带权图也叫网/邻接表,分别使用二维数组/链表,简单理解:顶点3所表示的一维数组/单链表中,顶点5表示的元素/节点大小就是顶点3和5间边的权值,权值为1表示可直接连接,否则无法直连(通常不用0而使用极大值65535表示)
2023-01-09 14:10:08
117
原创 [ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋
数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在。
2023-01-09 12:38:57
158
原创 [ 数据结构 ] 二叉排序树(BST)
对于二叉排序树,中序遍历结果就是原数列升序排序后的结果为什么说二叉排序树结合数组+链表的优点?它的查找速度其实等价于有序数组的二分查找速度,而它的添加速度基于二分查找在找到位置后等于链表的链尾追加操作(改变空指针的指向),因此得名。
2023-01-08 22:15:42
67
原创 [ 数据结构 ] 赫夫曼编码--------数据、文件压缩解压
如上图:给定字符串按定长编码处理,最终对应二进制长度为359思考:如何压缩,将359有效降低?----
2023-01-08 21:02:40
167
原创 [ 数据结构 ] 堆排序--------思路、图解、代码
答:编写adjust方法,用以调整当前堆(a)为大顶堆,但是该方法并不是调用一次就能完成大顶堆,举例说明:如果将父子三节点看成是一个小小堆,那么从最后一个小小堆开始,使小小堆满足父值>子值(即大顶堆的要求),从后往前对小小堆的堆顶调用adjust方法,一直到第一个小小堆,从而实现构建大顶堆。问:整体思路简单,就是不断构建大顶堆,首尾互换,难就难在如何调整,使得构建成满足条件的大顶堆呢?adjust,就能完成构建大顶堆.-----------------看下面图。继续调整,交换,最终得到升序数组。
2023-01-08 15:48:36
185
原创 [ 数据结构 ] 二叉树详解--------前序、中序、后序、存储、线索化
why?为什么需要树结构?数组虽然查找快(通过下标访问),但无法动态扩容(拷贝到新的数组),而链表相反,树结构刚好结合两者优点浅谈树?树的存储和读取效率都很高,比如二叉排序树,理解树的抽象模型有助于理解递归的原理,树的模型接近于单向链表,父节点指向左右子树,而链表相比二叉树可以看成单叉。
2023-01-08 11:37:21
252
原创 [ 数据结构 ] 哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
2023-01-07 20:39:56
8
原创 [ 数据结构 ] 排序算法--------冒泡、选择、插入、希尔、快排、归并、基数、堆
1.1 排序分类内部排序和外部排序,前者数据加载到内存,后者数据量大需借助外部文件.内部排序包含:插入排序:直接插入排序,希尔排序选择排序:简单选择排序,堆排序交换排序:冒泡排序,快速排序归并排序基数排序1.2 复杂度1)度量一个程序时间有两种方法,事后统计或事前估算,事前估算就需要分析时间复杂度2)时间复杂度:算法中的基本操作语句的重复执行次数是问题规模 n 的某个函数, 计算方法:去常数阶–>保留最高阶项–>去除最高阶项系数 常见时间复杂度:常数阶 O(1)、对数阶 O(log2n)、线性阶 O(n
2022-12-09 18:57:01
380
原创 HBase概述
1)数据存储在一张表中,有行有列,rowkey作用类似主键,按字典序排序2)rowkey确定一行,列族+列确定一列3)存储在HDFS上的形式:先按rowkey范围切分为Region,一个Region对应HDFS的一个文件夹,再按列族切分为两个文件夹,一个文件夹对应一个store,再往下数据就以文件的形式存储在store文件夹里面1)StoreFile中除了Value字段,剩余的所有限定能唯一地表示一行数据,因此多个限定联合为key与Value形成k-v结构2)增改一条数据通过时间戳区分不同版本,而删除操作在
2022-06-17 11:57:42
243
原创 [ Spark ] DStream转换
无状态转化操作就是把简单的 RDD 转化操作应用到每个批次上,也就是转化 DStream 中的每一个 RDD。部分无状态转化操作列在了下表中。注意,针对键值对的 DStream 转化操作(比如reduceByKey())要添加 import StreamingContext._才能在 Scala 中使用。 事实上每个 DStream 在内部是由许多 RDD(批次)组成,且无状态转化操作是分别应用到每个 RDD 上的。有状态转化操作UpdateStateByKeyUpdateStateByK
2022-06-14 00:23:39
69
原创 [ Spark ] RDD\DataFrame\DataSet三者关系
版本:Spark1.0 => RDDSpark1.3 => DataFrameSpark1.6 => Dataset1)RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集2)三者都有惰性机制,在进行创建、转换不会立即执行,只有在遇到Action 如 foreach 时,三者才会开始遍历运算;3)三者有许多共同的函数,如 filter,排序等;4)在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:import spark.implicits.
2022-06-14 00:22:39
104
原创 [ Spark ] 累加器.广播变量
用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行merge。累加器的少加/多加问题在于转换算子没有/多次执行自定义累加器继承AccumulatorV2,并设定泛型重写累加器的抽象方法广播变量 在多个并行操作中使用同一个变量,但是 Spark会为每个任务分别发送。 广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只
2022-06-14 00:20:56
26
原创 [ Spark ] RDD序列化.依赖.持久化
从计算的角度, 算子以外的代码都是在Driver端执行, 算子里面的代码都是在Executor端执行。算子内用到算子外的数据,这样就形成了闭包的效果,算子外的数据需要序列化传值给Executor端执行,闭包检测。 这里的闭包指:就算Executor端的代码一行没走,只要使用了算子外的对象,就算闭包,即改变了变量的生命周期,就需要闭包检测实例:2 RDD依赖关系 相邻的新的RDD依赖旧的RDD,多个连续的RDD的依赖关系,称之为血缘,同时RDD会保存血缘关系,但不会保存数据, 容错:RD
2022-06-14 00:19:36
55
原创 [ Spark ] RDD行动算子汇总
行动算子:触发作业执行的方法,底层调用的是环境对象的runJob方法,底层代码中会创建ActiveJob,并提交执行1)def reduce(f: (T, T) => T): T 先聚合分区内数据,再聚合分区间数据,这里聚合的结果的类型和数据源中的类型一致2)def collect(): Array[T] 将不同分区的数据按照分区顺序采集到Driver端内存中,形成数组3)def count(): Long 返回RDD中元素的个数4)def first(): T 返回RDD中的第一个元素5)def
2022-06-14 00:15:24
74
原创 [ Spark ] RDD转换算子汇总
前置知识:为了区分RDD的方法和集合的方法RDD方法=>RDD算子(改变问题状态的操作,在Spark中表现为:将旧的RDD转换为新的RDD)RDD整体上分为Value类型、双Value类型和Key-Value类型1)def map[ U: ClassTag ] (f: T => U): RDD[U] 将数据逐条进行映射转换,值/类型的转换2)def mapPartitions[U: ClassTag]( f: Iterator[T] => Iterator[U], preservesPartitio
2022-06-14 00:13:56
231
原创 [ Spark ] RDD创建.分区与并行度.分区策略
底层代码中,makeRDD方法其实就是parallelize方法任务的并行度由分区数决定,但是实际生产时,如果可用核数不足,并行会演变为并发1)makeRDD方法的第二个参数直接传入分区的数量2)如果没有传入第二个参数,使用默认值:defaultParallelism(默认并行度) 该值大小为scheduler.conf.getInt(“spark.default.parallelism”, totalCores),即从该对象中获得某一特定值,否则使用totalCores(当前环境的最大核数)3)手动指定
2022-06-14 00:07:26
156
原创 [ Spark ] RDD核心概念,工作原理
Spark计算框架为了能够对数据进行高并发和高吞吐的处理,封装了三大数据结构,用于处理不同的应用场景。三大数据结构分别是:1)RDD : 弹性分布式数据集2)累加器:分布式共享只写变量3)广播变量:分布式共享只读变量ps:数据结构:简单理解为 数据与逻辑的组织形式和存储方式1.RDD定义? RDD(Resilient Distributed Dataset)为弹性分布式数据集,是Spark中最基本的数据处理模型。代码中是一个抽象类(子类多,使用装饰者模式扩充功能),它代表一个弹性的、不可变、可分区
2022-06-14 00:05:10
290
原创 [ Spark ] Spark核心概念
1.Spark or Hadoop?Hadoop的MapReduce和Spark同为计算框架,使用时如何选择? 1)MR由于其设计初衷并不是为了满足循环迭代式数据流处理,因此在多并行运行的数据可复用场景(如:机器学习、图挖掘算法、交互式数据挖掘算法)中存在诸多计算效率等问题。Spark就是在传统的MapReduce 计算框架的基础上,利用其计算过程的优化,从而大大加快了数据分析、挖掘的运行和读写速度,并将计算单元缩小到更适合并行计算和重复使用的RDD。 2)Spark所基于的scala语言恰恰擅长函
2022-06-13 23:59:49
135
原创 [ Hive ] 用户自定义UDF
用户自定义UDF用户自定义函数简称UDF,源自于英文user-defined function。自定义函数总共有3类,是根据函数输入输出的行数来区分的,分别是:UDF(User-Defined-Function)普通函数,一进一出UDAF(User-Defined Aggregation Function)聚合函数,多进一出UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出需求自定义开发实现Hive函数,将手机号中间4位进行脱敏处理,满
2022-04-07 19:20:47
673
原创 [ Hive ] hive优化三 : Job执行优化
Job执行优化1 Explain1.1 语法EXPLAIN [FORMATTED|EXTENDED|DEPENDENCY|AUTHORIZATION|] queryFORMATTED:对执行计划进行格式化,返回JSON格式的执行计划EXTENDED:提供一些额外的信息,比如文件的路径信息DEPENDENCY:以JSON格式返回查询所依赖的表和分区的列表 AUTHORIZATION:列出需要被授权的条目,包括输入与输出1.2 组成执行计划一般由三个部分构成,分别是:1)The Abstr
2022-04-07 18:12:34
1018
原创 [ Hive ] hive优化二 : 表数据优化
表数据优化1 文件格式文件格式优点缺点应用场景TextFile1)是最常用且默认的格式2)不需要经过处理,可以直接cat查看3)可以使用任意的分隔符进行分割4)便于和其他工具(Pig, grep, sed, awk)共享数据5)可以搭配Gzip、Bzip2、Snappy等压缩一起使用1)耗费存储空间,I/O性能较低2)结合压缩时Hive不进行数据切分合并,不能进行并行操作,查询效率低3)按行存储,读取列的性能差1)适合于小量数据的存储查询2)一般用于做第一层数据加载和测试使
2022-04-07 18:09:45
1207
原创 [ Hive ] hive优化一 : 表设计优化
表设计优化1 普通表1.1 Hive查询基本原理创建数据库(chapter_6)创建表(tb_login),hdfs上自动在数仓的数据库目录下创建表目录关联数据:使用load命令将数据加载到表中,数据会被自动放入hdfs中对应表目录下当执行查询计划时,Hive使用表的最后一级目录作为底层处理数据的输入在元数据库metastore中表现为:1)在TBLS表中根据表明查得SD_ID2)SDS元数据表中的记录查询SD_ID对应的HDFS的表目录位置,即底层处理数据的输入
2022-04-07 18:02:53
1166
原创 [ Hive ] 函数应用 : 多字节分隔符.url,json解析.拉链表
1 多字节分隔符应用场景:情况一:每一行数据的分隔符是多字节分隔符,例如:”||”、“–”等情况二:数据的字段中包含了分隔符解决方案:方案一:在ETL阶段通过一个MapReduce程序,将数据中的“||”替换为单字节的分隔符“|”该方式实现较为简单,只需替换字符串即可,但,无法满足情况二的需求方案二:1)正则加载数据建表时使用指定SERDE类:ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.RegexSerDe’指定正则表达式W
2022-04-07 17:59:12
268
原创 [ Hive ] 函数高阶 : 窗口函数.UDTF.UDAF
1 UDTF表生成函数explode函数接收map或者array类型的数据作为参数,然后把参数中的每个元素炸开变成一行数据。一个元素一行explode(map)将map里的每一对元素作为一行,其中key为一列,value为一列explode函数可以直接使用,但是如果在select条件中,包含explode和其他字段就必须结合lateral view侧视图使用explode函数+lateral view侧视图--lateral view侧视图基本语法如下select …… from ta
2022-04-07 17:49:39
773
原创 [ Hive ] 函数入门
1 内置运算符1.1 关系运算符关系运算符是二元运算符,返回boolean类型结果,多用于where子句过滤条件-- is null空值判断select 1 from dual where 'itcast' is null;-- is not null 非空值判断select 1 from dual where 'itcast' is not null;-- like比较: _表示任意单个字符 %表示任意数量字符-- 否定比较: NOT A like Bselect 1 from du
2022-04-07 17:45:00
190
原创 [ Hive ] Select查询.Join连接
1 DQL-Select查询数据1.1 语法树[WITH CommonTableExpression (, CommonTableExpression)*] SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [ORDER BY col_list] [CLUSTER BY col_list
2022-04-07 17:43:08
677
原创 [ Hive ] 数据加载和插入
1 DML-Load加载数据产生映射的方式:将数据文件移到表对应文件夹下建表时使用location关键字指定数据文件路径官方推荐使用load命令将数据加载到表中,加载操作本质上是将数据文件移动到与Hive表对应的位置的纯复制/移动操作-- 加载语法-- 使用local关键字从本地文件系统(服务端)加载为纯复制,不使用则从hdfs上加载为移动-- 使用overwrite关键字,则filepath中的内容会替代目标表/分区中的所有内容-- 加载到表/分区(手动指定静态分区)LOAD DAT
2022-04-01 22:12:32
1006
原创 [ Hive ] DDL : 完整建表语法.Show语法
1 Hive DDL建表基础1.1 完整建表语法树1.2 Hive数据类型Hive数据类型分为:原生数据类型(primitive data type)和复杂数据类型(complex data type)英文字母大小写不敏感复杂数据类型的使用通常需要和分隔符指定语法配合使用如果定义的数据类型和文件不一致,hive会尝试隐式转换,但是不保证成功,不成功的话默认转为null值原生数据类型:复杂数据类型:1.3 数据类型转换原生类型从窄类型到宽类型的转换称为隐式转换[如下图]显式类
2022-04-01 16:18:03
1551
1
原创 [ Hive ] Hive入门 : 数仓基础.Hive架构.安装部署
数仓基础概念数据仓库(Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持。仓库解读:不“生产”任何数据,其数据来源于不同外部系统同时数据仓库自身也不需要“消费”任何的数据,其结果开放给各个外部应用使用数仓需求引出信息用于两处:操作型记录的保存+分析型决策的制定操作型记录的保存:1)公司下辖多条业务线,各业务线的业务正常运营需要记录维护多种不同信息.引出联机事务处理系统(OLTP)
2022-03-31 21:42:15
1758
原创 ZooKeeper入门 : 安装部署,监听器原理,Server动态监听
ZooKeeper概述Zookeeper是一个基于观察者模式设计的分布式服务管理框架,Zookeeper负责存储和管理数据,观察者通过在Zookeeper上注册,并接收Zookeeper观察到的数据状态变化的通知.Zookeeper=文件系统+通知机制特点Zookeeper:一个Leader,多个Follower组成的集群集群只要有半数以上节点存活,就还能正常服务说明:以6台服务器的zk集群为例,必须满足4台节点存活,容错为2台,5台服务器的集群只需3台存活,容错也是2台,因此奇
2022-03-21 00:22:46
2170
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人