微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

哈希表最适合解决以下哪个问题?

如何解决哈希表最适合解决以下哪个问题?

哈希表会是其中任何一个的好的解决方案吗?

确定工厂中的两个工人是否有相同的名字,假设我们得到一个未排序并包含他们姓名的列表。该列表将包含 n 个工人。

获取一个按顺序排列的列表,假设我们得到了一个未排序且包含所有工人姓名的列表。该列表将包含 n 个工人。

首先,我尝试使用最坏、最好和平均情况对这两个陈述进行推理。 对于第一个选项,我注意到我们可以有一个使用线性探测实现的哈希表。在这种情况下,我们将不得不遍历 worker 列表,将它们添加到我们的哈希表中,如果出现冲突,请立即停止迭代。这让我说最坏的情况是 O(n) 和平均情况,最好的情况是 O(1)。

对于第二个选项,我想不出一种方法来完成它,这导致我认为哈希表对这个问题没有意义。

因此,我得出的结论是,第一个问题可以使用哈希表解决,而其他问题则不然。这听起来对吗?

解决方法

我可以回答你问题的第一部分:

确定工厂中的两个工人是否有相同的名字, 假设我们得到一个未排序的列表并包含它们的 名称。该列表将包含 n 个工人。

是的,哈希表是这个问题的一个很好的解决方案。但是,您将需要一个好的散列函数。您可以使用 polynomial rolling hash function。这是有关哈希字符串的更多信息的链接。

https://cp-algorithms.com/string/string-hashing.html

散列的问题在于它需要的空间和检查散列冲突。我建议你遵循 Tony 在测试哈希函数的评论中给出的建议。

,

是的,你说得对。在这两种情况下,您在未排序的工作人员姓名列表中的输入,如果您的哈希函数模糊合理,您可以将其一个一个地插入到平均效率为 O(1) 的哈希表中。那么,哈希表可以合理支持哪些函数:

确定工厂中的两个工人是否有相同的名字

这在插入过程中很明显:您已经在哈希表中找到了名称。如果您只需要知道是否存在一种情况,您甚至不需要继续插入更多名称。

获取一个有序的列表

您无法按排序顺序遍历哈希表,因此您必须从哈希表中提取值。合理的选择包括将它们复制到一个数组中,然后就地排序,并将它们复制到一个平衡的二叉树中——这将使它们在插入时保持排序并重新平衡树。如果您打算使用数组或平衡二叉树,您还不如将名称直接插入到该容器中:哈希表步骤将是浪费时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。