哈希算法(散列算法)简单运用

本文深入探讨了哈希算法(散列算法)的核心思想及应用,通过实例解析如何利用哈希表提高查找效率,实现不包含重复字符的子字符串最大长度问题的高效解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈希算法(散列算法)

今天在做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的对应。

总结

这里只是哈希表的简单用法,链式构建哈希表的方法以后有机会再补上吧,很强大的数据结构,需要灵活运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值