哈希表常用数据结构:数组

        我们在学算法中会经常听到哈希表这个词,那这个哈希表到底是何方神圣呢?是不是很难呢?其是不然,哈希表就是一个表,又叫一个散列表,在很多情况下它可能就是一个数组或者set,map.那么这个表到底有什么呢?它的作用其是就一个:给定一个元素去一堆数据中去找,判断这一堆数据里有没有这个元素,仅此而已.那这个又用我们一般的查找元素有什么区别吗?有,哈希表会牺牲一部分的内存来换取更高的查找效率.

        下面我来举一个例子:van在新日暮里开了一间杂货铺共有商品1000件,且每件的价格都不一样,在有客人买东西的时候,van就需要根据商品的名字来找到对应的价格,但这样对着1000件商品来一一查找效率实在是太低了,在计算机里的时间复杂是O(n),那有没有一种更快的方法呢?有我们可以使用今天的主角-----数组.那为什么是数组呢?若我们能把这些商品名一一改成数组的下标索引,价格为对应的值,然后直接根据这个下标索引去数组里找对应的价格,这样时间复杂度O(1)比O(n)要快不少呢!!!而且总共就1000件商品,也就是在计算机里开辟一个长为1000的数组这是可以接受的.这样我们就可以花费我们可以接受的内存代价来获得更快的查找效率,在客人问商品价格的时候van就可以立刻告诉客人它的价格,也不至于在那里埋头苦找,等找到了,客人说不定就走了.

        通过上面这个例子我们认识了数组在哈希表中的使用情况.在我们遇到需要在一堆数据查找一个元素是否存在我们首先就应该想到使用哈希表,同时若那一堆数据较为容易映射为数组的下标,且映射的数组的大小是可以接受的(你可别开辟一个千万级别的数组啊!!!)我们就可以使用数组来作为我们的哈希表,下面我再来举一个算法题来进一步说明什么时候使用数组作为哈希表

        给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(只包含小写字母)。(意思是组成t与s的小写字母的种类和每个字母的数量是一样的),例:"rat"和"car".

        这题就是数组作为哈希表的一个很好的例子.由于都是小写字母,我们遍历t或者s得到每个字母只能是a~z,这些字母的ASCLL码值是连续的,这些连续ASCLL值很容易我让我们相当这跟数组连续的索引,但数组的索引是从0开始的,ASCLL码可不是啊.对此我们可以遍历字符串s,将每一个得到字符都-'a',这样每个字符所得到结果就都在[0,25]的范围内,接下我们就只需要创建一个长为26的数组,0索引代表字母a,1代表字母b........然后索引所对应元素为该字母出现的次数,这样就完成了哈希表的映射了.

        接下来我们在遍历t做减减操作,最后判断数组的所有元素是否都为0,不都为就是false,都为就是true.具体代码如下(C++的):

        在我们使用哈希表时,最为重要的就是如何把那一堆目标数据一一映射到我们的表上,选择数组作为被映射的哈希表时就要考虑,所映射的数组内存是否可以接受?是否容易将这些数据一一通过某种关系转为数组的下标索引?若以上都能满足那我们就可以使用数组来作为哈希表.

        接下我还会更新在什么时候使用set和map来做哈希表.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值