Data structures 在O(1)时间内删除小于或等于x的集合的所有元素的数据结构

Data structures 在O(1)时间内删除小于或等于x的集合的所有元素的数据结构,data-structures,stack,amortized-analysis,Data Structures,Stack,Amortized Analysis,我正在自学一门算法课程,并试图解决以下问题: 描述用于存储一组实数的数据结构,这些实数可以在O(1)摊销时间内执行以下操作: 插入(x):删除不大于x的所有元素,并将x添加到集合中。 FindMin():查找集合的最小值 我意识到一旦你有了Insert,findmin就变得很简单了,看看如何使用链表实现,你可以同时删除多个元素(即O(1)),但是找出要删除的链接(也就是x的位置)看起来像是一个O(n)或O(logn)操作,而不是O(1)。问题给出了提示:考虑使用堆栈,但我不知道这有什么帮助。 感

我正在自学一门算法课程,并试图解决以下问题:

描述用于存储一组实数的数据结构,这些实数可以在O(1)摊销时间内执行以下操作:

插入(x):删除不大于x的所有元素,并将x添加到集合中。
FindMin():查找集合的最小值

我意识到一旦你有了Insert,findmin就变得很简单了,看看如何使用链表实现,你可以同时删除多个元素(即O(1)),但是找出要删除的链接(也就是x的位置)看起来像是一个O(n)或O(logn)操作,而不是O(1)。问题给出了提示:考虑使用堆栈,但我不知道这有什么帮助。

感谢您的帮助

原问题如下:


double
是数据结构!在下面的方法中,
ds
表示正在执行操作的数据结构

void Insert(ref double ds, double x)
{
    ds = x;
}

double FindMin(double ds)
{
    return ds;
}

观察数据结构状态的唯一方法是查询其最小元素(
FindMin
)。修改数据结构状态的唯一方法是设置其新的最小元素(
Insert
)。因此,数据结构只是集合中的最小元素。

请注意,您的目标是获得O(1)个摊销时间,而不是O(1)个摊销时间。这意味着,只要n个操作所花费的时间不超过O(n)个,您就可以在每个操作中做任意多的工作

这里有一个简单的解决方案。按升序将元素存储在堆栈中。要插入元素,请不断弹出堆栈,直到其为空或顶部元素大于x,然后将x推到堆栈上。要查找最小值,请读取堆栈的顶部

查找时间O(1)中的最小值。现在让我们看一下insert。直观地说,每个元素最多只能被推送和弹出一次,因此我们可以将昂贵插件的工作分散到更便宜的插件上。更正式地说,让势为n,堆栈上的元素数。每次你做一个插入,你会做一些持久性有机污染物(比如说,k)和潜在的增加1-k(一个新的元素添加,k删除)。摊销成本为k+1+1-k,即2。因此,插入按O(1)摊销


希望这有帮助

O(1)是常数时间。我假设集合中没有固定数量的元素。是的,这就是我遇到困难的原因。@Daniel显然是的,那么你的意思是什么?我只是想确认我对这个问题的理解是正确的,因为我的第一反应是,这个数据结构听起来像我从未听说过的东西&似乎O(1)是合理的意思是“每删除一个元素0(1)”或类似的东西。@Daniel希望原来的问题能澄清问题?不应该插入返回最小值吗?@templatetypedef“插入(x):首先从x中删除所有不大于x的数字,然后将x插入x。”此描述表明x成为x的新最小元素。你确定吗?如果前一个最小值是50,我们插入137,我们不会删除50,最小值将保持不变。@templatetypedef“首先从X中删除所有不大于的数字(你说得对。这是一个非常不寻常的要求。我想知道这是否是源代码中的输入错误?+1用于实际解决所述问题,而不是创造性地阅读要求以避免做任何实际工作;-)@delnan这没有任何意义。如果数据结构要求包括“列出集合的元素“那么问题应该是这样的。我的答案完全按照前面所述解决了这个问题,并且更有效,因为它在每个操作中使用O(1)个空间和非摊销O(1)个时间。这个实现使用O(n)个空间,插入是O(n)个最坏情况(尽管O(1)个摊销)对你来说,.1!我对插入物在一系列操作中的摊销有同样的直觉,但我无法真正解释它!