查找二叉树中最大独立集的大小 - 为什么错误的“解决方案”不起作用?

2023-11-30

这是一个类似问题的链接,有一个很好的答案:Java算法寻找二叉树中最大的独立节点集.

我想出了一个不同的答案,但我的教授说这行不通,我想知道为什么(他不回复电子邮件)。

问题:

给定一个包含 n 个整数的数组 A,其索引从 0 开始(即A[0], A[1], …, A[n-1])。我们可以将 A 解释为一棵二叉树,其中两个 的孩子A[i] are A[2i+1] and A[2i+2],以及每个值 element 是树的节点权重。在这棵树中,我们说 如果顶点集不包含任何顶点,则它是“独立的” 亲子对。独立集合的权重就是 其元素的所有权重的总和。开发一种算法 计算任何独立组的最大重量。

我得出的答案使用了以下关于二叉树中独立集的两个假设:

  1. 同一级别上的所有节点都是相互独立的。
  2. 交替级别上的所有节点都是相互独立的(没有父/子关系)

警告:我在考试期间想出了这个,它并不漂亮,但我只是想看看我是否可以争取至少部分学分。

那么,为什么不能只构建两个独立的集合(一组用于奇数级别,一组用于偶数级别)?

如果每个集合中的任何权重都是非负的,则将它们相加(丢弃负元素,因为这不会对最大权重集合做出贡献)以找到具有最大权重的独立集合。

如果集合中的权重均为负数(或等于 0),则对其进行排序并返回最接近 0 的权重负数。

比较两个集合中每个集合中最大独立集合的权重,并将其作为最终解决方案返回。

我的教授声称这不起作用,但我不明白为什么。为什么行不通?


Interjay 已指出您的答案为何不正确。该问题可以用递归算法解决find-max-independent给定二叉树,考虑两种情况:

  1. 假设根节点是,最大独立集是多少 包括?
  2. 给定根节点,最大独立集是多少 不包括在内?

在情况 1 中,由于包含根节点,因此它的子节点都不能包含在内。因此我们将值相加find-max-independentroot 的孙子的值,加上 root 的值(必须包含在内),然后返回该值。

在情况 2 中,我们返回最大值find-max-independent子节点的数量(如果有的话)(我们只能选择一个)

该算法可能看起来像这样(在 python 中):

def find_max_independent ( A ):
    N=len(A)

    def children ( i ):
        for n in (2*i+1, 2*i+2):
            if n<N: yield n

    def gchildren ( i ):
        for child in children(i):
            for gchild in children(child):
                yield gchild

    memo=[None]*N

    def rec ( root ):
        "finds max independent set in subtree tree rooted at root. memoizes results"

        assert(root<N)

        if memo[root] != None:
            return memo[root]

        # option 'root not included': find the child with the max independent subset value
        without_root = sum(rec(child) for child in children(root))

        # option 'root included': possibly pick the root
        # and the sum of the max value for the grandchildren
        with_root =  max(0, A[root]) + sum(rec(gchild) for gchild in gchildren(root))

        val=max(with_root, without_root)
        assert(val>=0)
        memo[root]=val

        return val


    return rec(0) if N>0 else 0

一些测试用例说明:

tests=[
    [[1,2,3,4,5,6], 16], #1
    [[-100,2,3,4,5,6], 6], #2
    [[1,200,3,4,5,6], 200], #3
    [[1,2,3,-4,5,-6], 6], #4
    [[], 0],
    [[-1], 0],
]

for A, expected in tests:
    actual=find_max_independent(A)
    print("test: {}, expected: {}, actual: {} ({})".format(A, expected, actual, expected==actual))

示例输出:

test: [1, 2, 3, 4, 5, 6], expected: 16, actual: 16 (True)
test: [-100, 2, 3, 4, 5, 6], expected: 15, actual: 15 (True)
test: [1, 200, 3, 4, 5, 6], expected: 206, actual: 206 (True)
test: [1, 2, 3, -4, 5, -6], expected: 8, actual: 8 (True)
test: [], expected: 0, actual: 0 (True)
test: [-1], expected: 0, actual: 0 (True)

测试用例1

test case 1

测试用例2

test case 2

测试用例3

test case 3

测试用例4

test case 4

记忆算法的复杂度为O(n), since rec(n)每个节点调用一次。这是使用深度优先搜索的自上而下的动态规划解决方案。

(测试用例插图由 leetcode 的交互式二叉树编辑器提供)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找二叉树中最大独立集的大小 - 为什么错误的“解决方案”不起作用? 的相关文章

  • 文件比较的逻辑

    我试图编写一个用于文件比较的程序 例如 file1 1 2 3 4 5 file2 1 2 3 4 5 如果我逐行执行 我会得到 1 1 2 2 3 4 3 5 4 5 但是 事实是这些文件之间的唯一区别是 我想要得到这样的东西 1 1 2
  • 如何找到最大。和分钟。在数组中使用最小比较?

    这是一道面试题 给定一个整数数组 找出其中的最大值 和分钟 使用最小比较 显然 我可以循环数组两次并使用 2n在最坏的情况下进行比较 但我想做得更好 1 Pick 2 elements a b compare them say a gt b
  • 图算法:邻接图的可达性

    我有一个依赖图 我将其表示为Map
  • 先增后减的最长子序列

    我正在尝试解决以下问题 元素值先减小后增大的序列称为V序列 在有效的 V 序列中 递减臂中应至少有一个元素 递增臂中至少应有一个元素 例如 5 3 1 9 17 23 是一个有效的 V 序列 在递减臂中具有两个元素 即 5 和 3 在递增臂
  • 以最少插入次数将字符串转换为回文

    这是一个来自日常编码问题 https www dailycodingproblem com 给定一个字符串 找到可以通过插入来组成的回文数 单词中任何位置的字符数尽可能少 如果有 大于一个可以制作的最小长度的回文 返回 字典顺序最早的一个
  • 检测 JSON 数组中没有重复项的最快正确方法是什么?

    我需要检查数组中的所有项目是否都是唯一的serde json Value 由于该类型没有实现Hash我想出了以下解决方案 use serde json json Value use std collections HashSet fn is
  • 找到三角测量时覆盖另一个点的最近 3 个点的算法

    想象一张画布 周围随机分布着一堆点 现在选择其中一点 您如何找到距离它最近的 3 个点 这样如果您画一个连接这些点的三角形 它将覆盖所选点 澄清 我所说的 最近 是指到该点的最小距离总和 这主要是出于好奇 我认为 如果一个点未知 但周围的点
  • 协作投票算法的用户分布

    我的应用程序 实际上是一个游戏 的用户回答问题即可获得积分 问题由其他用户提供 由于数量有限 我无法亲自检查所有内容 因此我决定将过滤过程众包给用户 玩家 规则很简单 每个用户都会看到一个问题来评价好 坏 不确定 当问题被评为 差 5 次时
  • 按顺时针顺序对四个点排序

    数组中的四个 2D 点 我需要按顺时针顺序对它们进行排序 我认为只需一次交换操作就可以完成 但我还没有能够正式放下这一点 编辑 在我的例子中 这四个点是凸多边形 编辑 这四个点是凸多边形的顶点 它们不必按顺序排列 如果你想从更数学的角度来看
  • 使用 O(1) 辅助空间迭代二叉树

    是否可以在 O 1 辅助空间中迭代二叉树 不使用堆栈 队列等 或者这已被证明是不可能的 如果可以的话 怎样才能做到呢 编辑 我得到的关于如果有指向父节点的指针就可能实现这一点的响应很有趣 我不知道可以做到这一点 但取决于您如何看待它 这可以
  • 位图中连续区域的计数是否可以比 O(r * c) 改进?

    您将获得一张由卫星拍摄的表面图像 该图像是一个位图 其中水用 标记 土地标记为 相邻组 形成一个岛屿 二 如果它们水平 垂直或对角相邻 则它们是相邻的 您的任务是打印位图中岛屿的数量 输入示例 输出 5 这是我的实现 需要O r c 空间和
  • com.jcraft.jsch.JSchException:算法协商失败

    我正在尝试从客户端计算机连接 sftp 服务器 但是 com jcraft jsch JSchException 算法协商失败 我收到这种错误 com jcraft jsch JSchException Algorithm negotiat
  • 计算序列 1,3,8,22,60,164,448,1224... 的第 n 项? [复制]

    这个问题在这里已经有答案了 可能的重复 我想以 Order 1 或 nlogn 的顺序生成序列 1 3 8 22 60 164 的第 n 项 https stackoverflow com questions 11301992 i want
  • 递归分层父子

    我有一个来自数据库的项目集合 该数据库具有parentid值或空 这是我的班级设计 public class Item public int id get set public string Name get set public int
  • 转置矩阵存储在一维数组中,无需使用额外的内存[重复]

    这个问题在这里已经有答案了 可能的重复 矩阵的就地转置 https stackoverflow com questions 9227747 in place transposition of a matrix 最近参加了技术笔试 通过以下问
  • 将数字 1 排列在二维矩阵中

    给定二维矩阵的行数和列数 初始矩阵所有元素均为0 给定每行中应该出现的 1 的数量 给定每列中应该出现的 1 的数量 确定是否可以形成这样的矩阵 例子 Input r 3 c 2 no of rows and columns 2 1 0 n
  • 我想知道像tineye.com这样的反向图像搜索服务是如何工作的......?

    像 TinEye 这样的反向图像搜索引擎如何工作 我的意思是进行图像搜索需要哪些参数 不知道 TinEye 是否使用这个 但是SURF http en wikipedia org wiki SURF是用于此目的的常用算法 在这里您可以看到一
  • 如何找到权重为 1、0、-1 且成本精确为 0 的多维路径

    我得到了一个有向图 其中有 n 个节点和边 向量的权重 每个向量的长度为 m 为数字 1 0 1 我想找到从一个节点到另一个节点 我们可以多次访问节点 的任何路径 或者说这样的路径不存在 使其权重之和等于仅由零组成的向量 我正在考虑暴力回溯
  • 如何决定权重?

    对于我的工作 我需要某种具有以下输入和输出的算法 输入 一组日期 过去的日期 输出 一组权重 每个给定日期一个权重 所有权重的总和 1 基本思想是 距离今天日期最近的日期应该获得最高的权重 第二个最接近的日期将获得第二高的权重 依此类推 有
  • 从邻接表计算图的入度

    我遇到了这个问题 其中需要根据邻接列表表示来计算图的每个节点的入度 for each u for each Adj i where i u if i u E in degree u 1 现在根据我的说法 它的时间复杂度应该是O V E V

随机推荐

  • 无法加载资源:服务器响应状态为 409

    自动 WordPress 更新后 插件表单 联系表单 7 现在在其下方显示斜杠 并且不再触发 wpcf7mailsent 侦听器事件 因此在提交表单后不再将其重定向到感谢页面 此错误 服务器响应状态为 409 或也称为 net ERR AB
  • 在加载包含超过 6000 个项目的列表时,ConstraintLayout 与 RecyclerVIew (ListAdapter) 似乎会使用大量内存(高达 1GB)

    我正在为我的应用程序构建一个简单的 FileExplorer 并使用协程获取给定路径中的文件 并在显示它们时 内存使用量出现峰值 我在帖子底部显示了探查器工具选项卡 我最好的猜测是 适配器正在为列表中的每个项目创建一个视图持有者 并且使用应
  • C 中的 Double For 循环语法

    我是 C 新手 必须编写一些模拟给定函数的代码 但是 我很难明确地理解这段代码中的第二个 for 循环正在做什么 该语法似乎不遵循以下循环语法的标准 for init condition increment statement s 这是我正
  • Pandas-通过对列和索引的值求和来合并两个数据帧

    我想按索引和列合并两个数据集 我想合并整个数据集 df1 pd DataFrame 1 0 0 0 2 0 0 0 3 columns 1 2 3 df1 1 2 3 0 1 0 0 1 0 2 0 2 0 0 3 df2 pd DataF
  • 希望在 SVG 元素上结合 CSS 填充颜色和 SVG 图案

    我想利用 CSS 的强大功能来结合两件事来设计 SVG 元素的样式 填充颜色和纹理 我的纹理是使用具有描边但没有填充的 SVG 图案创建的 但即使该图案没有填充 它仍然不允许通过笔划看到 CSS 填充颜色 http jsfiddle net
  • iOS 中的 Facebook 分享对话框

    我正在努力实施本机共享对话框来自 Facebook 的示例应用程序 这样做似乎有些问题 到目前为止我所做的事情 包含最新的 Facebook SDK 包括 AdSupport 社交 帐户 安全和 libsqlite3 dylib 添加了来自
  • jQuery Sortable - 事件被调用太多次

    我有一个 x 类列表 该列表中有许多 y 类列表 可以将项目从任何子列表拖动到任何其他子列表 也可以安排子列表本身的顺序 我正在努力应对通过可排序触发的事件 接收 仅当某些内容从其他地方带入列表时才会触发 因此对于在子列表中排列项目或排列子
  • 为什么我的绝对/固定位置元素没有位于我期望的位置?

    我刚刚学习CSS中的定位 根据我发现有用的文章 我开始尝试 使用以下代码 我无法理解为什么绝对灰盒 div 位于其相对父级之外 我预计灰盒将位于容器的左上角 container background lightblue position r
  • Swift 泛型和协议不适用于 UIKit [可能的错误]

    TL DR gt 滚动到底部 在尝试使用 Swift 面向协议编程来标记 Apple 时 我在尝试实现类之间的委托模式时偶然发现了以下问题 我将从这个例子开始 protocol PhotoHandlerParent class UIView
  • 获取图标128*128文件类型C#

    我需要获取文件类型 doc 或 txt 的图标 它的大小应为 128 128 并以良好的质量保存为 png 或 ico 文件 I used Icon ico Icon ExtractAssociatedIcon d 1 txt pictur
  • 如何从 python 集中删除自定义对象的实例?

    我正在用 python 进行一些基本的卡 牌组操作 下面你可以看到我的 Card 类和 Deck 类 假设我知道有些牌已经死了 并且想将它们从牌组中删除 import itertools SUIT LIST h s d c NUMERAL
  • 设置 Java 线程的优先级

    我有一个在几个线程中运行的程序 主线程与其他线程共享一个对象 在主线程中我调用了 synchronized obj do stuff 我怀疑主线程饥饿并且无法访问obj 如何提高主线程的优先级或者默认情况下它已经高于其他线程 Thread
  • Java:Swing:按下按钮后隐藏框架

    我在 java 框架中有一个按钮 按下该按钮时 它会从文本字段读取一个值 并使用该字符串作为尝试连接到串行设备的端口名称 如果连接成功 该方法返回 true 否则返回 false 如果它返回 true 我希望框架消失 然后将出现其他类中指定
  • 使用 OpenCSVSerde 时,hive 无法读取字符斜杠

    我在 hdfs 中的文件顶部定义了一个表 我正在使用 OpenCSV Serde 从文件中读取 但是 数据中的 斜杠字符在最终结果集中被省略 是否有我没有正确使用的 hive serde 属性 根据文档 escapeChar 应该可以解决这
  • 错误:被调用的对象不是函数或函数指针

    我有以下代码 z x y 1 printf d z z x y 2 x y printf d z z x y x y printf d z z 2 x y x y printf d z 我收到此错误消息 10 11 error called
  • Python 中的八皇后问题

    Python 中的 8 皇后问题 你好 我才开始教Python 所以有人可以解释下面写的代码 在互联网上找到的 吗 有些代码对我来说很复杂 请解释一下 谢谢 问题就在代码附近 BOARD SIZE 8 def under attack co
  • 笔画可以用作 SVG 中剪辑路径的一部分吗?

    我正在编写 MuPDF 的 SVG 输出 并且遇到了 SVG 功能的限制 我想我会在这里问 以防这是已知解决方法的已知问题 或者万一我做了一些愚蠢的事情 我有以下 SVG
  • 如何将行转换为基于重复列的数据?

    我正在尝试获取如下所示的数据集 并将记录转换为以下格式 生成的格式将有两列 一列用于旧列名称 一列用于值 如果有 10 000 行 那么新格式中应该有 10 000 组数据 我对所有不同的方法持开放态度 Excel 公式 sql mysql
  • 如何在 Python 中使用 OpenCV 拉直图像的旋转矩形区域?

    下面的图片会告诉你我想要什么 我有图像中矩形的信息 宽度 高度 中心点和旋转度 现在 我想编写一个脚本来剪切它们并将它们保存为图像 但也要拉直它们 例如 我想从图像内部显示的矩形转到外部显示的矩形 我正在使用 OpenCV Python P
  • 查找二叉树中最大独立集的大小 - 为什么错误的“解决方案”不起作用?

    这是一个类似问题的链接 有一个很好的答案 Java算法寻找二叉树中最大的独立节点集 我想出了一个不同的答案 但我的教授说这行不通 我想知道为什么 他不回复电子邮件 问题 给定一个包含 n 个整数的数组 A 其索引从 0 开始 即A 0 A