大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(正在更新!)

章节内容

上节完成了如下的内容:

  • Spark Graph X
  • 基本概述
  • 架构基础
  • 概念详解
  • 核心数据结构
    在这里插入图片描述

编写 Spark GraphX 程序注意的事情

数据分区与负载均衡

由于 GraphX 运行在分布式环境中,数据分区策略直接影响到计算性能。合理分区可以减少网络传输和计算开销,提高图计算的效率。要注意图数据的分布情况,避免数据倾斜。

处理大规模数据时的内存管理

GraphX 会对顶点和边的数据进行分区和缓存,但在处理大规模图数据时,内存管理尤为重要。需要注意内存使用情况,合理配置 Spark 的内存参数,避免内存溢出或垃圾回收频繁的问题。

迭代计算的收敛条件

许多图算法(如 PageRank)是基于迭代计算的,因此要合理设置收敛条件(例如迭代次数或结果变化阈值)。过多的迭代会浪费计算资源,过少的迭代可能导致结果不准确。

图的变换和属性操作

在对图进行操作时,特别是更新顶点和边的属性时,要确保变换操作不会导致数据不一致或图结构的破坏。使用 mapVertices、mapEdges 等操作时,要谨慎处理每个顶点和边的属性。

错误处理与调试

在编写分布式程序时,错误处理和调试尤为重要。GraphX 的操作涉及复杂的图结构,调试时应充分利用 Spark 的日志和错误信息,使用小规模数据集进行初步验证,逐步扩展到大规模数据。

数据存储与序列化

GraphX 在处理大规模图数据时,可能需要将数据保存到外部存储中(如 HDFS)。要注意选择合适的数据格式和序列化方式,以保证数据读写的高效性和可靠性。

扩展性与性能优化

在开发 GraphX 应用时,考虑到未来可能的扩展需求,程序设计应具有一定的扩展性。同时,针对性能的优化也是关键,要通过测试和调整参数来找到最佳的执行配置。

编写 Spark GraphX 程序

以下是编写 Spark GraphX 程序的主要步骤:

初始化 SparkContext

创建 SparkConf 和 SparkContext,这是 Spark 应用程序的入口。

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.graphx._object GraphXExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("GraphX Example").setMaster("local[*]")val sc = new SparkContext(conf)}
}

构建顶点和边 RDD

顶点和边是构建图的基本元素。我们可以通过 RDD 来定义这些元素

// 顶点RDD (VertexId, 属性)
val vertices: RDD[(VertexId, String)] = sc.parallelize(Array((1L, "Alice"), (2L, "Bob"), (3L, "Charlie"), (4L, "David")
))// 边RDD (源顶点ID, 目标顶点ID, 属性)
val edges: RDD[Edge[Int]] = sc.parallelize(Array(Edge(1L, 2L, 1), Edge(2L, 3L, 1), Edge(3L, 4L, 1), Edge(4L, 1L, 1)
))

构建图 (Graph)

使用顶点和边的 RDD 来构建图。

val graph = Graph(vertices, edges)

进行图操作或算法计算

你可以对图进行各种操作或使用图算法库进行计算。下面的示例是计算 PageRank。

val ranks = graph.pageRank(0.01).vertices

收集和处理结果

通过 collect 或 saveAsTextFile 等方法获取和处理计算结果。

ranks.collect().foreach { case (id, rank) => println(s"Vertex $id has rank: $rank") 
}

关闭 SparkContext

在程序结束时,关闭 SparkContext 以释放资源。

sc.stop()

导入依赖

<dependency><groupId>org.apache.spark</groupId><artifactId>spark-graphx_2.12</artifactId><version>${spark.version}</version>
</dependency>

案例一:图的基本计算

在这里插入图片描述

编写代码

package icu.wzkimport org.apache.spark.graphx.{Edge, Graph, VertexId}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object GraphExample1 {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("GraphExample1").setMaster("local[*]")val sc = new SparkContext(conf)sc.setLogLevel("WARN")// 初始化数据// 定义定点(Long,info)val vertexArray: Array[(VertexId, (String, Int))] = Array((1L, ("Alice", 28)),(2L, ("Bob", 27)),(3L, ("Charlie", 65)),(4L, ("David", 42)),(5L, ("Ed", 55)),(6L, ("Fran", 50)))// 定义边(Long,Long,attr)val edgeArray: Array[Edge[Int]] = Array(Edge(2L, 1L, 7),Edge(2L, 4L, 2),Edge(3L, 2L, 4),Edge(3L, 6L, 3),Edge(4L, 1L, 1),Edge(5L, 2L, 2),Edge(5L, 3L, 8),Edge(5L, 6L, 3),)// 构造vertexRDD和edgeRDDval vertexRDD: RDD[(Long, (String, Int))] = sc.makeRDD(vertexArray)val edgeRDD: RDD[Edge[Int]] = sc.makeRDD(edgeArray)// 构造图Graph[VD,ED]val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)// 属性操作实例// 找出图中年龄大于30的顶点graph.vertices.filter {case (_, (_, age)) => age > 30}.foreach(println)// 找出图中属性大于5的边graph.edges.filter {edge => edge.attr > 5}.foreach(println)// 列出边属性 > 5 的tripletsgraph.triplets.filter(t => t.attr > 5).foreach(println)// degrees操作// 找出图中最大的出度、入度、度数println("==========outDegrees=============")graph.outDegrees.foreach(println)val outDegrees: (VertexId, Int) = graph.outDegrees.reduce {(x, y) => if (x._2 > y._2) x else y}println(s"Out degree: ${outDegrees}")println("==========inDegrees=============")graph.inDegrees.foreach(println)val inDegrees: (VertexId, Int) = graph.inDegrees.reduce {(x, y) => if (x._2 > y._2) x else y}println(s"In degree: ${inDegrees}")// 转换操作// 顶点的转换操作 所有人年龄+10岁graph.mapVertices {case (id, (name, age)) => (id, (name, age + 10))}.vertices.foreach(println)// 边的转换操作 边的属性 * 2graph.mapEdges(e => e.attr * 2).edges.foreach(println)// 结构操作// 顶点年龄 > 30的子图val subGraph: Graph[(String, Int), Int] = graph.subgraph(vpred = (id, vd) => vd._2 >= 30)println("==========SubGraph=============")subGraph.vertices.foreach(println)subGraph.edges.foreach(println)// 连接操作println("============连接操作==============")// 创建一个新图 顶点VD的数据类型 User,并从Graph做类型转换val initialUserGraph: Graph[User, Int] = graph.mapVertices {case (_, (name, age)) => User(name, age, 0, 0)}// initialUserGraph 与 inDegree outDegree 进行 JOIN 修改 inDeg outDegvar userGraph: Graph[User, Int] = initialUserGraph.outerJoinVertices(initialUserGraph.inDegrees) {case (id, u, inDegOut) => User(u.name, u.age, inDegOut.getOrElse(0), u.outDeg)}.outerJoinVertices(initialUserGraph.outDegrees) {case (id, u, outDegOut) => User(u.name, u.age, u.inDeg, outDegOut.getOrElse(0))}userGraph.vertices.foreach(println)// 找到 出度=入度 的人员userGraph.vertices.filter {case (id, u) => u.inDeg == u.outDeg}.foreach(println)// 聚合操作// 找到5到各顶点的最短距离// 定义源点val sourceId: VertexId = 5Lval initialGraph: Graph[Double, Int] = graph.mapVertices((id, _) => if (id == sourceId) 0.0 else Double.PositiveInfinity)val sssp: Graph[Double, Int] = initialGraph.pregel(Double.PositiveInfinity)(// 两个消息来的时候,取它们当中路径的最小值(id, dist, newDist) => math.min(dist, newDist),// Send Message 函数// 比较 triplet.srcAttr + triplet.attr 和 triplet.dstAttr// 如果小于,则发送消息到目的顶点triplet => {// 计算权重if (triplet.srcAttr + triplet.attr < triplet.dstAttr) {Iterator((triplet.dstId, triplet.srcAttr + triplet.attr))} else {Iterator.empty}},// mergeMsg(a, b) => Math.min(a, b))println("找到5到各个顶点的最短距离")println(sssp.vertices.collect.mkString("\n"))sc.stop()}
}case class User(name: String, age: Int, inDeg: Int, outDeg: Int)

运行结果

(5,(Ed,55))
(6,(Fran,50))
(3,(Charlie,65))
(4,(David,42))
Edge(2,1,7)
Edge(5,3,8)
((5,(Ed,55)),(3,(Charlie,65)),8)
((2,(Bob,27)),(1,(Alice,28)),7)
==========outDegrees=============
(5,3)
(3,2)
(2,2)
(4,1)
Out degree: (5,3)
==========inDegrees=============
(4,1)
(2,2)
(1,2)
(6,2)
(3,1)
In degree: (2,2)
(6,(6,(Fran,60)))
(3,(3,(Charlie,75)))
(2,(2,(Bob,37)))
(1,(1,(Alice,38)))
(5,(5,(Ed,65)))
(4,(4,(David,52)))
Edge(3,6,6)
Edge(2,1,14)
Edge(4,1,2)
Edge(5,6,6)
Edge(5,3,16)
Edge(3,2,8)
Edge(2,4,4)
Edge(5,2,4)
==========SubGraph=============
(6,(Fran,50))
(5,(Ed,55))
(3,(Charlie,65))
(4,(David,42))
Edge(5,3,8)
Edge(3,6,3)
Edge(5,6,3)
============连接操作==============
(3,User(Charlie,65,1,2))
(2,User(Bob,27,2,2))
(1,User(Alice,28,2,0))
(6,User(Fran,50,2,0))
(5,User(Ed,55,0,3))
(4,User(David,42,1,1))
(4,User(David,42,1,1))
(2,User(Bob,27,2,2))
找到5到各个顶点的最短距离
(1,5.0)
(2,2.0)
(3,8.0)
(4,4.0)
(5,0.0)
(6,3.0)Process finished with exit code 0

运行截图如下:
在这里插入图片描述

Pregel API

图本身是递归数据结构,顶点的属性依赖于它们的邻居的属性,这些邻居的属性又依赖于自己的邻居的属性。所以需要重要的算法都是迭代的重新计算每个顶点的属性,直到满足某个确定的条件。
一系列的图并发抽象被提出来用来表达这些迭代算法。
GraphX公开了一个类似Pregel的操作

在这里插入图片描述

  • vprog:用户定义的顶点运行程序,它所用每一个顶点,负责接收进来的信息,并计算新的顶点值
  • sendMsg:发送消息
  • mergeMsg:合并消息

案例二:连通图算法

给定数据文件,找到存在的连通体

数据内容

自己生成一些即可:

1 2
1 3
2 4
3 4
4 5
5 6

编写代码

package icu.wzkimport org.apache.spark.graphx.{Graph, GraphLoader}
import org.apache.spark.{SparkConf, SparkContext}object GraphExample2 {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("GraphExample2").setMaster("local[*]")val sc = new SparkContext(conf)sc.setLogLevel("WARN")// 从数据文件中加载 生成图val graph: Graph[Int, Int] = GraphLoader.edgeListFile(sc, "graph.txt")graph.vertices.foreach(println)graph.edges.foreach(println)// 生成连通图graph.connectedComponents().vertices.sortBy(_._2).foreach(println)// 关闭 SparkContextsc.stop()}
}

运行结果

(1,1)
(3,1)
(4,1)
(5,1)
(6,1)
(2,1)
Edge(1,2,1)
Edge(1,3,1)
Edge(2,4,1)
Edge(3,4,1)
Edge(4,5,1)
Edge(5,6,1)
(4,1)
(6,1)
(2,1)
(1,1)
(3,1)
(5,1)

运行截图如下所示:
在这里插入图片描述

案例三:寻找相同的用户,合并信息

需求明确

假设:

  • 假设五个不同信息可以作为用户标识,分别:1X,2X,3X,4X,5X
  • 每次可以选择使用若干为字段作为标识
  • 部分标识可能发生变化,如 12变为13 或 24变为25

根据以上规则,判断以下标识是否代表同一用户:

  • 11-21-32、12-22-33(X)
  • 11-21-32、11-21-52(OK)
  • 21-32、11-21-33(OK)
  • 11-21-32、32-48(OK)

问题:在以下数据中,找到同一个用户,合并相同用户的数据

  • 对于用户标识(id):合并后去重
  • 对于用户的信息:key相同,合并权重

编写代码

package icu.wzkimport org.apache.spark.graphx.{Edge, Graph, VertexId, VertexRDD}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object GraphExample3 {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("GraphExample3").setMaster("local[*]")val sc = new SparkContext(conf)sc.setLogLevel("WARN")val dataRDD: RDD[(List[Long], List[(String, Double)])] = sc.makeRDD(List((List(11L, 21L, 31L), List("kw$北京" -> 1.0, "kw$上海" -> 1.0, "area$中关村" -> 1.0)),(List(21L, 32L, 41L), List("kw$上海" -> 1.0, "kw$天津" -> 1.0, "area$回龙观" -> 1.0)),(List(41L), List("kw$天津" -> 1.0, "area$中关村" -> 1.0)),(List(12L, 22L, 33L), List("kw$大数据" -> 1.0, "kw$spark" -> 1.0, "area$西二旗" -> 1.0)),(List(22L, 34L, 44L), List("kw$spark" -> 1.0, "area$五道口" -> 1.0)),(List(33L, 53L), List("kw$hive" -> 1.0, "kw$spark" -> 1.0, "area$西二旗" -> 1.0))))// 1 将标识信息中的每一个元素抽取出来,作为ID// 备注1 这里使用了 flatMap 将元素压平// 备注2 这里丢掉了标签信息,因为这个RDD主要用于构造顶点、边// 备注3 顶点、边的数据要求Long,这个程序修改后才能用在我们的程序中val dotRDD: RDD[(VertexId, VertexId)] = dataRDD.flatMap {case (allids, _) => allids.map(id => (id, allids.mkString.hashCode.toLong))}// 2 定义顶点val vertexesRDD: RDD[(VertexId, String)] = dotRDD.map {case (id, _) => (id, "")}// 3 定义边(id: 单个标识信息:ids:全部的标识信息)val edgesRDD: RDD[Edge[Int]] = dotRDD.map {case (id, ids) => Edge(id, ids, 0)}// 4 生成图val graph = Graph(vertexesRDD, edgesRDD)// 5 找到强连通体val connectRDD: VertexRDD[VertexId] = graph.connectedComponents().vertices;// 6 定义中心点的数据val centerVertexRDD: RDD[(VertexId, (List[VertexId], List[(String, Double)]))] = dataRDD.map {case (allIds, tags) => (allIds.mkString.hashCode.toLong, (allIds, tags))}// 7 步骤5、6的数据做join 获取需要合并的数据val allInfoRDD = connectRDD.join(centerVertexRDD).map {case (_, (id2, (allIds, tags))) => (id2, (allIds, tags))}// 8 数据聚合(将同一个用户的标识、标签放在一起)val mergeInfoRDD: RDD[(VertexId, (List[VertexId], List[(String, Double)]))] = allInfoRDD.reduceByKey {case ((bufferList, bufferMap), (allIds, tags)) =>val newList = bufferList ++ allIds// map 合并val newMap = bufferMap ++ tags(newList, newMap)}// 9 数据合并(allIds去重,tags合并权重)val resultRDD: RDD[(List[VertexId], Map[String, Double])] = mergeInfoRDD.map {case (key, (allIds, tags)) =>val newIds = allIds.distinctval newTags = tags.groupBy(x => x._1).mapValues(lst => lst.map(x => x._2).sum)(newIds, newTags)}resultRDD.foreach(println)sc.stop()}}

运行结果

(List(21, 32, 41, 11, 31),Map(area$中关村 -> 2.0, kw$北京 -> 1.0, kw$天津 -> 2.0, kw$上海 -> 2.0, area$回龙观 -> 1.0))
(List(22, 34, 44, 12, 33, 53),Map(kw$大数据 -> 1.0, kw$spark -> 3.0, area$五道口 -> 1.0, area$西二旗 -> 2.0, kw$hive -> 1.0))

运行的截图如下图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413982.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全科普】学完网络安全出去能做什么工作?

想要了解学完网络安全工程师就业班后&#xff0c;出去能做什么工作&#xff0c;这个时候会分甲方或是乙方&#xff0c;看个人更偏向哪个岗位。 甲方指的是政府、海关、税务机构、高校及其他国有银行、商业银行&#xff0c;以及移动运营商&#xff08;如中国移动、中国联通、中…

【前缀和算法】--- 进阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇我们来赏析前缀和算法的进阶题目。 &#x1f3e0; 和可被K整除的子数组 &#x1f4cc; 题目解析 和可被k整除的子数组 &#x1f4cc; …

线性回归算法详解

目录 线性回归算法 线性回归方程 误差项分析 似然函数求解 线性回归求解 梯度下降算法 下山方向选择 梯度下降优化 梯度下降策略对比 学习率对结果的影响 代码实现 线性回归算法 线性回归是回归算法中最简单、实用的算法之一&#xff0c;在机器学习中很多知识点都是…

【网络】数据链路层协议——以太网,ARP协议

目录 1.局域网转发 2.MAC地址 2.1.什么是MAC地址 2.2.Mac地址的作用 2.3.MAC地址和IP地址的区别和联系 3.以太网协议 4.MTU&#xff0c;IP MTU&#xff0c;MSS 4.1.MTU 4.2. IP MTU 4.3. MSS 4.4. 区别及联系 5.局域网的数据碰撞 5.1.局域网内通信过程 5.2.数据碰…

宏集MIRO-L230工业路由器: 一站式全球联网解决方案

在日益互联的世界中&#xff0c;全球覆盖的稳定连接已成为业务成功的关键因素。宏集非常高兴地向您介绍我们的最新创新产品——MIRO-L230工业路由器&#xff0c;这是一款为现代企业量身定制的LTE路由器&#xff0c;为用户带来前所未有的稳定连接体验。 宏集MIRO-L230工业路由器…

墨兰:花语寓意、神秘传说与独特魅力全解析

在繁花似锦的植物世界中&#xff0c;墨兰宛如一位优雅的隐士&#xff0c;静静地散发着独特的魅力。它那婀娜的身姿和淡雅的芬芳&#xff0c;仿佛在诉说着一个个古老而神秘的故事。当我们凝视着墨兰&#xff0c;不禁会被它那独特的气质所吸引&#xff0c;想要探寻它背后隐藏的花…

电容的分类

电容作为电子产品中不可或缺的元件&#xff0c;其种类繁多&#xff0c;各具特色。以下是电容的主要分类、作用及优缺点概述&#xff1a; 一、电容的分类 电容的分类方式多样&#xff0c;常见的分类方式包括按结构、用途、电解质类型及制造材料等。 按结构分类&#xff1a; 固…

C++编程-递归算法1

目录 先言 关于递归算法 例题一 题目描述 算法分析 标准程序 代码分析 例题二 题目描述 算法分析 标准程序 例题三 题目描述 算法分析 标准程序 代码分析 例题四 题目描述 标准程序 代码分析 后言 先言 从今天开始&#xff0c;我们将新的算法——递归&…

大二必做项目贪吃蛇超详解之中篇游戏设计与分析

贪吃蛇系列文章 上篇win32 中篇设计与分析 文章目录 贪吃蛇系列文章1. 地图1. 1 <locale.h>本地化1. 2 类项1. 3 setlocale函数1. 4 宽字符的打印1. 5 地图坐标 2. 蛇身和食物3. 数据结构设计4. 游戏流程设计5. 核心逻辑实现分析5. 1 游戏主逻辑5. 2 GameStart5. 2. 1 S…

145. 利用 Redis Bitmap实践: 用户签到统计

文章目录 一、Redis Bitmap简介二、Bitmap 的主要应用三、Go使用Redis实现签到统计用户签到查询用户签到状态统计今年累计签到天数统计当月的签到情况 总结 在现代应用程序中&#xff0c;用户签到是一个常见的功能。我们通常使用 MySQL 数据库来存储用户的签到记录。然而&#…

Go入门:gin框架极速搭建图书管理系统

Go入门:gin框架极速搭建图书管理系统 前言 本项目适合 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 项目源码请私信,欢迎前往博主博客torna.top免费查看。 项目结构 D:. ├─ go.mod ├─ go.sum │ ├─ cmd │ └─ main │ …

Docker 容器编排之 Docker Compose

目录 1 Docker Compose 概述 1.1 主要功能 1.2 工作原理 1.3 Docker Compose 中的管理层 2 Docker Compose 的常用命令参数 2.1 服务管理 2.1.1 docker-compose up &#xff1a; 2.1.2 docker-compose down &#xff1a; 2.1.3 docker-compose start &#xff1a; 2.1.4 docker…

OpenCV绘图函数(7)从一个椭圆定义中提取出多边形的顶点坐标函数ellipse2Poly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 近似一个椭圆弧为一个多边形线。 函数 ellipse2Poly 计算近似指定椭圆弧的多边形线的顶点。它被 ellipse 函数所使用。如果 arcStart 大于 arcEn…

景芯SoC A72实战反馈

先说结论&#xff1a; 内容非常全面&#xff0c;讲解到位&#xff0c;会有专门的工程师一对一答疑&#xff0c;整个项目跑下来提升非常大&#xff0c;绝对物超所值&#xff01; 一些细节&#xff1a; 本人微电子专业研一在读&#xff0c;有过两次简单的数字芯片流片经历&…

spring security 相关过滤器

Spring Security 提供了 30 多个过滤器。默认情况下Spring Boot 在对 SpringSecurity 进入自动化配置时&#xff0c;会创建一个名为 SpringSecurityFilerChain 的过滤器&#xff0c;并注入到Spring容器中&#xff0c;这个过滤器将负责所有的安全管理&#xff0c;包括用户认证、…

Windows系统中批量管理Windows服务器远程桌面工具——RDCMan

一、背景 在公司没有部署对应的堡垒机系统之前,做运维测试工作的人员,需要管理大量的服务器,每天需要对服务器进行必要的巡检、系统更新发布等内容,特别是有很多Windows服务器的时候,如果我们使用Windows自带的“远程桌面连接”只能一台台连接,比较繁琐。并且不能知道那台…

十二星座男女、穿越到古代会成为什麽角色 。

白羊座&#xff08; 大将军 &#xff09;&#xff1b; 金牛座&#xff08;财务大臣&#xff09;&#xff1b; 双子座&#xff08; 奸臣 &#xff09;&#xff1b; 巨蟹座&#xff08;御厨太医&#xff09;&#xff1b; 狮子座&#xff08;皇帝&#xff09;&#xff1b; …

虚幻5|按键触发学习

一&#xff0c;如图参考 1.下移 驱动阈值 越大按时间长才会触发&#xff0c;越小很快就可以触发 2.按下 当按下超出驱动阈值大小就会触发一次&#xff0c;这里的驱动阈值只能设置再0.1~1的大小 3.已松开 当按下的时候&#xff0c;先触发单次的started&#xff0c;如果按压…

精选算法编程题

一、有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10]输出&#xff1a;[0,1,9,16,100]解释&#xff1a;平方后&am…

中国各城市金融科技公司数目数据集(2009-2023年)

金融科技&#xff08;FinTech&#xff09;是金融与科技深度融合的产物&#xff0c;它利用大数据、云计算、人工智能、区块链等现代信息技术手段&#xff0c;对传统金融产品、业务、流程及服务模式进行革新&#xff0c;从而实现金融服务效率的提升、风险管理的优化以及客户体验的…