计数陷阱

2024-01-02

考虑计算结构不同的数量的问题二叉搜索树 http://en.wikipedia.org/wiki/Binary_search_tree:

给定 N,找到包含值 1 .. N 的结构不同的二叉搜索树的数量

给出一个解决这个问题的算法非常容易:修复根中每个可能的数字,然后递归地解决左右子树的问题:

countBST(numKeys)
    if numKeys <= 1
        return 1
    else
        result = 0
        for i = 1 .. numKeys
            leftBST = countBST(i - 1)
            rightBST = countBST(numKeys - i)

            result += leftBST * rightBST

        return result

我最近开始熟悉treaps http://en.wikipedia.org/wiki/Treap,我向自己提出了以下问题:

给定 N,找到包含值 1 .. N 且优先级为 1 .. N 的不同 treap 的数量。如果两个 treap 相对于键或优先级在结构上不同,则它们是不同的(请继续阅读以进行澄清)。

一段时间以来,我一直在尝试找出可以解决此问题的公式或算法,但尚未成功。这就是我注意到的:

  1. 的答案n = 2 and n = 3似乎是2 and 6,基于我在纸上画树。
  2. 如果我们忽略treaps相对于节点的优先级也可能不同的部分,那么问题似乎与仅计算二叉搜索树相同,因为我们将能够为每个BST分配优先级,这样它也尊重堆不变量。不过我还没有证明这一点。
  3. 我认为困难的部分是考虑在不改变结构的情况下排列优先级的可能性。例如,考虑这个trap,其中节点表示为(key, priority) pairs:

              (3, 5)
              /    \ 
         (2, 3)    (4, 4)
         /              \
    (1, 1)               (5, 2)
    

    我们可以排列第二层和第三层的优先级,同时仍然保持堆不变性,因此即使没有键交换位置,我们也能得到更多的解决方案。对于更大的树来说,这可能会变得更加难看。例如,这是与上面的不同的陷阱:

              (3, 5)
              /    \ 
         (2, 4)    (4, 3) // swapped priorities
         /              \
    (1, 1)               (5, 2)
    

如果有人可以分享有关如何解决此问题的任何想法,我将不胜感激。当我仔细思考时,这似乎是一个有趣的计数问题。也许其他人也考虑过这个问题,甚至解决了!


有趣的问题!我相信答案是N阶乘!

给定一个树结构,只有一种方法来填充二叉搜索树键值。

因此我们需要做的就是计算不同的堆数量。

给定一个堆,考虑对树进行中序遍历。

这对应于数字 1 到 N 的排列。

现在给定 {1,2...,N} 的任意排列,您可以按如下方式构造堆:

找到最大元素的位置。其左侧的元素形成左子树,右侧的元素形成右子树。这些子树是通过查找最大元素并在那里分裂来递归形成的。

这产生了一个堆,因为我们总是选择最大元素,并且该堆的中序遍历就是我们开始的排列。因此,我们有一种从堆到排列并唯一地返回的方法。

因此所需的数量是N!。

举个例子:

    5
   / \
  3   4          In-order traversal ->   35142
     / \ 
     1  2

现在从 35142 开始。最大的是 5,所以 3 是左子树,142 是右子树。

    5
   / \
  3  {142}

在142中,4最大,1在左边,2在右边,所以我们得到

    5
   / \
  3   4
     / \
    1   2

为此填写二分搜索键的唯一方法是:

    (2,5)
   /     \
(1,3)    (4,4)
        /     \
       (3,1)   (5,2)

更正式的证明:

If HN is the number of heaps on 1...N, then we have that

HN = Sum_{L=0 to N-1} HL * HN-1-L * (N-1 choose L)

(基本上我们选择最大值并分配给根。选择左子树的大小,然后选择那么多元素并在左右递归)。

Now,

H0 = 1
H1 = 1
H2 = 2
H3 = 6

If Hn = n! for 0 ≤ n ≤ k

Then HK+1 = Sum_{L=0 to K} L! * (K-L)! * (K!/L!*(K-L)!) = (K+1)!

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

计数陷阱 的相关文章

  • 检测重复文件

    我想检测目录树中的重复文件 当发现两个相同的文件时 将仅保留其中一个重复文件 并删除其余的重复文件以节省磁盘空间 重复是指具有相同内容的文件 但文件名和路径可能不同 我正在考虑为此目的使用哈希算法 但不同的文件有可能具有相同的哈希值 因此我
  • 轮廓积分算法 C++

    我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分 对于初学者来说 我想为梯形方法编写一个算法 但我有点坚持理解它会是什么样子 毕竟 我们通常将梯形方法视为 2D 图 而这里我们有 f C gt C 所以我们谈论的是 4D 最终我希望用
  • 给定一个数字 0-9 的数组和一个整数 n,找到可由输入数组组成且小于 n 的所有整数

    问题是这样的 给你一个数字 0 9 的数组和一个整数n 该数组可能包含任何给定数字的重复项 找到所有可以通过连接输入数组中的数字形成的整数并且小于n 输入数组中的数字可以在输出的元素中重复 例如 输入为 2 5 8 且 n 223 则输出应
  • 找到经过大多数点的直线的最有效算法是什么?

    问题 N 个点在二维平面上给出 同一个点上最多有多少个点straight line The problem has O N2 solution go through each point and find the number of poi
  • 加密单个int的方法

    如何以廉价的方式对 32 位 int 进行双向加密 使每个数字都映射到该空间中的其他 int 并以难以预测的方式映射回来 当然 并且不需要在映射表中预先存储 42 9 亿个整数 您想要的是 32 位分组密码 不幸的是 大多数分组密码都是 6
  • 计算字母表的第 n 个 6 个字符排列

    我已经研究了好几天 试图找到解决这个问题的方法 如果需要的话 我很乐意花钱请人咨询时间来解决这个问题 我目前正在使用Python迭代工具 http docs python org 2 library itertools html生成 32
  • 具有查找功能的优先级队列 - 最快的实现

    我正在考虑实现一个带有附加要求的优先级队列 一个查找 搜索功能 它将告诉一个项目是否在队列中的任何位置 所以函数将是 insert del min 和 find 我不确定是否应该使用堆或自平衡二叉搜索树 看来 PQ 通常是用堆实现的 但我想
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • 当尝试在随机数字数组中查找运行最大值时,会调用多少次更新最大值?

    假设我们有一个包含 N 到 N 的整数的数组 数组大小为 2N 1 我们首先对数组中的元素进行混洗 然后尝试通过从第一个元素到最后一个元素迭代数组来找到最大整数 代码示例是Java语言 int called 0 int max Intege
  • 将矩形分组到网格中

    我有一个随机切片的矩形网格 宽度为 80 单位 我已经将网格每一行的可用空间存储在如下数组中 pX 1 sX 15 pX 30 sX 13 pX 43 sX 1 pX 44 sX 17 pX 1 sX 15 pX 16 sX 14 pX 3
  • 求从1到N的所有数字的数字之和[重复]

    这个问题在这里已经有答案了 问题 求1到N 包括两端 所有数字的数字之和 时间复杂度应该是 O logN 对于 N 10 总和为 1 2 3 4 5 6 7 8 9 1 0 46 对于 N 11 总和为 1 2 3 4 5 6 7 8 9
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 去除 OCR 图像处理中的背景颜色

    我正在尝试删除背景颜色 以提高 OCR 对图像的准确性 示例如下所示 我会将所有字母保留在后处理图像中 同时仅删除浅紫色纹理背景 是否可以使用一些开源软件如Imagemagick将其转换为二值图像 黑 白 来实现这一目标 如果背景有不止一种
  • 创建序列的幂集

    我正在尝试创建一个程序 作为创建序列 字符串或数字的可能组合的基础 这是某种加密 解密程序 我正在使用 Visual Studio 2013 和 C 我想做的是从序列中生成幂集 但我有点困惑并且无法继续进行 这是代码 public stat
  • 动态规划二维平面算法的递归关系帮助

    所以我一直在研究一种算法 我想要完成的任务是 考虑一个 2D 平面 其中有随机分布在 y 上限和下限之间的目标 该集合为T T1 标有坐标 X Y 有一组 S 个传感器 保证覆盖每个目标 每个传感器的半径为 1 坐标为 X Y 每个目标都有
  • 为什么斐波那契堆被称为斐波那契堆?

    The 斐波那契堆 http en wikipedia org wiki Fibonacci heap数据结构的名称中有 斐波那契 一词 但数据结构中似乎没有任何内容使用斐波那契数 根据维基百科文章 斐波那契堆的名称来自于运行时间分析中使用
  • 有没有办法根据值是大于 0.5 还是小于 0.5 来进行下限/上限?

    我正在尝试舍入我的价值观 以便如果它是0 5或更大 则变为1 否则就变成0 例如 3 7 gt 4 1 3 gt 1 2 5 gt 3 有任何想法吗 Math Round 3 7 MidpointRounding AwayFromZero
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • 在最小堆中查找 k 个最小元素 - 最坏情况复杂度

    我有一个最小堆n元素并想要找到k该堆中的最小数字 最坏情况的复杂性是多少 这是我的方法 在 stackoverflow 上的某个地方 我读到在最小堆中查找第 i 个最小数字的复杂性是O i 所以如果我们想找到n 1最小的数字 n 毫无意义
  • 最小对的总和

    Given 2N点 in a 2D plane 你必须将它们分组为N pairs使得所有对的点之间的距离的总和是最小可能值 所需的输出只是总和 换句话说 如果a1 a2 an分别是第一对 第二对 和第 n 对点之间的距离 则 a1 a2 a

随机推荐

  • 异步/等待 JQuery 文档就绪

    它适用于document addEventListener DOMContentLoaded async gt 但我很好奇让它与 JQuery 一起工作 而且 我想要使用异步 等待 不承诺因为稍后我将需要承诺回调之外的变量 let prod
  • PHP,JavaScript - 通过重定向标头来检测屏幕宽度是否正确

    我使用以下 JavaScript 来检测屏幕宽度 并通过条件语句将其用作模板文件中的常量 以显示 不显示网站的部分 虽然它与我的问题没有太大关系 但以防万一 是的 我正在使用 WordPress 我也已经在使用 mobileDetect P
  • Visual Studio 2010 错误:类型 Universe 无法解析程序集

    我已将最初在 Visual Studio 2008 中创建的 WPF 项目加载到 Visual Studio 2010 中 转换过程进展顺利 但在某些 XAML 文件上 VS2010 设计器会抛出几个与项目引用相关的错误 包括以下错误 Sy
  • 如何克服winform的Control.DrawToBitmap()方法大尺寸限制

    我正在使用 C Winforms 和 MS Visual Studio 2010 开发一个桌面应用程序 在该应用程序中 我必须截取表单面板的屏幕截图并将图像保存在光盘中 面板尺寸可以很大 我使用了 Panel DrawToBitmap 方法
  • 在 FluentValidation 中访问 WebApi 2 的路线数据

    我有一个基本的 C Web Api 2 控制器 它有一个 POST 方法来创建实体 public HttpResponseMessage Post UserModel userModel 还有一个更新模型的 PUT 方法 public Ht
  • Sphinx:如何排除自动模块中的导入?

    我有一个用 Python 编写的 Raspberry Pi 项目 它使用 RPi GPIO 模块 代码上的所有工作都是在 Windows 机器上完成的 其中 RPi GPIO 不会安装 每次我尝试运行 autodoc 时 它都会崩溃 说它无
  • Docusign 连接服务未将数据发布到指定的 url

    Docusign 连接服务不会将数据发布到连接服务选项中指定的 URL 实际上 如果我重新发送日志中的数据 它会起作用 但它本身不起作用 请帮我 谢谢 通常 当 DocuSign Connect 未发布到 URL 时 这是由以下原因之一引起
  • Maven 资源过滤不起作用 - 由于 spring boot 依赖性 [重复]

    这个问题在这里已经有答案了 在 Maven 项目中 我尝试使用 Maven 资源过滤替换一些令牌 但它不起作用 我还有一些其他项目可以工作 但在这个单个项目中不起作用 不知道出了什么问题 属性文件位于位置 src main resource
  • eof() 返回什么?

    这是代码 string fname home jack example csv ifstream csvin fname c str if csvin eof do something 我的问题是 什么情况下eof 返回真 我有以下选择 文
  • 为什么在 affine2d 中使用转置矩阵

    根据http nl mathworks com help images ref affine2d class html http nl mathworks com help images ref affine2d class html Ma
  • 计算两个地理点的距离(以公里为单位)c#

    我想计算两个地理点的距离 这些点以经度和纬度给出 坐标是 点 1 36 578581 118 291994 点 2 36 23998 116 83171 这是一个比较结果的网站 http www movable type co uk scr
  • 如何在不终止docker容器的情况下重新启动apache2?

    我使用作为基础php docker 容器 https hub docker com php 带有标签 php 5 6 apache 当我尝试重新启动容器内的 apache2 时 容器停止 root phalconapp var www ht
  • 创建数组的快捷方式?

    在 VB NET 中 我创建数组如下 Dim myArray New ArrayList 但是有没有一种方法可以创建包含元素的数组而无需创建变量呢 在 Ruby 中 还有很长的路要走 array Array new 简单的 不变的方式就是
  • ASP.Net MVC3:将 .js 文件放在 View 而不是 Scripts 文件夹附近

    我们想从 Razor 视图中分离出 javascript 以便我们可以测试 我们可以将 js 文件定位在它们对应的视图附近 而不是放在 Scripts 文件夹中吗 例如 我们希望在解决方案资源管理器中看到这一点 MyMvcProject V
  • Java - 使用河豚加密时丢失最终字符

    我正在使用一些 java 代码 使用 Blowfish 加密文本文件的内容 当我将加密文件转换回来 即解密 时 字符串末尾缺少一个字符 有什么想法吗 我对 Java 很陌生 已经摆弄了几个小时但没有运气 文件 war and peace t
  • 扩展 JFrame 总是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 开发 Java Swing GUI 时 扩展 JFrame 总是一个坏主意吗 那么 JPanel 或其他 JComponent 又如何呢 另外 是什么让它变得不好呢 通常 如果您需要自定义 Swing 组件 则仅
  • Flask-mongoengine 中的聚合

    我只是盯着 MongoDB 我正在盯着一个带有 Flask mongoengine 的应用程序 我想聚合一些文档 我正在使用 Flask mongoengine 并在尝试时 class MyDocumentModel db Document
  • GKE Ingress 显示后端服务不健康

    我有一个 GKE 集群 实例组中有 4 个节点 我部署了 Ingress 和几个 Pod 每个 Pod 仅 1 个副本 因此它们仅位于 1 个节点上 我在 Google 控制台 Ingress 详细信息页面 上注意到 尽管正在运行的 pod
  • 如何让 jQuery 自动完成在字段焦点上弹出? [复制]

    这个问题在这里已经有答案了 可能的重复 jQuery 自动完成 UI 我希望它能够在焦点上开始搜索 而无需用户输入任何内容 https stackoverflow com questions 4479598 jquery autocompl
  • 计数陷阱

    考虑计算结构不同的数量的问题二叉搜索树 http en wikipedia org wiki Binary search tree 给定 N 找到包含值 1 N 的结构不同的二叉搜索树的数量 给出一个解决这个问题的算法非常容易 修复根中每个