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

找到中位数的数据结构

卓宏达
2023-03-14

这是一个面试问题。设计一个类,它存储整数并提供两个操作:

void insert(int k)
int getMedian()

我想我可以使用BST,以便插入取O(logN)和getMedian取O(logN)(对于getMedian我应该添加每个节点的左/右子节点的数量)。

现在我想知道这是否是最有效的解决方案,没有更好的解决方案。

共有3个答案

宇文智敏
2023-03-14

如果您在O中选择候选者,它会击败整数数组吗?女巫会在插入时使用专用于整数(http://en.wikipedia.org/wiki/Sorting_algorithm)的排序算法执行排序

此外,通过更灵活一点,您可以通过根据输入的属性更改排序算法来提高性能(输入是否几乎排序...)。

我在计算机科学方面几乎是自学成才的,但这就是我的做法:简单越好。

丁高峯
2023-03-14

有关涉及两个堆的解决方案,请参见此堆栈溢出问题。

方寒
2023-03-14

您可以使用2堆,我们将调用
Max-Heap
Min-Heap
插入是这样完成的:

  • 如果新元素x小于的根,那么我们将x插入
  • 否则我们将x插入right
  • 如果插入后的元素计数大于的元素计数的1,那么我们在上调用Extrac-Max并将其插入到
  • 否则,如果插入后的元素计数大于的元素计数,则我们在上调用Extract-Min并将其插入到

中位数始终是的根。

因此,插入是在O(lg n)时间内完成的,而中位数是在O(1)时间内完成的。

 类似资料:
  • 以下问题是在最近的一次微软采访中提出的 给定一个大小为 5 的未排序数组。需要多少个最小比较才能找到中位数?然后他把它扩展为n号。 根据我的说法,5个元素的解是6 这可以扩展到n个元素。如果不是,除了快速选择之外,我们如何在O(n)中的n个元素中找到中位数

  • Linux 内核中的位数组和位操作 除了不同的基于链式和树的数据结构以外,Linux 内核也为位数组(或称为位图(bitmap))提供了 API。位数组在 Linux 内核里被广泛使用,并且在以下的源代码文件中包含了与这样的结构搭配使用的通用 API: lib/bitmap.c include/linux/bitmap.h 除了这两个文件之外,还有体系结构特定的头文件,它们为特定的体系结构提供优化

  • 我有这样的数据。 从上述数据中细化“中位数”的最短方法是什么。我的结果应该是这样的... 中位数 = 1/2(n 1),其中 n 是样本中数据值的数量。

  • 问题内容: 我有以下sql查询,该查询提供了按月,周和日分组的总h_time。相反,我想要月,周和日的h_time中位数。如何在Oracle SQL中做到这一点? 输出: 问题答案: 您的问题可能出在DATE类型携带的时间部分(即使您未明确设置它)。 要摆脱它,您可以使用trunc函数。 代替: 经过: 和: 经过:

  • 本文向大家介绍在C ++中找到偶数和奇数位数的数字总和,包括了在C ++中找到偶数和奇数位数的数字总和的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个整数N,我们必须找到奇数位和偶数位的和。因此,如果数字是153654,则odd_sum = 9,even_sum = 15。 为了解决这个问题,我们可以从最后一位提取所有数字,如果原始数字的位数是奇数,则最后一位必须是奇数位,否则将是偶数位。

  • NowCoder 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 解题思路 // java /* 大顶堆,存储左半边元素 */ private PriorityQueue left = new PriorityQueue<>((o1, o2) ->