CS61B - Lec 29 - Graphs2, BFS, DFS

CS61B - Lec 29 - Graphs2, BFS, DFS

Lec 29 - Graphs2, BFS, DFS


  • 这一章学了具体怎么实现Graph。

BreadthFirstPaths

BreadthFirst,广度优先,意思就是从根节点开始,遍历完所有到根节点距离相同的节点,再遍历下一个深度的。
再复习一遍DepthFirst,从根节点开始,遍历完一个子集,然后再遍历下个子集。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


上节课的结尾提出了这样一个问题:找到s到其他顶点最短的path。距离最短,很容易就想到广度优先遍历。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


答案是这样的。首先要用到queue数据结构,有着enqueue和dequeue两个方法,像队列一样。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


下面看具体的例子:
第一步,把0加入队列,并设置disTo[0] = 0。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


进入循环,截止条件是队列为空。

  • remove队列的头并返回,目前是0
  • 遍历unmarked neighbor,这里只有1,mark(1),加入队列,edgeTo[1] = 0(连接1和0),最后disTo[0] = disTo[0] + 1 = 1
www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


然后重复循环,remove掉1,遍历1的neighbor2和4,mark, 加入队列,dist++。这时,距离根节点0距离为2的节点就遍历完了。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


接着,是距离为3的两个节点5和3.

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


然后,是5的两个neighbor,6和8

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


3没有neighbor了,没有操作,对6进行操作,加入最后一个节点7。最后对8和7进行操作,无neighbor,所以无操作,remove掉之后循环结束。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS

Graph API

API就是接口,interface,先想好这个结构要实现什么功能,具体结构的实现有多种方式。
选择的标准是:runtime, memory和实现的难度。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS
www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS

Reprensentation and Runtimes

现在看如何实现这个adj方法。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS
  1. 用一个二维矩阵,0代表不相连,1代表相连。
www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


可以看到是有一些冗余的结构,每组连接被表示了两次,看runtime的问题:

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


每个顶点都要遍历,每个顶点的每个neighbor都要遍历,表格是V * V,所以runtime是O(V2)。

  1. 建一个Edge的集合,每个Edge用两个顶点表示。
www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS
  1. 建一个hashTable,index代表顶点编号,存储相邻的节点list。
www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


分析3的runtime。此时需要遍历的顶点数是V,每个顶点需要遍历的neighbor可能的范围是1~V(中心散射或者单一相连)。最好的情况是O(V),最坏的情况是O(V2),似乎算不出runtime。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


答案其实是O(V + E)。V是顶点数量,E是边的数量。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


实际的graph还是用的adjacency list。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS

Graph Traversal Implementation and Runtime

常见的graph算法是独立于graph类的。先建立一个graph对象,然后传递给一个graph-processing方法in a client class。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


以下是深度优先的实现方式。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS



再分析广度优先的runtime。

www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS


www.zeeklog.com - CS61B - Lec 29 - Graphs2, BFS, DFS

Read more

安装 启动 使用 Neo4j的超详细教程

安装 启动 使用 Neo4j的超详细教程

最近在做一个基于知识图谱的智能生成项目。需要用到Neo4j图数据库。写这篇文章记录一下Neo4j的安装及其使用。 一.Neo4j的安装 1.首先安装JDK,配环境变量。(参照网上教程,很多) Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。从Oracle官方网站下载 Java SE JDK。我使用的版本是JDK1.8 2.官网上安装neo4j。 官方网址:https://neo4j.com/deployment-center/  在官网上下载对应版本。Neo4j应用程序有如下主要的目录结构: bin目录:用于存储Neo4j的可执行程序; conf目录:用于控制Neo4j启动的配置文件; data目录:用于存储核心数据库文件; plugins目录:用于存储Neo4j的插件; 3.配置环境变量 创建主目录环境变量NEO4J_HOME,并把主目录设置为变量值。复制具体的neo4j文件地址作为变量值。 配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程 在数字化办公日益普及的今天,企业微信作为国内领先的企业级通讯工具,其群机器人功能为团队协作带来了极大的便利。本文将手把手教你如何从零开始配置企业微信群机器人Webhook,实现自动化消息推送,提升团队沟通效率。 1. 准备工作与环境配置 在开始创建机器人之前,需要确保满足以下基本条件: * 企业微信账号:拥有有效的企业微信管理员或成员账号 * 群聊条件:至少包含3名成员的群聊(这是创建机器人的最低人数要求) * 网络环境:能够正常访问企业微信服务器 提示:如果是企业管理员,建议先在"企业微信管理后台"确认机器人功能是否已对企业开放。某些企业可能出于安全考虑会限制此功能。 2. 创建群机器人 2.1 添加机器人到群聊 1. 打开企业微信客户端,进入目标群聊 2. 点击右上角的群菜单按钮(通常显示为"..."或"⋮") 3. 选择"添加群机器人"选项 4.

Flowise物联网融合:与智能家居设备联动的应用设想

Flowise物联网融合:与智能家居设备联动的应用设想 1. Flowise:让AI工作流变得像搭积木一样简单 Flowise 是一个真正把“AI平民化”落地的工具。它不像传统开发那样需要写几十行 LangChain 代码、配置向量库、调试提示词模板,而是把所有这些能力打包成一个个可拖拽的节点——就像小时候玩乐高,你不需要懂塑料怎么合成,只要知道哪块该拼在哪,就能搭出一座城堡。 它诞生于2023年,短短一年就收获了45.6k GitHub Stars,MIT协议开源,意味着你可以放心把它用在公司内部系统里,甚至嵌入到客户交付的产品中,完全不用担心授权问题。最打动人的不是它的技术多炫酷,而是它真的“不挑人”:产品经理能搭出知识库问答机器人,运营同学能配出自动抓取竞品文案的Agent,连刚学Python两周的实习生,也能在5分钟内跑通一个本地大模型的RAG流程。 它的核心逻辑很朴素:把LangChain里那些抽象概念——比如LLM调用、文档切分、向量检索、工具调用——变成画布上看得见、摸得着的方块。你拖一个“Ollama LLM”节点,再拖一个“Chroma Vector

OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,