这是一个面试问题。设计一个类,它存储整数并提供两个操作:
void insert(int k) int getMedian()
我想我可以使用BST,以便插入
取O(logN)和getMedian
取O(logN)(对于getMedian
我应该添加每个节点的左/右子节点的数量)。
现在我想知道这是否是最有效的解决方案,没有更好的解决方案。
如果您在O中选择候选者,它会击败整数数组吗?女巫会在插入时使用专用于整数(http://en.wikipedia.org/wiki/Sorting_algorithm)的排序算法执行排序
此外,通过更灵活一点,您可以通过根据输入的属性更改排序算法来提高性能(输入是否几乎排序...)。
我在计算机科学方面几乎是自学成才的,但这就是我的做法:简单越好。
有关涉及两个堆的解决方案,请参见此堆栈溢出问题。
您可以使用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) ->