到目前为止,我们已经研究了行中的数据 - 数组、链表、堆栈和队列都按顺序排列项目。但现实世界并不是线性的。家谱枝繁叶茂。社交网络形成网络。路线图创建了相互连接的路线。
树和图捕捉了这些关系,它们是人工智能一些最强大技术的核心。
树是一种结构,其中每个项目(称为节点)可以有子节点,形成层次结构。顶部有一个特殊的节点,称为根,没有子节点的节点称为叶子。
CEO
/ \
CTO CFO
/ \ \
Dev1 Dev2 Accountant
二叉树将每个节点限制为最多两个子节点 - 左子节点和右子节点。这个简单的约束可以实现强大的算法。
8
/ \
3 10
/ \ \
1 6 14
二叉搜索树添加了一条规则:对于每个节点,左子树中的所有值都较小,而右子树中的所有值都较大。
这使得搜索速度更快 - 在每个节点,您知道是向左还是向右:
Find 6 in the BST above:
Start at 8 → 6 < 8, go left
At 3 → 6 > 3, go right
At 6 → Found it!
时间复杂度:平衡树的 O(log n) - 与排序数组上的二分搜索相同的对数魔法。
在一棵有 1,000,000 个节点的平衡二叉搜索树中,大约需要多少次比较才能找到一个值?
图通过消除层次结构约束来概括树。它由节点(也称为顶点)和边(节点之间的连接)组成。边缘可以是:
登录 参与讨论
Social network (undirected):
Alice - Bob - Charlie
\ |
Diana - Eve
Road map (weighted, directed):
London →(2h)→ Birmingham →(1.5h)→ Manchester
Facebook 的社交图包含超过 30 亿个节点(用户)和数千亿个边(友谊)。图形算法决定您的动态消息、好友建议和广告定位 - 所有这些都在有史以来最大的图形之一上运行。
最可解释的人工智能模型之一是决策树。它会提出一系列是/否问题来对数据进行分类:
Is temperature > 30°C?
├── Yes: Is humidity > 70%?
│ ├── Yes: "Don't play tennis"
│ └── No: "Play tennis"
└── No: Is it windy?
├── Yes: "Don't play tennis"
└── No: "Play tennis"
决策树很受欢迎,因为人类可以阅读和理解它们——这在医疗保健、金融和法律人工智能中至关重要,因为可解释性很重要。
医院使用人工智能来预测患者风险。监管机构要求人工智能解释其决定。为什么决策树可能比深度神经网络更受青睐,即使神经网络稍微更准确?
随机森林构建数百个决策树,每个决策树都在略有不同的数据子集上进行训练,然后进行投票。这种集成方法比单棵树更准确、更稳健,而且它仍然是行业中使用最广泛的人工智能技术之一。
知识图将事实存储为实体之间的关系:
(London) --[capital_of]--> (United Kingdom)
(London) --[located_in]--> (England)
(Big Ben) --[located_in]--> (London)
Google 的知识图为您在搜索结果中看到的信息面板提供支持。当您搜索“大本钟”时,图表会将其连接到英国伦敦和相关地标。
Netflix、Spotify 和 Amazon 将用户和项目建模为图表。如果用户 A 和 B 都喜欢项目 X 和 Y,并且用户 A 也喜欢项目 Z,则该图向用户 B 推荐 Z。这就是由图结构提供支持的协作过滤。
为什么图表比简单列表更适合社交网络建模?
DFS 在回溯之前尽可能沿着一条路径探索。可以将其视为探索迷宫,始终从最左边转弯,直到遇到死胡同,然后原路返回。
A
/ \
B C
/ \ \
D E F
DFS order: A → B → D → E → C → F
DFS 使用堆栈(自然地通过递归或显式)。它非常适合:
BFS 在深入之前先探索当前深度的所有邻居。可以把它想象成扔进池塘的一块石头向外扩散的涟漪。
A
/ \
B C
/ \ \
D E F
BFS order: A → B → C → D → E → F
BFS 使用队列。它非常适合:
注意上一课中的堆栈和队列如何连接到树和图遍历? DFS使用栈; BFS 使用队列。数据结构相互构建——这就是为什么按顺序学习它们很重要。
您想要在地图上找到两个城市之间所有道路长度相同的最短路线。您应该使用哪种遍历?
社交媒体平台衡量“分离程度”——有多少朋友的朋友跳跃将两个人联系起来。哪种遍历算法可以有效地找到两个用户之间的最少跳数?这与“六度分离”的想法有何关系?
Google 的 PageRank 算法——使 Google 占据主导地位的最初突破——将网络建模为图表。每个网页是一个节点,每个超链接是一个有向边,页面的重要性取决于有多少重要页面链接到该页面。它本质上是图上的随机游走。