美文网首页
算法学习的必要性

算法学习的必要性

作者: 钢笔先生 | 来源:发表于2019-08-06 16:15 被阅读0次

Time: 2019-08-06

为什么考察算法?

  • 算法可以看出候选者够不够聪明
  • 实现算法问题,可以控制时间
  • 算法问题不能通过背答案蒙混过关
  • 算法能力强则工作能力也强

Rabin-Karp算法

面试中不要学习KMP算法,KMP是非常针对性的算法,且很难理解和实现,替代性的算法就是:Rabin-Karp算法。

strStr(): 寻找字符串匹配问题

一种自然的写法:

class Solution:
    def strStr(self, source: str, target: str) -> int:
        if source == None or target == None:
            return -1
        if len(target) == 0:
            return 0
        
        for i in range(len(source) - len(target) + 1):
            j = 0
            for j in range(len(target)):
                if source[i + j] != target[j]:
                    break # 当前内层循环判定不可能相等
            # 加source[i + j] == target[j]的原因是,有可能target就1个字符
            if j == len(target) - 1 and source[i + j] == target[j]:
                return i
        return -1

时空复杂度分析

时间复杂度:O((n-m)*m)
空间复杂度:O(1)

Rabin-Karp算法

哈希表法,将任意给定的Key变成整数。

将内层循环O(m)变成O(1)的时间复杂度,用哈希表。

class Solution:
    def strStr(self, source: str, target: str) -> int:
        if source == None or target == None:
            return -1
        if len(target) == 0:
            return 0
        
        for i in range(len(source) - len(target) + 1):
            # 内层循环比较时可以优化
            if hash(source[i:i+len(target)]) == hash(target):
                return i   
        return -1

哈希法有个问题是,Key-->Value并不保证唯一对应,所以可以需要Double Check.

在哈希值相等时再做O(m)复杂度的检查。

所以下面这种写法是更健壮的:

class Solution:
    def strStr(self, source: str, target: str) -> int:
        if source == None or target == None:
            return -1
        if len(target) == 0:
            return 0
        
        for i in range(len(source) - len(target) + 1):
            # 内层循环比较时可以优化
            if hash(source[i:i+len(target)]) == hash(target):
                if source[i:i+len(target)] == target:
                    return i 
                else:
                    break
        return -1 

END.
时间复杂度: O(n+m)。

这里用到的哈希函数是Python自带的,不是自己实现的。

相关文章

网友评论

      本文标题:算法学习的必要性

      本文链接:https://www.haomeiwen.com/subject/fltwdctx.html