Algorithm 需要一个数据结构来存储盒子大小的细节,需要一个算法来找到比给定对象大的最小盒子

Algorithm 需要一个数据结构来存储盒子大小的细节,需要一个算法来找到比给定对象大的最小盒子,algorithm,data-structures,Algorithm,Data Structures,我们正在寻找一种数据结构,用于存储和排序具有两个属性的框: 1.高度 2.侧面(方形底座) 这些框用于存储具有相同属性的对象: 1.高度 2.侧面(方形底座) 结构应能够并执行以下操作: InsertBox(高度,侧边)-插入一个具有来自 结构 RemoveBox(高度、侧面)-从中删除具有给定属性的框 结构 GetBox(高度,侧面)-返回至少具有 给定的最小侧面和高度 复选框(高度、侧边)-检查是否有可用于这些选项的复选框 属性 数据结构应该尽可能的高效。 时间复杂度应通过以下参数进行测量:

我们正在寻找一种数据结构,用于存储和排序具有两个属性的框: 1.高度 2.侧面(方形底座)

这些框用于存储具有相同属性的对象: 1.高度 2.侧面(方形底座)

结构应能够并执行以下操作:

  • InsertBox(高度,侧边)-插入一个具有来自 结构
  • RemoveBox(高度、侧面)-从中删除具有给定属性的框
    结构
  • GetBox(高度,侧面)-返回至少具有 给定的最小侧面和高度
  • 复选框(高度、侧边)-检查是否有可用于这些选项的复选框 属性 数据结构应该尽可能的高效。 时间复杂度应通过以下参数进行测量: 1.高度-n 2.侧面(方形底座)-m


    我认为最好的方法是使用RB-Tree,因此在某种程度上,上述方法的时间复杂度将优于(n+m),可能是log(n+m)

    编辑:也许你指的是盒子的三维体积,而不是面积。在这种情况下,只需更改目标函数:将答案中的所有地方的x*y替换为(x^2*y)

    考虑每个框的侧面为x,高度为y。让我们将它们视为二维平面上的点,而不是具有大小的长方体。然后,您需要一个数据结构,该结构可以添加点、删除点、查找点以及执行特殊的GetBox操作

    GetBox操作要求在给定的上象限中找到一个坐标乘积最小的点。换句话说,您必须找到一个x*y最小的点,其中x>=a和y>=b(a和b在查询中给出)。像RB-tree这样的一维树将在这里帮助您

    您需要在范围查询中使用二维树。可以使用以下任一项:、、等。这些数据结构将活动点拆分为逐渐缩小的区域,允许在查询时一次修剪整个区域。您的GetBox是一个高效的树,这是这些树(例如k-D树)的自然操作

    请注意,在GetBox查询中,您希望以最小的x*y获得一个点,而不是简单地枚举所有点。这就是为什么您应该在树的每个节点中维护该点的索引。换句话说,在树的每个节点v中,您应该使用最小乘积x*y将点的索引存储在v子树中


    说到复杂性,k-D树对于范围查询具有最坏情况复杂性O(sqrt(N)),其中N是树中当前的点数。在最坏的情况下(我想这取决于再平衡方案),所有其他操作都可能采用O(logn)。

    实际上需要两棵树;一个基于高度比较,另一个基于侧面比较。复杂性不应该用盒子的数量来衡量吗?你如何判断一个物体何时适合放在盒子里?可以放置一个底部足够窄的三维对象,以便利用连接长方体中两个最远角的对角线长度超过长方体高度和正方形底部长度的事实。谢谢,但您的解决方案存在一个问题:k-d树没有像红黑树那样的再平衡过程,这将导致在多次插入后搜索的复杂性为O(n)(在最坏的情况下,树看起来像一个列表…)。我从一个朋友那里听说他用两棵独立的红黑树解决了这个问题,有什么想法吗?@fady88:你可以重新平衡k-d树。例如,如果检测到树的平衡性差,则可以完全重建树。也可以有其他方法。最有可能的情况是,您不会得到一个具有良好的最坏情况时间保证的算法,但它在实践中运行得很快。RBtrees的内部有一个平衡方案:没有它,你就无法使用它们。Kd树没有一个(将其视为多维情况下二进制搜索树的等价物)。我理解你的意思,但我想问的是,在最坏的情况下,我们是否能在不到O(n)的时间内解决问题,而不是在平均情况下。。我开始想也许根本就没有这回事。。你有什么想法吗?顺便问一下,这个问题不是“背包问题”的变种吗?背包问题是几个没有有效解决方案的问题之一?@fady88:请阅读。首先,它指出有一些kd树的重新平衡方法,允许在O(logn)最坏情况下插入和删除元素,而不会影响查询时间。然而,本文还指出,这些方法在实践中并不有益:它们比启发式再平衡(不保证最坏情况下的时间复杂性)效果更差。