Algorithm 将字符串插入哈希表的运行时是什么?

Algorithm 将字符串插入哈希表的运行时是什么?,algorithm,data-structures,hash,big-o,hashtable,Algorithm,Data Structures,Hash,Big O,Hashtable,我认为插入哈希表是平均情况O(1)和最坏情况O(n)。因此,如果我们循环遍历一个字符串并将每个单词添加到一个哈希表中(该哈希表将单词映射到它在字符串中出现的次数),这不是最坏的O(n^2)运行时情况吗?我以前试着问过这个问题,但答案说这是最坏的情况O(n)。谢谢 您是对的,在合理的假设下,哈希表将在O(1)平均时间和O(n)最坏情况下插入元素 至于您的问题,假设字符串中有n个单词,您必须迭代每个单词并将其输入哈希表,这将花费O(n)个平均时间或O(n^2)个最坏情况时间。插入的最坏情况取决于插入

我认为插入哈希表是平均情况O(1)和最坏情况O(n)。因此,如果我们循环遍历一个字符串并将每个单词添加到一个哈希表中(该哈希表将单词映射到它在字符串中出现的次数),这不是最坏的O(n^2)运行时情况吗?我以前试着问过这个问题,但答案说这是最坏的情况O(n)。谢谢

您是对的,在合理的假设下,哈希表将在O(1)平均时间和O(n)最坏情况下插入元素


至于您的问题,假设字符串中有n个单词,您必须迭代每个单词并将其输入哈希表,这将花费O(n)个平均时间或O(n^2)个最坏情况时间。

插入的最坏情况取决于插入函数的实现如何处理冲突和解析技术。这将对put()和get()操作产生更大的影响。冲突解决技术在每个库中的实现方式不同。其核心思想是将所有碰撞的关键点保持在同一个桶中。在检索过程中,遍历所有冲突的键,并应用一些相等性检查来检索给定的键。需要注意的重要一点是,我们需要在bucket中同时维护“key”和“value”,以便进行上述等式检查

另一个要考虑的是,在插入操作期间,将为给定的密钥生成哈希代码。我们可以认为这对于每个键都是常数O(1)。< /P> 在最坏的情况下,所有键都可能落在同一个存储桶中,因此对于1 get(),O(n)。但是对于put()操作,无论发生碰撞,它始终是常量O(1)

保持碰撞列表是一个关键因素。一些实现​s使用的是BST而不是链表。因此,对于插入和检索,最坏的情况是O(logn)

无论如何,O(N logn)可以是插入N个元素而不是O(N^2)的运行时。

任何合适的实现都必须确保生成的对象的冲突哈希代码最小,以获得更好的性能。

将字符串插入哈希表需要
O(| s |)
平均时间,其中
|s |
是字符串的长度。这就是计算散列的成本,即使您缓存每个字符串的散列并将其成本分摊到大量插入中,您仍然需要支付
O(| s |)
才能发现您刚刚查找的字符串就是表中的字符串(通过比较每个字符)。因此,如果字符串只有一个字符,则只有O(1),在这种情况下,哈希表可能会被忽略。