将哈希表用作集合的一般目的是什么?

时间:2011-02-17 16:43:17

标签: java hashtable

  

可能重复:
  What exactly are hashtables?

我理解使用哈希函数安全存储密码的目的。我已经使用数组和arraylists进行类项目排序和搜索数据。我无法理解的是哈希表在排序和搜索等方面的实用价值。

我接受了关于哈希表的讲座,但我们从未在学校使用它们,所以它没有点击。有人能给我一个哈希表有用的任务的实际例子吗?用数字数组或arraylist无法做到这一点?此外,哈希函数的一个非常简单的低级示例将是有用的。

4 个答案:

答案 0 :(得分:2)

那里有各种各样的藏品。集合用于存储和检索事物,因此集合中最重要的属性之一是这些操作的速度。为了估计“牢度”,计算机科学中的人使用big-O表示法,这意味着你需要完成多少个人操作来调用某种方法(例如,获取或设置)。因此,例如,通过索引获取ArrayList的元素,您只需要1个操作,这是O(1),如果你有一个长度为n的LinkedList,你需要从中间得到一些东西,你将不得不遍历从列表的开头到中间,进行n / 2次操作,在这种情况下得到的复杂度为O(n)。像hastable一样,键值商店也是如此。有些实现可以为您提供O(log n)的复杂性,以便通过其键获取值,而在O(1)中使用hastable copes。基本上它意味着通过密钥从哈希表中获取值非常便宜。

答案 1 :(得分:1)

很简单。哈希表通常被称为“关联数组”。数组允许通过索引访问您的数据。哈希表允许通过任何其他标识符访问您的数据,例如名称。例如 一个与1相关联 两个与2相关联。

所以,当你得到单词“one”时,你可以使用hastable找到它的值1,其中key为1,值为1. Array只允许相反的映射。

答案 2 :(得分:1)

基本上,哈希表具有类似的性能特征(廉价查找,廉价附加(对于数组 - 哈希表是无序的,添加到它们是便宜的,部分是因为这个)作为具有数字索引的数组,但是就什么而言更加灵活如果内存连续不断,每个项目的大小固定,你可以非常轻松便宜地获得n项的地址。这要归功于索引是整数 - 你不能这样做至少不是直接的.Hashes允许将任何对象(实现它)减少到一个数字,然后你又回到数组。你仍然需要添加哈希冲突的检查并解决它们(主要是一个内存)开销,因为你需要存储原始值),但实际上有一个不错的实现,这不是一个问题。

因此,您现在可以将任何(可散列)对象与任何(实际上任何)值相关联。这有无数的用途(虽然我不得不承认,我想不出一个适用于排序或搜索的)。您可以构建具有较小开销的缓存(因为检查缓存在给定的情况下是否有帮助是O(1)),实现相对高性能的对象系统(多个动态语言执行此操作),您可以查看{{1以您喜欢的任何方式配对和累积相同(id, value) s的值,以及许多其他内容。

答案 3 :(得分:0)

对于n个数据元素:

Hashtables允许O(k)(通常仅依赖于散列函数)搜索。对于二进制搜索,这比O(log n)更好(在n log n排序之后,如果数据没有排序,你的情况会更糟)

然而,另一方面,散列表往往占用大约3n的空间。