Performance LinkedList与HashMap的摊销性能

Performance LinkedList与HashMap的摊销性能,performance,algorithm,data-structures,computer-science,Performance,Algorithm,Data Structures,Computer Science,对于大多数操作,哈希表的摊销性能通常被称为O1 在标准LinkedList实现上,搜索操作的摊销性能是多少?开着吗 我有点搞不清楚这是如何计算的,因为在最坏的情况下,假设一个哈希函数总是冲突,哈希表就相当于一个LinkedList,就搜索操作而言,假设一个标准的bucket实现 我知道在实践中,除非散列函数被破坏,否则这种情况永远不会发生。因此,在一系列操作中,平均性能几乎是恒定的,因为冲突很少发生。但在计算摊销最坏情况时,不应该考虑最坏情况下的最坏情况下的序列吗?< /P> < P>不存在摊销

对于大多数操作,哈希表的摊销性能通常被称为O1

在标准LinkedList实现上,搜索操作的摊销性能是多少?开着吗

我有点搞不清楚这是如何计算的,因为在最坏的情况下,假设一个哈希函数总是冲突,哈希表就相当于一个LinkedList,就搜索操作而言,假设一个标准的bucket实现


我知道在实践中,除非散列函数被破坏,否则这种情况永远不会发生。因此,在一系列操作中,平均性能几乎是恒定的,因为冲突很少发生。但在计算摊销最坏情况时,不应该考虑最坏情况下的最坏情况下的序列吗?< /P> < P>不存在摊销最坏情况的表现。摊销绩效是一种长期经营活动的平均绩效

对于哈希表,有时需要在长时间的插入序列之后调整哈希表的大小,这需要花费时间。但是,由于它只发生在每个插件上,所以该操作的成本分摊到所有插件上,以获得O1摊销时间


是的,在哈希函数损坏的最坏情况下,可以为每个操作打开哈希表。但是,分析这样一个哈希表是没有意义的,因为它不是典型用法的情况。

没有摊销的最坏情况性能。摊销绩效是一种长期经营活动的平均绩效

对于哈希表,有时需要在长时间的插入序列之后调整哈希表的大小,这需要花费时间。但是,由于它只发生在每个插件上,所以该操作的成本分摊到所有插件上,以获得O1摊销时间


是的,在哈希函数损坏的最坏情况下,可以为每个操作打开哈希表。但是,分析这样一个哈希表是没有意义的,因为它不是典型用法的情况。

最坏的情况有时取决于什么约束条件下的最坏情况

如果一个哈希表中有一个有效但愚蠢的哈希函数将所有键映射到0,那么这种情况通常不是一个有意义的最坏情况,也不是很有趣。因此,您可以在最小的假设下分析哈希表的平均性能,即出于实际目的,哈希函数将所有键的集合均匀地分布在所有哈希值的集合中

如果哈希函数是合理的,但不是密码安全的,则有一个单独的最坏的情况需要考虑。恶意或无意的用户可以系统地提供散列冲突的数据。对于最坏情况下的输入,您会得到不同的答案,而对于最坏情况下的假设输入,您会得到分布良好的散列

在一个给定的哈希表插入序列中,其中一个可能会引发重复。然后你会认为这是最坏的情况。这与整个输入数据几乎没有什么关系-如果负载系数足够高,您最终会重新加载,但很少。这就是为什么摊销运行时间是一个有趣的度量,只要您可以对n个操作的总成本设定一个更严格的上限,而不是一个操作的最严格上限的n倍

即使散列函数是加密安全的,您也可以忽略得到散列冲突的输入的可能性。这就是对所有可能的输入进行平均和对具有最坏情况输入的操作序列进行平均之间存在差异的地方。因此,“摊销”一词也带有小字体。根据我的经验,这通常意味着一系列操作的平均值,数据是好是坏的问题不属于摊销的一部分。nneonneo说,没有最坏情况下的摊销绩效,但根据我的经验,肯定有最坏情况下的摊销绩效。因此,这是值得精确的,因为这可能反映了我们每个人对这个术语的期望含义的不同


当哈希表出现O1分期插入时,它们意味着n次插入需要时间,或者a假设哈希函数没有发生病态错误,或者b假设随机输入,n次插入的预期时间。因为无论哪种方式,您都会得到相同的哈希表答案,所以很容易懒得说出您所说的是哪一个。

最坏情况有时取决于什么约束条件下的最坏情况

如果一个哈希表中有一个有效但愚蠢的哈希函数将所有键映射到0,那么这种情况通常不是一个有意义的最坏情况,也不是很有趣。因此,您可以在最小的假设下分析哈希表的平均性能,即出于实际目的,哈希函数将所有键的集合均匀地分布在所有哈希值的集合中

如果哈希函数 是合理的,但不是密码安全的,有一个单独的最坏的情况要考虑。恶意或无意的用户可以系统地提供散列冲突的数据。对于最坏情况下的输入,您会得到不同的答案,而对于最坏情况下的假设输入,您会得到分布良好的散列

在一个给定的哈希表插入序列中,其中一个可能会引发重复。然后你会认为这是最坏的情况。这与整个输入数据几乎没有什么关系-如果负载系数足够高,您最终会重新加载,但很少。这就是为什么摊销运行时间是一个有趣的度量,只要您可以对n个操作的总成本设定一个更严格的上限,而不是一个操作的最严格上限的n倍

即使散列函数是加密安全的,您也可以忽略得到散列冲突的输入的可能性。这就是对所有可能的输入进行平均和对具有最坏情况输入的操作序列进行平均之间存在差异的地方。因此,“摊销”一词也带有小字体。根据我的经验,这通常意味着一系列操作的平均值,数据是好是坏的问题不属于摊销的一部分。nneonneo说,没有最坏情况下的摊销绩效,但根据我的经验,肯定有最坏情况下的摊销绩效。因此,这是值得精确的,因为这可能反映了我们每个人对这个术语的期望含义的不同


当哈希表出现O1分期插入时,它们意味着n次插入需要时间,或者a假设哈希函数没有发生病态错误,或者b假设随机输入,n次插入的预期时间。因为无论哪种方式,哈希表都会得到相同的答案,所以很容易懒得说出您所说的是哪一个。

所以假设哈希冲突率较低,这就是平均性能?我认为在计算摊销成本时没有概率或假设。实际上,有概率,也有假设。这就是平均值的含义——平均值是一组隐含的可能性,其中最坏的情况只是一个。@kufudo:你将传入的键视为在一个范围内均匀分布的随机变量,因此你可以计算出放入插槽的元素的平均数。这是一个定义很好的概念,所以它是一个平均性能,假设哈希冲突率很低?我认为在计算摊销成本时没有概率或假设。实际上,有概率,也有假设。这就是平均值的含义——平均值是一组隐含的可能性,其中最坏的情况只是一个。@kufudo:你将传入的键视为在一个范围内均匀分布的随机变量,因此你可以计算出放入插槽的元素的平均数。这是一个非常明确的概念,我知道它们不是。但如果我实现自己的哈希表类,并使用一个哈希函数,该函数总是为每个键返回,比如说1,那么它基本上退化为一个LinkedList,假设我使用列表作为存储桶。实际上,这是愚蠢的,但对于特定的哈希函数实现,可能存在一组具有高冲突率的值。计算摊销成本时是否考虑了这一点?或者我们只是假设没有碰撞或者非常罕见。你不假设非常罕见的碰撞,你通常会假设两个键之间的碰撞率为1/bucket\u count。但是在任何一种严肃的工作中,你都会声明这个假设——仅仅说哈希表是O1而没有限定的表过于简化了情况。它们在几乎所有的实际应用中都是准确的。我知道它们不是。但如果我实现自己的哈希表类,并使用一个哈希函数,该函数总是为每个键返回,比如说1,那么它基本上退化为一个LinkedList,假设我使用列表作为存储桶。实际上,这是愚蠢的,但对于特定的哈希函数实现,可能存在一组具有高冲突率的值。计算摊销成本时是否考虑了这一点?或者我们只是假设没有碰撞或者非常罕见。你不假设非常罕见的碰撞,你通常会假设两个键之间的碰撞率为1/bucket\u count。但是在任何一种严肃的工作中,你都会声明这个假设——仅仅说哈希表是O1而没有限定的表过于简化了情况。它们在几乎所有的实际应用中都是准确的。我认为这会引起更多的混乱而不是澄清。通常情况下,最坏的情况就是你能想到的最坏的情况,而平均值意味着你对一个随机变量的期望值,这个随机变量模拟了你的跑步时间,周期。@akappa:大多数情况下,提问者都会问到摊销后的跑步时间,实际上是q
摊销通常指的不是这两种东西,而是其他东西的平均值。我认为讨论这一点是有必要的,除了考虑你提到的两件事之外,考虑其他事情并不罕见。YMMV.我认为这引起的混乱多于澄清。通常最坏的情况就是你能想到的最坏的情况,而平均值意味着你对一个随机变量的期望值,这个随机变量模拟了你的跑步时间,周期。@akappa:大多数情况下,提问者都会特别询问摊销的跑步时间,事实上,摊销很常见,指的不是这两种东西,而是其他东西的平均值。我认为讨论这一点是有必要的,除了考虑你提到的两件事之外,考虑其他事情并不罕见。YMMV。