这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战。
一个好玩又赚钱的同义词典
假设工作之余,你还一个人秘密研发着一款将要征服世界的软件。那是一个同义词典,它叫Quickasaurus。你相信它势必一鸣惊人,因为它只会返回一个最常用的同义词,而不是像其他词典那样,返回所有的同义词。
因为每个词都有一个同义词,所以正好作为散列表的用例。毕竟,散列表就是一堆成对的元素。下面我们马上来开发。
该词典可以用一个散列表来表示。
thesaurus={}
散列表可以看成是一行能够存储数据的格子,就像数组那样。每个格子都有对应的编号,如下所示。
现在往散列表里加入我们的第一条同义词。
thesaurus["bad"]="evil"
散列表变成了下面这样。
{"bad" => "evil"}
再看看散列表是如何存储数据的。
首先,计算机用散列函数对键进行计算。为了方便演示,这里我们依然使用之前提及的那个乘法函数。
BAD=2 * 1 * 4=8
"bad"的散列值为8,于是计算机将"evil"放到第8个格子里。
接着,我们再试另一对键值。
thesaurus["cab"]="taxi"
同样地,计算机要计算散列值。
CAB=3 * 1 * 2=6
因其结果为6,所以将"taxi"放到第6格。
再多加一对试试。
thesaurus["ace"]="star"
ACE的散列值为15(ACE=1×3×5=15),于是"star"被放到第15格。
现在,用代码来表示这个散列表的话,就是这样:
{"bad" => "evil", "cab" => "taxi", "ace" => "star"}
既然散列表词典建好了,那就来看看从里面查词时会发生什么吧。假设现在要查"bad"的同义词,写成代码的话,如下所示。
thesaurus["bad"]
收到命令后,计算机就会进行如下两步简单的操作。
(1)计算这个键的散列值:BAD=2×1×4=8。
(2)由于结果是8,因此去到第8格并返回其中的值。在本例中,该值为"evil"。
这下你应该明白为什么从散列表里读取数据只需要了吧,因为其过程所花的时间是恒定的。它总是先计算出键的散列值,然后根据散列值跳到对应的格子去。
现在总算理解为什么我们的快餐店菜单用散列表会比用数组要快了。当要查询某种食物的价格时,如果是用数组,那么就得一个格子一个格子地去找,直至找到为止。无序数组需要,有序数组需要
。但用散列表的话,我们就能够以食物作为键来做
的查找。这就是散列表的好处。