【Algorithms 4】算法(第4版)学习笔记 15 - 4.1 无向图

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:图表介绍
      • 1.1:定义
      • 1.2:常见应用
      • 1.3:术语
      • 1.4:一些图表处理问题
      • 2:图表 API
      • 2.1:图的表示
      • 2.2:无向图 API
      • 2.3:典型图处理代码
      • 2.4:图的几种表示方法
      • 2.4.1:边集(边的数组) Set-of-edges
      • 2.4.2:邻接矩阵 Adjacency-matrix
      • 2.4.3:邻接表数组 Adjacency-list
      • 2.4.4:Java 实现:邻接表数组
      • 2.5:实际应用
      • 2.6: 小结
      • 3:深度优先搜索 depth-first search
      • 3.1:走迷宫
      • 3.2:深度优先搜索概述
      • 3.3:图形处理的设计模式
      • 3.4:demo 演示
      • 3.5:数据结构
      • 3.6:Java 实现
      • 3.7:特性
      • 4:广度优先搜索 breadth-first search
      • 4.1:demo 演示
      • 4.2:特性
      • 4.3:Java 实现
      • 5:连通分量 connected components
      • 5.1:定义
      • 5.2:demo 演示
      • 5.3:Java 实现
      • 6:挑战(略)

前言

来到书本后半部分的学习,视频对应到 Part Ⅱ 部分。书本第 4 章主要内容是图(Graph),本篇主要内容包括:图表介绍图表 API深度优先搜索广度优先搜索 以及 连通分量

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《4.1 无向图》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
注3:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。

Prof. Sedgewick 对本章节的开篇介绍:

Our topic today is algorithms for processing undirected graphs which are a model that are widely used for many, many applications.
今天我们讨论的主题是在计算机编程中处理无向图的算法,这类算法模型在很多很多应用中都有着广泛的应用。


We’ll look at three fundamental algorithms for processing undirected graphs and consider some of the challenges of developing algorithms for this kind of structure.
我们将关注用于处理无向图结构的三个核心算法,并考察在开发这类结构适用算法时所遇到的部分难题。

1:图表介绍

1.1:定义

在这里插入图片描述

:由边(edges)两两连接起来的顶点(vertexes)集合。

书中的定义:

定义。图是由一组顶点和一组能够将两个顶点相连的边组成的。

在这里插入图片描述

为什么学习图表算法?

  • 实际应用广泛多样。
    (数千种实际应用场合中都可以见到图算法的身影。)
  • 已知数百种不同的图算法。
    (在已有的知识体系中,有许多经过验证且有效的针对图问题的算法解决方案。)
  • 图是一种有趣且广泛应用的抽象概念。
    (它能将大量实际问题抽象成易于理解和处理的图形结构。)
  • 是计算机科学和离散数学中富有挑战性的分支。
    (研究图算法不仅有助于解决复杂问题,也有助于深入理解计算理论和数学原理。)

1.2:常见应用

在这里插入图片描述

图 (graph)节点 (vertex)边 (edge)
通信网络 (communication network)电话、计算机 (telephone, computer)光纤电缆 (fiber optic cable)
电路 (circuit)门、寄存器、处理器 (gate, register, processor)导线 (wire)
机械系统 (mechanical system)关节 (joint)杆、梁、弹簧 (rod, beam, spring)
金融网络 (financial network)股票、货币 (stock, currency)交易 (transactions)
交通网络 (transportation network)交叉路口 (intersection)街道 (street)
互联网 (internet)C类网络 (class C network)连接 (connection)
游戏状态图 (game state graph)盘面位置 (board position)合法走步 (legal move)
社交关系网 (social relationship network)个人 (person)友谊关系 (friendship)
神经网络 (neural network)神经元 (neuron)突触 (synapse)
蛋白质交互网络 (protein interaction network)蛋白质 (protein)蛋白质-蛋白质相互作用 (protein-protein interaction)
分子结构 (molecular structure)原子 (atom)化学键 (bond)

1.3:术语

在这里插入图片描述

路径:一系列通过边相互连接的顶点构成的序列。
循环:起点与终点相同的路径。

如果两个顶点之间存在一条路径,则认为这两个顶点是相互连接的。

在这里插入图片描述

1.4:一些图表处理问题

在这里插入图片描述

问题描述
s-t 路径图中是否存在从 s 到 t 的路径?
最短 s-t 路径s 和 t 之间的最短路径是什么?
循环图中是否存在循环?
Euler 循环图中是否存在恰好使用每条边一次的循环(回路)?
Hamilton 循环图中是否存在恰好经过每个顶点一次的循环(回路)?
连通性是否有一种方式能够连接所有顶点?
双连通性是否存在一个顶点,移除该顶点后会导致图不连通?
可平面性图能否在一个平面上画出而不产生任何交叉边?
图同构两个邻接列表是否代表同一个图形结构?

挑战:哪些图处理问题是容易解决的?哪些是困难的?哪些是不可解的?

2:图表 API

2.1:图的表示

在这里插入图片描述

图的绘制:提供了对图结构直观的理解。

注意事项:直观理解可能具有误导性。

在这里插入图片描述

顶点表示方法

  • 本讲内容:采用范围从 0 至 V-1 的整数来表示顶点。
  • 实际应用:利用符号表实现顶点名称与整数标识间的相互转换。

2.2:无向图 API

在这里插入图片描述

2.3:典型图处理代码

在这里插入图片描述

2.4:图的几种表示方法

2.4.1:边集(边的数组) Set-of-edges

在这里插入图片描述

2.4.2:邻接矩阵 Adjacency-matrix

在这里插入图片描述

维护一个大小为 VxV 的布尔型二维数组;
对于图中的每一条边v与w:adj[v][w] = adj[w][v] = true

问:遍历顶点 v 的所有相邻顶点所需的时间是多少?

2.4.3:邻接表数组 Adjacency-list

在这里插入图片描述

2.4.4:Java 实现:邻接表数组

edu.princeton.cs.algs4.Graph

在这里插入图片描述

edu.princeton.cs.algs4.Graph#Graph

在这里插入图片描述

edu.princeton.cs.algs4.Graph#addEdge

在这里插入图片描述

edu.princeton.cs.algs4.Graph#adj

在这里插入图片描述

2.5:实际应用

在这里插入图片描述

在实际应用中,我们采用邻接表的方式来表示图结构。

  • 许多算法都是基于逐个遍历顶点 v 的相邻顶点来设计和实现的。
  • 实际应用中的图结构往往呈现出稀疏特性。(虽然顶点数量巨大,但平均每个顶点的邻接顶点数量却相对较少。)

在这里插入图片描述

2.6: 小结

在这里插入图片描述

3:深度优先搜索 depth-first search

3.1:走迷宫

在这里插入图片描述

Trémaux 迷宫探索 (Trémaux maze exploration):

在这里插入图片描述

书中关于 Trémaux 迷宫算法的描述:

在这里插入图片描述

说个题外话,当看到教授 PPT 原文中 Unroll a ball of string ,我觉得可能翻译成展开一个线团更合适,这让我想到了希腊神话里面忒休斯 (Theseus) 解开米诺斯的迷宫(得益于阿里阿德涅 (Ariadne) 帮助,他把线团绑在腰上解开了迷宫),并战胜了牛头人弥诺陶洛斯 (Minotaurus)。(感兴趣的朋友可以看看我的童年动画《奥林匹斯星传》第29集 《忒修斯和米诺特罗斯》)不知道法国数学家 Charles Pierre Trémaux 发明这个算法的时候是不是从这里得到了灵感哈哈哈。

最神奇的是,前面刚讲完,然后教授的 PPT 里面就出现了:

在这里插入图片描述

(视频演示了不同难度的迷宫探索,略过)

3.2:深度优先搜索概述

在这里插入图片描述

目标:系统性地遍历一个图。
想法:模仿迷宫探索方式。(函数调用栈充当线团的角色)

典型应用

  • 寻找与给定起始顶点相连的所有顶点。
  • 寻找两个顶点之间的路径。

3.3:图形处理的设计模式

在这里插入图片描述

设计模式:将图的数据类型与图处理过程解耦。

步骤如下:

  • 创建一个 Graph 对象,用于存储和表示图结构。
  • 将创建的 Graph 对象传递给一个专门处理图的函数或方法。
  • 通过查询该图处理函数或方法获取所需信息。

3.4:demo 演示

在这里插入图片描述

访问一个顶点 v 时:

  • 将顶点 v 标记为已访问状态。
  • 递归地访问所有与 v 相邻且尚未被标记过的顶点。

初始状态:

在这里插入图片描述

访问第一个顶点 0,标记为 T:

在这里插入图片描述

需要依次检查顶点 0 的相邻顶点(顺序不是特别重要,随机顺序):分别是 6、2、1、5。

检查顶点 6,标记为 T,边 edgeTo[v] 标记为 0,表示从 0 开始到此顶点:

在这里插入图片描述


在这里插入图片描述

顶点 6 同样需要递归检查相邻顶点:分别是 0 和 4。

首先检查顶点 0,已经被标记。

在这里插入图片描述

检查顶点 4,标记为 T,边 edgeTo[v] 标记为 6:

在这里插入图片描述


在这里插入图片描述

顶点 4 需要递归检查相邻顶点:分别是 5、6、3。

检查顶点 5,标记为 T,边 edgeTo[v] 标记为 4:

在这里插入图片描述


在这里插入图片描述

顶点 5 需要递归检查相邻顶点:分别是 3、4、0。

检查顶点 3,标记为 T,边 edgeTo[v] 标记为 5:

在这里插入图片描述


在这里插入图片描述

顶点 3 需要递归检查相邻顶点:分别是 5 和 4。

检查顶点 5,已经被标记。

检查顶点 4,已经被标记。

在这里插入图片描述

此时完成了顶点 3 的搜索:

在这里插入图片描述

返回顶点 5 继续搜索:

在这里插入图片描述

检查顶点 4,已经被标记。

检查顶点 0,已经被标记。

完成了顶点 5 的搜索:

在这里插入图片描述

返回顶点 4 继续搜索:

在这里插入图片描述

检查顶点 6,已经被标记。

检查顶点 3,已经被标记。

完成了顶点 4 的搜索:

在这里插入图片描述

返回顶点 6,同理完成顶点 6 搜索:

在这里插入图片描述

返回顶点 0 继续搜索:

在这里插入图片描述

检查顶点 2,标记为 T,边 edgeTo[v] 标记为 0:

在这里插入图片描述

检查相邻顶点 0,完成搜索:

在这里插入图片描述

检查顶点 1,标记为 T,边 edgeTo[v] 标记为 0:

在这里插入图片描述

检查相邻顶点 0,完成搜索:

在这里插入图片描述

返回顶点 0 继续搜索:

在这里插入图片描述

检查顶点 5,已经被标记。

完成顶点 0 的搜索:

在这里插入图片描述

完成了所有顶点 0 可达的顶点搜索:

在这里插入图片描述

3.5:数据结构

在这里插入图片描述

数据结构

  • 布尔数组 marked[] 用于记录已访问过的顶点。
  • 整数数组 edgeTo[] 用于追踪路径。
    (edgeTo[w] == v),则表示首次访问顶点 w 时是通过从顶点 v 到顶点 w 的边到达的。
  • 函数调用栈用于实现递归过程。

3.6:Java 实现

edu.princeton.cs.algs4.DepthFirstPaths

在这里插入图片描述

在这里插入图片描述

3.7:特性

在这里插入图片描述

命题:深度优先搜索(DFS)可以在时间复杂度与起始顶点 s 连接的所有顶点的度数之和成比例(加上初始化 marked[] 数组所需的时间)的情况下,标记所有与 s 相连的顶点。

证明【正确性】:

  • 若顶点 w 已被标记,则说明 w 与 s 相连(原因在于 DFS 会递归地访问与已访问顶点相邻的未访问顶点,直至所有相连顶点都被访问到)。
  • 若顶点 w 与 s 相连,则 w 会被标记(如果 w 未被标记,则考虑从 s 到 w 路径上最后一个由已标记顶点指向未标记顶点的边,DFS 会在递归过程中找到并标记 w)。

证明【运行时间】:
与起始顶点s相连的每个顶点仅会被访问一次。

对应书本命题 A:

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

命题:在执行深度优先搜索(DFS)后,可以在常数时间内检查顶点 v 是否与顶点 s 连通,并且如果存在一条路径,可以在与其长度成比例的时间内找到从 v 到 s 的路径。

证明:edgeTo[] 是根为顶点 s 的树的父节点链接表示。

相关代码:

edu.princeton.cs.algs4.DepthFirstPaths#pathTo

在这里插入图片描述

对应书本命题 A (续):

在这里插入图片描述

4:广度优先搜索 breadth-first search

4.1:demo 演示

在这里插入图片描述

重复以下操作,直到队列为空:

  • 从队列中移除顶点 v。
  • 将所有与顶点 v 相邻且尚未标记的顶点添加到队列中,并将它们标记为已访问。

初始状态:

在这里插入图片描述

将顶点 0 添加到队列:

在这里插入图片描述

queue 代表队列,v 代表顶点,edgeTo[] 保存边信息,distTo[] 保存路径长度信息。

顶点 0 出队:

在这里插入图片描述

需要依次检查顶点 0 的相邻顶点:分别是 2、1、5。

在这里插入图片描述

检查顶点 2:

在这里插入图片描述

顶点 2 没有被标记,添加到队列中。

检查顶点 1:

在这里插入图片描述

顶点 1 没有被标记,添加到队列中。

检查顶点 5:

在这里插入图片描述

顶点 5 没有被标记,添加到队列中。

完成顶点 0 搜索:

在这里插入图片描述

顶点 2 出队:

在这里插入图片描述

依次检查顶点 2 的相邻顶点:分别是 0、1、3、4。

在这里插入图片描述

检查顶点 0,已经被标记。

检查顶点 1,已经被标记。

检查顶点 3:

在这里插入图片描述

顶点 3 没有被标记,添加到队列中。

检查顶点 4:

在这里插入图片描述

顶点 4 没有被标记,添加到队列中。

完成顶点 2 搜索:

在这里插入图片描述

顶点 1 出队:

在这里插入图片描述

依次检查顶点 1 的相邻顶点:分别是 0、2。

检查顶点 0,已经被标记。

检查顶点 2,已经被标记。

完成顶点 1 搜索:

在这里插入图片描述

顶点 5 出队:

在这里插入图片描述

依次检查顶点 5 的相邻顶点:分别是 3、0。

检查顶点 3,已经被标记。

检查顶点 0,已经被标记。

完成顶点 5 搜索:

在这里插入图片描述

顶点 3 出队:

在这里插入图片描述

依次检查顶点 3 的相邻顶点:分别是 5、4、2。

检查顶点 5,已经被标记。

检查顶点 4,已经被标记。

检查顶点 2,已经被标记。

完成顶点 3 搜索:

在这里插入图片描述

顶点 4 出队:

在这里插入图片描述

依次检查顶点 4 的相邻顶点:分别是 3、2。

检查顶点 3,已经被标记。

检查顶点 2,已经被标记。

完成顶点 4 搜索:

在这里插入图片描述

完成所有搜索:

在这里插入图片描述

4.2:特性

在这里插入图片描述

Q. BFS(宽度优先搜索)按照怎样的顺序检查顶点?
A. 从顶点 s 出发,按与 s 的距离(即边的数量)递增的顺序进行检查(队列中始终保持包含至少 0 个距离为 k 的顶点,并紧接着包含至少 0 个距离为 k+1 的顶点)。

命题:在任何连通图 G 中,BFS 能够在与 E + V 成比例的时间内计算出从顶点 s 到所有其他顶点的最短路径。

对应书本命题 B:

在这里插入图片描述

4.3:Java 实现

edu.princeton.cs.algs4.BreadthFirstPaths

在这里插入图片描述

edu.princeton.cs.algs4.BreadthFirstPaths#bfs

在这里插入图片描述

5:连通分量 connected components

5.1:定义

在这里插入图片描述

书中 API:

在这里插入图片描述

等价关系:

在这里插入图片描述

“是连通的”这一关系被视为等价关系:

・自反性:顶点 v 与自身是连通的。
・对称性:若顶点 v 与顶点 w 是连通的,则顶点 w 也与顶点 v 是连通的。
・传递性:若顶点 v 与顶点 w 是连通的,并且顶点 w 与顶点 x 是连通的,则顶点 v 与顶点 x 也是连通的。

定义:连通分量是一个最大的连通顶点集合。

:在给定连通分量的情况下,可以在常数时间内得到查询结果。

5.2:demo 演示

在这里插入图片描述

访问一个顶点 v 时:

  • 将顶点 v 标记为已访问状态。
  • 递归地访问所有与 v 相邻且尚未被标记过的顶点。
    (和深度优先搜索一样)

初始状态:

在这里插入图片描述

marked[] 保存标记状态,cc[] 保存连通分量信息。

访问第一个顶点 0:

在这里插入图片描述

依次检查顶点 0 的相邻顶点:分别是 6、2、1、5。

检查顶点 6:

在这里插入图片描述

依次检查顶点 6 的相邻顶点:分别是 0、4。

检查顶点 0,已经被标记。

检查顶点 4:

在这里插入图片描述

依次检查顶点 4 的相邻顶点:分别是 5、6、3。

检查顶点 5:

在这里插入图片描述

顶点 5 需要递归检查相邻顶点:分别是 3、4、0。

检查顶点 3:

在这里插入图片描述

顶点 3 需要递归检查相邻顶点:分别是 5、4。

检查顶点 5,已经被标记。

检查顶点 4,已经被标记。

完成顶点 3 的搜索:

在这里插入图片描述

返回顶点 5 继续搜索:

检查顶点 4,已经被标记。

检查顶点 0,已经被标记。

完成顶点 5 的搜索:

在这里插入图片描述

返回顶点 4 继续搜索:

检查顶点 6,已经被标记。

检查顶点 3,已经被标记。

完成顶点 4 的搜索:

在这里插入图片描述

返回顶点 6,同理完成顶点 6 搜索:

在这里插入图片描述

返回顶点 0 继续搜索:

在这里插入图片描述

检查顶点 2:

在这里插入图片描述

完成顶点 2 的搜索。

检查顶点 1:

在这里插入图片描述

完成顶点 1 的搜索。

返回顶点 0 继续搜索:

检查顶点 5,已经被标记。

完成顶点 0 的搜索:

在这里插入图片描述

连通分量:

在这里插入图片描述

顶点 0、2、3、4、5、6 的连通分量编号都是 0。

检查顶点 7:

在这里插入图片描述

检查顶点 8:

在这里插入图片描述

顶点 7 和顶点 8 的连通分量编号都是 1。

在这里插入图片描述

检查顶点 9:

在这里插入图片描述

顶点 9 需要递归检查相邻顶点:分别是 11、10、12。

检查步骤同上,最终结果:

在这里插入图片描述

顶点 9、10、11、12 的连通分量编号都是 2。

在这里插入图片描述

完成所有的连通分量查询:

在这里插入图片描述

5.3:Java 实现

edu.princeton.cs.algs4.CC

在这里插入图片描述

在这里插入图片描述

edu.princeton.cs.algs4.CC#dfs

在这里插入图片描述

6:挑战(略)

视频最后讲到几个挑战案例,本文不再详细展开,感兴趣的朋友请移步视频查看学习。

(完)

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

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

相关文章

基于Apifox实现javaweb的数据响应与请求

前言 之前文章已经写过了怎么基于springboat以及maven创建javaweb项目,这里就不在讲述了 可以看看我之前的文章,前一篇发布的javaweb的数据请求与响应,下面具体介绍怎么基于 Apifox实现javaweb的数据响应与请求,顺便给大家介绍…

类与对象(二)--类的六个默认成员函数超详细讲解

目录 1.类的默认六个成员函数✒️ 2.构造函数 2.1构造函数的概念✒️ 2.2构造函数的特性✒️ 3.析构函数 3.1析构函数的概念✒️ 3.2析构函数的特征✒️ 4.拷贝构造函数 4.1拷贝构造函数的概念✒️ 4.2拷贝构造函数的特征✒️ 4.3思考❓ 4.4深拷贝和浅拷贝⭐️…

UE5 C++ TPS开发 学习记录(九

p20 首先我们现在有一个多人游戏的系统类MultiplayerSessionsSubsystem 在这个系统内提供了很多会话系统的接口SessionInterface 当现在我们有一些SessionInterfaceDelegates的委托,这个委托的来源是SessionInterface,所以我们使用的委托可以接收到来自SessionInterface的消息(…

网络学习:MPLS标签与标签分配协议—LDP

目录 前言: 一、MPLS标签 1、定义: 2、标签结构: 3、标签识别: 二、标签分配协议---LDP(Lable Distribution Protocol) 1、定义: 2、标签分配协议的种类: 3、LDP消息类型 …

回溯五题【Leetcode17数独/37组合问题/51N皇后/212字典树/980状态压缩】

文章目录 关于回溯37. 解数独(37.sudoku-solver)17. 电话号码的数字组合(17.letter-combinations-of-a-phone-number)51. N皇后(51.n-queens)212. 单词搜索 II(212.word-search-ii)简…

K次取反后最大化的数组和 加油站 分发糖果 柠檬水找零

1005.K次取反后最大化的数组和 力扣题目链接(opens new window) 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。&a…

安装算法依赖时版本报错,依赖之间对应版本

困惑了很久,毕竟不是计算机专业专业出身,才知道安装深度学习算法各个依赖之间是有版本对应关系的。 (本文使我随笔记录,无价值) 比如: 再比如: 由于我第一步安装cuda时就和其他博主不一致&…

Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程

Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程 文章目录 Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程5 生命周期5.1 Vue生命周期钩子5.2 在creat…

docker pull 拉取失败,设置docker国内镜像

遇到的问题 最近在拉取nginx时,显示如下错误:Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled (Client.Timeout exceeded while awaiting headers)。 这个的问题是拉取镜像超时,通过检索…

c语言经典测试题11

1.题1 #include <stdio.h> int main() { int a[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p a 5, *q NULL; *q *(p5); printf("%d %d\n", *p, *q); return 0; }上述代码的运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;我们创建了一个数…

第1题:两数之和

题目内容&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。…

数据持久层框架:MyBatis-Plus

数据持久层框架&#xff1a;MyBatis-Plus 前言注解代码生成器CURD接口Service CRUD 接口Mapper CRUD 接口 条件构造器QueryWrapper和UpdateWrapperallEqeq、negt、ge、lt、lebetween、notBetweenlike、notLike、likeLeft、likeRight、notLikeLeft、notLikeRightisNull、isNotNu…

C 判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…

UOS 20 安装redis 7.0.11 安装redis 7.0.11时 make命令 报错 /bin/sh: cc: command not found

UOS 20 安装redis 7.0.11 1、下载redis 7.0.112、安装redis 7.0.113、启动停止redis 7.0.114、安装过程问题记录 UOS 20 安装redis 7.0.11 安装redis 7.0.11时 make命令 报错 /bin/sh: cc: command not found、zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such fil…

代码随想录训练营第37天 | LeetCode 738.单调递增的数字、LeetCode 968.监控二叉树、

目录 LeetCode 738.单调递增的数字 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;贪心算法&#xff0c;思路不难想&#xff0c;但代码不好写&#xff01;LeetCode:738.单调自增的数字_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 968.监控二…

代码随想录算法训练营第十四天| 144. 二叉树的前序遍历 ,145. 二叉树的后序遍历,94. 二叉树的中序遍历

两种写法&#xff0c;递归和非递归写法 递归&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : va…

基于协同过滤的旅游推荐系统设计与实现

基于协同过滤的旅游推荐系统设计与实现 在当今旅游业蓬勃发展的背景下&#xff0c;人们对于旅游体验的需求日益增加&#xff0c;如何为用户提供更加个性化、精准的旅游推荐成为了旅游行业的一个重要课题。为解决这一问题&#xff0c;我们设计并实现了一个基于协同过滤的旅游推…

【设计模式 03】抽象工厂模式

一个具体的工厂&#xff0c;可以专门生产单一某一种东西&#xff0c;比如说只生产手机。但是一个品牌的手机有高端机、中端机之分&#xff0c;这些具体的属于某一档次的产品都需要单独建立一个工厂类&#xff0c;但是它们之间又彼此关联&#xff0c;因为都共同属于一个品牌。我…

android开发网络通信,带你彻底搞懂Android启动速度优化

实现方案 直接依赖 这种方式实现简单&#xff0c;但是耦合太严重&#xff0c;不方便维护与开发&#xff0c;当工程逐渐增大模块逐渐增多&#xff0c;依赖关系会非常复杂&#xff0c;不推荐这种方式。 事件或广播通信 EventBus&#xff1a; 我们非常熟悉的事件总线型的通信框…

Rust学习笔记:深度解析内存管理(二)

在这个信息爆炸的时代&#xff0c;学习一门新的编程语言不仅仅是为了找到一份好工作&#xff0c;更是为了打开思维的新窗口。Rust&#xff0c;作为一门注重安全、速度和并发的系统编程语言&#xff0c;正吸引着越来越多的年轻开发者的目光。今天&#xff0c;我们将一起深入探讨…