【问题标题】:How to get maximum value among N counters in constant time?如何在恒定时间内获得 N 个计数器中的最大值?
【发布时间】:2014-01-15 18:47:04
【问题描述】:

我们有N 整数计数器,最初显示为 0。操作:

int getMax() - 返回计数器显示的最大值。
void increment(int i) - 增加计数器 i 的值。
void zero() - 为所有计数器设置零值。备用名称是flood(),也许这个名称会对您有所帮助。

这些操作和底层数据结构的当前实现,知道我们希望这些操作尽可能快。


这是我的面试问题。由于我的记忆力不足,我说的有点错误的可能性很小,但我尽力了。也许它类似于一些众所周知的问题? (我希望。)

据我所知,所有操作都可以在 O(1) 中完成...其中一个操作是“懒惰的”(可能是 increment)...什么都不做,但后来当用户使用getMax() 请求价值时 - 它起作用了。

【问题讨论】:

    标签: performance algorithm language-agnostic


    【解决方案1】:

    这可以通过一个大小为 N 的数组来完成,其中每个元素由 2 个数字组成 - 当前值和一个版本(例如时间戳)。而且您还需要一个全局上次重置(归零)版本和一个全局最大值。

    递增:

    • 如果该元素的版本低于全局,只需将其值设置为 1。否则递增它。
    • 如果大于全局最大值,请将全局最大值设置为其值。
    • 适当地设置其版本(到当前时间)。

    获取最大值:

    • 只需返回全局最大值。

    重置:

    • 只需将全局上次重置版本(设置为当前时间)并将全局最大值设置为 0。

    所有操作:O(1)。

    【讨论】:

    • 初始化时间戳的启动成本为 O(n)。实际上,甚至可以使用更复杂的approach 将这个成本更改为 O(1)。 (我相信 CPython 在它的集合中使用了这个技巧)
    • @Dukeling 太好了,谢谢!就是这样。你从哪里知道的?
    • @AdamStelmaszczyk 我不能 100% 说实话。我可能从前一段时间就记得它(或类似的东西),或者现在才想出来。 O(1) 重置所有计数器肯定指向有某种版本控制 - 从那里很容易弄清楚。
    • @Dukeling:你能解释一下为什么需要时间戳和全局上次重置版本吗?
    • @eagertoLearn 思考“我们最后一次更改此值是在上次重置之前还是之后?”。使用时间戳,这很容易,只需比较两个时间戳即可。如果没有时间戳,这将是一个难以回答的问题,除非我们在重置期间更新每个值,这将导致它采用 O(n) 而不是 O(1)。
    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多