📜  动态编程|通配符模式匹配|线性时间和恒定空间(1)

📅  最后修改于: 2023-12-03 15:22:47.065000             🧑  作者: Mango

动态编程、通配符模式匹配和线性时间和恒定空间

动态编程

动态编程是一种将问题分解成子问题来解决的算法技术。通常,这些子问题的解为每个子问题分别计算,最后合并得到整个问题的解。动态编程主要应用于背包问题、最短路径问题和最长公共子序列问题等。

动态编程运用了一种称为"记忆化"的技术,即在计算得到的答案后,将其存储起来,以供之后的计算使用。这样做可以消除重复计算,从而提高运算速度。

以下是一个简单的计算斐波那契数列的例子:

def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

上述实现方式存在重复计算,可以运用动态编程来进行优化。代码如下:

def fibonacci(n):
    memo = {}
    if n <= 1:
        return n
    elif n not in memo:
        memo[n] = fibonacci(n-1) + fibonacci(n-2)
    return memo[n]
通配符模式匹配

通配符模式匹配是指在字符串匹配时,用通配符来表示某些字符。通配符可以用在任何位置上,并且可以代表所有的可能字符。常用的通配符有 * 和 ?。

在实际应用中,这种模式匹配技术常用在搜索引擎、文件查找和群发邮件等场景中。

以下是一个使用通配符 * 的例子:

def match(str, pattern):
    if len(pattern) == 0:
        return len(str) == 0
    elif pattern[0] == '*':
        i = 0
        while i <= len(str):
            if match(str[i:], pattern[1:]):
                return True
            i += 1
        return False
    elif len(str) > 0 and (pattern[0] == '?' or pattern[0] == str[0]):
        return match(str[1:], pattern[1:])
    else:
        return False
线性时间和恒定空间

线性时间和恒定空间是指算法在执行时间复杂度和空间复杂度上都非常优秀的一种算法。其中,线性时间复杂度表示算法的时间复杂度与输入数据的长度成正比;恒定空间复杂度表示算法使用的空间与输入数据的长度无关。

以下是一个使用线性时间和恒定空间的例子:

def find_duplicate(nums):
    for num in nums:
        if nums[abs(num)] < 0:
            return abs(num)
        nums[abs(num)] *= -1

这段代码可以在O(n)时间和O(1)空间内找到数组中的重复数字。