我被要求实施一个简单的算法来查找具有一个重要条件的列表中的最大数量。算法应为O(1)。所以我写了这个:
int max = Int32.MinValue;
foreach (int item in _items)
{
if (item.CompareTo(max) > 0)
max = item;
}
return max;
正如评论部分所指出的,这是O(N)。但是如何使用O(1)算法找到列表中的最大数量。因为对我而言,似乎必须迭代所有数组项以找到最大数。这甚至可能吗?
答案 0 :(得分:4)
考虑到您的原始问题以及您的意见(并且,我想,我的一些推论),您的要求如下:
最直接的解决方案(跟踪插入时的最大元素)未通过要求4,因为您需要重新计算删除时的最大值。那么我们可以调整它来解决这个问题吗?
是的,我们可以!我们不仅仅跟踪总的最大值,而是跟踪所有索引i的最大值。因此,每次我们附加到列表时,我们都会在列表中添加一个包含值和新最大值的条目。因此,为了获得总的最大值,我们在最后一个索引处取最大值。要删除最后一个元素,我们只需删除最后一个条目。要在索引i处获取元素,我们将获取索引i处的条目并返回其值。因此,只要底层数据结构在(摊销)O(1)(例如,ArrayList会)中执行这些操作,我们也是如此。
答案 1 :(得分:0)
与评论者说的一样,除非你维护一个max变量并在每次插入操作时更新它,否则是不可能的:
Insert(element)
If element > max
max = element
(Rest of insertion code)
这样,当你被问及时,你可以在O(1)中返回最大值
[编辑]
如果我正确理解您的限制,您需要一个解决方案:
O(1) - 插入
O(1) - 删除
O(1) - 获得最大
O(1) - 检索
不确定这样的算法是否存在,但是遵循这个线程来看看我是否可以学到新东西(;
答案 2 :(得分:0)
Heap数据结构可能正是您要查找的内容。基本版本找到max O(1),并插入和删除O(log N)。 Fibonacci堆也有插入O(1)。请参阅Wikipedia article。
答案 3 :(得分:-1)
您可以维护包含列表中最高值的变量。当您插入/删除时,您将跟踪该值。
然后你的最大功能可以是O(1):
def max(): return max_value
这增加了插入/删除的工作,但满足了max()在恒定时间内运行的指定要求。