哈希算法(散列算法)
今天在做LeetCode的时候做到第三题,不包含重复字符的子字符串的最大长度,深刻意识到散列查找的快速性。
核心思想:用空间换时间
哈希算法的核心思想就是用空间复杂度来换取时间复杂度,简单来说,一般的查找都需要通过遍历整个数据结构来找到你所想要的值,而哈希算法先将你所想查找的关键字存储在特定的地方,你可以通过关键字直接找到他,而不需要去遍历整个数据。大部分哈希查找的时间复杂度都在是0(n)。
代码例子
这里直接贴两个简单的代码例子
第一个是最基础的TwoSum。
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
vector<int> rev;
map<int,int> m;
for(int i = 0;i<n;i++)
{
m[nums[i]] = i;
}
for(int i = 0;i<n;i++)
{
int t = target - nums[i];
if(m.count(t) && m[t] != i )
{
rev.push_back(i);
rev.push_back(m[t]);
break;
}
}
return rev;
}
可以看到这里用map容器建立了一个简单的哈希表。
第二个就是难住我的第三题了:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int rev = 0,left = 0;
int n = s.size();
int m[256] = {0};
for(int i = 0; i<n ; i++)
{
if(m[s[i]] == 0 || m[s[i]] < left)//当滑动窗口右端到达重复过的字母位置时需要判读重复的是否在窗口中。
{
rev= max(rev, i - left + 1);
}else {
left = m[s[i]];
}
m[s[i]] = i+1;
}
return rev;
}
};
简单很多,不过有点难理解,这里直接用数组建立一个简单的哈希表,形成了一个滑动窗口的检索字符串方式,正常暴力搜索下需要三次的时间复杂度才能完成。
c++中
c++中主要可以通过map和set容器进行哈希表的建立,原理是key-value的对应。
总结
这里只是哈希表的简单用法,链式构建哈希表的方法以后有机会再补上吧,很强大的数据结构,需要灵活运用。