我需要一个支持以下操作的数据结构:
最简单的方法是在每次插入后对数字进行排序,但这并不快速。有没有更快的解决方法?
好吧,如果您最初知道数组的内容开始排序,则可以使用此属性执行二进制搜索,以查找是否存在键,如果不存在,则应插入键的位置。然后,您可以在该点插入该值,数据将继续保持“已排序”。有点老派,是的,但它会很有效。
您可以使用两个二进制堆在O(logN)中执行操作(1),在O(1)中执行操作(2)(也许您也可以快速执行操作(3),我只是不太精通概率论)。
创建一个max-heapL
和一个min-heapR
。创建两个变量a
和b
,它们将存储一个(或两个)中间元素。堆L
将存储所有小于中间元素的元素,堆R
将存储所有大于中间元素的元素。L
和R
的大小将始终相同。
插入(x
):
a
存储中间元素,b
不存储任何内容):
b=x
x
将 x
放入 R 中
- 将
a
放入 L
a = b
b = 空
将 a
放入 L
- 将
b
放入 R 中
a = x
b = 空
GetMedian():
只要返回a
(如果元素计数为奇数)或(a、b)/2
(元素计数为偶数)
平衡的二叉搜索树可以通过每个节点的子树的大小来增强。在树旋转期间,维护此统计信息是常数时间,您可以使用它来查找 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所能应付的位数,因此最终得到了一个近似值。 这样并不是真正的“错误处理”,但是如果您需要对大数进
我有大量的数据( 另外,是否是合适的数据结构?或者另一种数据结构会提供更好的复杂性 注意:我不能使用,因为如果使用,也可能存在重复项。查找中值将增加复杂性,因为我将从开始到中间循环以获取其值。