当前位置: 首页 > 知识库问答 >
问题:

是否有数据结构支持快速插入和中位数计算?[重复]

云俊美
2023-03-14

我需要一个支持以下操作的数据结构:

  1. 插入一个数字;
  2. 找到所有插入数字的中位数;
  3. (附加)找到所有插入数字的已知分位数(0-1);

最简单的方法是在每次插入后对数字进行排序,但这并不快速。有没有更快的解决方法?

共有3个答案

公孙黎昕
2023-03-14

好吧,如果您最初知道数组的内容开始排序,则可以使用此属性执行二进制搜索,以查找是否存在键,如果不存在,则应插入键的位置。然后,您可以在该点插入该值,数据将继续保持“已排序”。有点老派,是的,但它会很有效。

刘和正
2023-03-14

您可以使用两个二进制堆在O(logN)中执行操作(1),在O(1)中执行操作(2)(也许您也可以快速执行操作(3),我只是不太精通概率论)。

创建一个max-heapL和一个min-heapR。创建两个变量ab,它们将存储一个(或两个)中间元素。堆L将存储所有小于中间元素的元素,堆R将存储所有大于中间元素的元素。LR的大小将始终相同。

插入(x):

  • 如果数据结构中元素的计数为奇数(a存储中间元素,b不存储任何内容):
    • 如果<代码>x
    • b=x
    • 如果 x
    • x 放入 R 中
    • a 放入 L
    • a = b
    • b = 空
    • a 放入 L
    • b 放入 R 中
    • a = x
    • b = 空

    GetMedian():

    • 只要返回a(如果元素计数为奇数)或(a、b)/2(元素计数为偶数)

阮炯
2023-03-14

平衡的二叉搜索树可以通过每个节点的子树的大小来增强。在树旋转期间,维护此统计信息是常数时间,您可以使用它来查找 o(log N) 中 i 的任何值的第 i 个元素:

这样的数据结构将在所有三个操作上给出O(logn)界。

 类似资料:
  • 问题内容: 我知道swift会优化写入时复制数组,但是会为所有结构执行此操作吗?例如: 问题答案: 为 实现 与写入时复制行为-你会得到它无论任何编译器的优化的(尽管当然,最佳化可以减少其中一个副本需要发生的病例数)。 从根本上讲,这只是一个对包含元素的堆分配缓冲区的引用的结构-因此,多个实例可以引用 同一 缓冲区。当您要更改给定的数组实例时,实现将检查缓冲区是否被唯一引用,如果是,则直接对其进行

  • 我正在寻找一个非常具体的数据结构。假设已知元素的最大数量。所有元素都是整数。允许复制。行动包括: 查阅如果我插入n个元素,是最小的元素,是最高的元素是k个最小的元素。所需运行时间: 插入。执行排序的插入,其中是一个整数。所需的运行时: 删除。删除(i)删除第i个元素。所需的运行时: 我想要一种数据结构,是这样吗?我的问题与语言无关,但我用C语言编写代码。

  • 问题内容: Java是否有C ++的类似物: 我需要使用自己的数据类型。 问题答案: Java绝对没有结构:)但是,您在此处描述的内容看起来像JavaBean类。

  • java中是否有内置的数据结构可以为排序列表提供高效的性能?我还需要修改排序列表,包括插入和删除操作。我首先使用arraylist。我认为在插入和删除的情况下,arraylist的性能可能不够好。什么样的数据结构适合使用?如果没有足够快的内置数据结构,在设计自定义数据结构之前,我可以朝哪个方向走?

  • 问题内容: 我有以下代码: 我得到这个值:“ ”,这是 我想知道JavaScript是否处理64位整数,还是我做错了什么? 问题答案: JavaScript使用IEEE-754双精度(64位)格式表示数字。据我了解,这为您提供53位精度,或者15至16个十进制数字。您的数字位数超出了JavaScript所能应付的位数,因此最终得到了一个近似值。 这样并不是真正的“错误处理”,但是如果您需要对大数进

  • 我有大量的数据( 另外,是否是合适的数据结构?或者另一种数据结构会提供更好的复杂性 注意:我不能使用,因为如果使用,也可能存在重复项。查找中值将增加复杂性,因为我将从开始到中间循环以获取其值。