笔记:散列表/哈希表

地址计算

直接定址

Hash(key) = a*key +b;
不连续,关键字映射到存储单元
Hash(key)= key+1 0->-1 3->2 5->4;

除留取余 常用

Hash(key)=key%p;
选择P,减少冲突,选取P需要取一个不大于散列表长度但接近长度的质数

数字分析

有一个关键字集合

平方取中

适用于关键字每位取值不均匀或小于散列地址所需要的位数。

折叠法

5211252-->512+125+2=648

冲突处理

开放地址

Hi=(H(key)+di)%m,i=0,1,2...,k(k<=m-1); d增量

增量序列

线性探测

平方检测

  1. 字符串中的第一个唯一字符
    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
class Solution {
public:
    int firstUniqChar(string s) {
        unordered_map<int, int> frequency;
        for (char ch: s) {
            ++frequency[ch];
        }
        for (int i = 0; i < s.size(); ++i) {
            if (frequency[s[i]] == 1) {
                return i;
            }
        }
        return -1;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string/solution/zi-fu-chuan-zhong-de-di-yi-ge-wei-yi-zi-x9rok/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

做题的时候遇到简单题目不用unordered_map,unordered_set,用数组模拟哈希表也是ok的.
例如242. 有效的字母异位词

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for(int i =0;i<s.size();i++){
            record[s[i]-'a'] +=1;
        }
        for(int i=0;i<t.size();i++){
            record[t[i]-'a'] -=1;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) {
                // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        return true;
    }
};
posted @ 2020-12-23 14:03  melt00  阅读(75)  评论(0)    收藏  举报