我梦见一个数据结构,它存在吗?


27

我没有找到这种数据结构,但是我不是该领域的专家。

该结构实现了一个集合,并且基本上是具有不变性的可比较元素的数组。不变式如下(递归定义):

长度为1的数组是合并数组。

长度为2 ^ n(对于n> 0)的数组是一个合并数组iff:

  • 前半部分是合并数组,后半部分为空或
  • 第一个数组已满并已排序,第二个数组是合并数组。

请注意,如果数组已满,则会对其进行排序。

要插入一个元素,我们有两种情况:

  • 如果前半部分未满,请递归插入前半部分。
  • 如果前半部分已满,则在后半部分中递归插入。
  • 递归步骤后,如果整个数组已满,请合并两半(已排序),然后将其大小调整为其原始长度的两倍。

要查找元素,请在数组已满时使用二进制搜索将两半递归。(这应该是有效的,因为最多有上升的片段)。O(log(n))

该结构可以认为是mergesort的静态版本。

目前尚不清楚应该删除元素的方法。

编辑:提高我对结构的理解之后。


5
您定义了它,因此它存在。不过,我认为您必须解决一些问题。首先,不变式2使我感到困惑,因为它似乎不适用于您描述它们的中间状态。其次,删除元素后该怎么办?
拉斐尔

7
你梦见一个数据结构,而不是梦想吧...
安德烈·鲍尔

@Raphael感谢您的评论,我根据您的想法改进了定义。我没有想到一种删除算法,我只是想检查一下这个结构是否在文献中,然后再花更多的时间(并且在Google中找不到任何东西)。在第一句话中,您可以定义上帝,但是上帝存在吗?:)
pbaren 2011年

@Andrej谢谢,英语不是我的母语。(我想也不是你的:)
pbaren 2011年

3
@Andrej:OP最初具有“ dreamt with ”,这几乎肯定不是这个意思。我将其更改为“ of”,而不是“ up”。两者在语法上都是正确的,但也都改变了含义。“ Of”是更有趣的发音选项
–AndrásSalamon

Answers:


31

您正在描述适用于静态排序数组的经典Bentley-Saxe对数方法。可以使用相同的想法为任何可分解的搜索问题的任何静态数据结构(无插入或删除)添加对插入的支持。(A搜索问题是可分解如果回答任何工会可以很容易地从答案被计算为套)转化的因数增加摊销查询时间Ø 日志ñ (除非它是已经大于n中的某个多项式ABABO(logn)n),但仅增加一个常数。是的,多亏了Overmars和van Leeuwen,它可以被摊销,但是如果不需要的话,您确实不想这样做。

这些说明涵盖了基础知识。

不使用高速缓存的超前阵列是Bentley-Saxe和van Emde Boas树在类固醇上的突变后代。


4
这些笔记写得精美,插图精美,我已经多次使用它们作为参考。感谢您提供它们!
jbapple 2011年

我看到穿梭树(从介绍高速缓存的先行阵列的论文的上半部分开始)与vEB树有什么关系,但是COLA和vEB树之间的关系是什么?
jbapple 2011年

2
谢谢,此材料似乎是该想法非常有趣的概括。我一直认为数据结构是冻结的算法,可以逐步运行它,但是我从来没有发现这种直觉的有用形式化。
pbaren 2011年

第一个链接对其他人有用吗?
2012年

是的,我只是尝试过。(很遗憾,它进入了Elsevier付费
专区

11

这类似于日志结构的合并树或缓存遗忘的超前数组(或COLA)。

2k12i0i<k

2021

插入花O(lgn)O(n)O(lg2n)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.