这个问题来自我的考试,我无法解决,想看看答案是什么(这不是作业,因为除了知识,它不会帮助我。)
我们需要创建一个数据结构来包含其键是实数的元素
数据结构应具有以下功能:
Build(S,array):用O(n)中的n个元素构建数据结构S.
在O(lgn)中插入(S,k)和删除(S,x)(k是元素,x是数据结构中指向它的指针)
删除 - 最小 - 正(S):删除具有最小正键的元素
模式(S):返回O(1)
现在,在O(n)中构建通常意味着应该使用堆,但这不允许查找频率。我找不到任何办法这样做。我能想到的最好的是构建一个用于构建频率堆的红黑树(O(nlgn))。
我很想知道答案......
谢谢!
答案 0 :(得分:3)
仅使用比较模型,没有解决方案来解决此问题。
Element Distinctness Problem具有可证明的Omega(nlogn)下限。这个(元素清晰度)问题基本上是确定数组的所有元素是否都是不同的问题。
如果有问题的解决方案,那么我们可以在O(n)时间内回答元素清晰度问题(找到O(n)时间中最常见的元素,并查看是否存在多个实例元素,再次在O(n)时间。)
所以,我建议你向你的教授询问计算模型。
答案 1 :(得分:1)
那么,您可以使用哈希表来计算O(1)摊销时间内不同实数的出现次数,然后使用标准堆,其中项是对(实数,出现次数)和堆根据出现次数字段进行排序。
插入密钥或删除密钥时,将字段数增加或减少一个字段,或者在极端情况下添加或删除堆元素。在这两种情况下,您都需要向上/向下渗透,因为订购字段已更改。
假设哈希表是O(1)操作,您有一个标准的堆+ O(1)哈希表,并且您可以在时间限制内获得上述所有操作。特别是,通过读取堆的根元素来获得“模式”。
答案 2 :(得分:0)
我认为以下解决方案是可以接受的。它基于两个数据结构:
二进制堆保存元组,包含(元素值,元素的频率),堆在频率上构建,因此它使我们能够在O(1)中找到模式。
红黑树包含一个元组值(元素值,指向堆中相同元素值的指针)
当您需要插入新元素时,如果搜索成功,您将尝试查找元素(它需要O(log n)),而不是从RB树中创建的元素转到指针,增加频率,并重建堆(也是O(log n))。如果搜索没有找到这样的元素而不是将其插入RB-tree(O(log n))并且堆值为value =(element,1)(也是O(1)),则将RB-tree中的指针设置为new堆中的元素。
初始构建将采用O(n),因为从n元素集合构建两个结构都需要O(n)。
对不起,如果我错过了什么。
答案 3 :(得分:0)
对于频率:
每个条目都双向链接到自己的频率/计数器(使用哈希表)
频率列在链表中
需要在链表上移动频率(删除插入元素),但最大差异为1。
(有例外但可以处理)