Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在恒定时间内获得N个计数器中的最大值?_Performance_Algorithm_Language Agnostic - Fatal编程技术网

Performance 如何在恒定时间内获得N个计数器中的最大值?

Performance 如何在恒定时间内获得N个计数器中的最大值?,performance,algorithm,language-agnostic,Performance,Algorithm,Language Agnostic,我们有N整数计数器,最初显示为0。操作: int getMax()-返回计数器显示的最高值。 void increment(int i)-递增计数器i的值 void zero()-为所有计数器设置零值。可供选择的名称是flood(),也许这个名称会对您有所帮助 介绍这些操作的实现和底层数据结构,知道我们希望这些操作尽可能快 这是我的面试问题。有一个小机会,我说了一些小错误,因为我缺乏记忆,但我尽力了。也许这与一些众所周知的问题相似?(我希望如此。) 就我所记得的,所有的操作都可以在O(1)中完

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

int getMax()
-返回计数器显示的最高值。
void increment(int i)
-递增计数器
i的值

void zero()
-为所有计数器设置零值。可供选择的名称是
flood()
,也许这个名称会对您有所帮助

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


这是我的面试问题。有一个小机会,我说了一些小错误,因为我缺乏记忆,但我尽力了。也许这与一些众所周知的问题相似?(我希望如此。)


就我所记得的,所有的操作都可以在O(1)中完成。。。其中一个操作是“惰性的”(可能是
增量
)。。。i、 e.在一次调用中,它什么也没做,但后来当用户使用
getMax()
请求值时,它成功了。

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

增加:

  • 如果该元素的版本小于全局值,只需将其值设置为1。否则增加它
  • 如果大于全局最大值,请将全局最大值设置为其值
  • 适当设置其版本(到当前时间)
要获得最大值,请执行以下操作:

  • 只需返回全局最大值
要重置:

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

所有操作:O(1)。

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

增加:

  • 如果该元素的版本小于全局值,只需将其值设置为1。否则增加它
  • 如果大于全局最大值,请将全局最大值设置为其值
  • 适当设置其版本(到当前时间)
要获得最大值,请执行以下操作:

  • 只需返回全局最大值
要重置:

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

所有操作:O(1)。

初始化时间戳需要O(n)启动成本。实际上,使用更复杂的方法,甚至可以将此成本更改为O(1)。(我相信CPython在布景中使用了这个技巧)@Dukeling太好了,谢谢!就是这样。你从哪里知道的?@AdamStelmaszczyk我不能百分之百地肯定是诚实的。我可能记得它(或类似的东西)从一段时间以前,或只是想出来了。O(1)reset all counters(重置所有计数器)明确指出存在某种版本控制-从那里很容易理解。@Dukeling:你能解释一下为什么需要时间戳和全局上次重置verson吗?@急切地想“我们上次更改此值是在上次重置之前还是之后?”。对于时间戳,这很简单,只需比较两个时间戳即可。如果没有时间戳,这将是一个很难回答的问题,除非我们在重置期间更新每个值,这将导致它采用O(n)而不是O(1)。初始化时间戳需要O(n)启动成本。实际上,使用更复杂的方法,甚至可以将此成本更改为O(1)。(我相信CPython在布景中使用了这个技巧)@Dukeling太好了,谢谢!就是这样。你从哪里知道的?@AdamStelmaszczyk我不能百分之百地肯定是诚实的。我可能记得它(或类似的东西)从一段时间以前,或只是想出来了。O(1)reset all counters(重置所有计数器)明确指出存在某种版本控制-从那里很容易理解。@Dukeling:你能解释一下为什么需要时间戳和全局上次重置verson吗?@急切地想“我们上次更改此值是在上次重置之前还是之后?”。对于时间戳,这很简单,只需比较两个时间戳即可。如果没有时间戳,这将是一个很难回答的问题,除非我们在重置期间更新每个值,这将导致它采用O(n)而不是O(1)。