美文网首页
经典算法思想1-分治算法

经典算法思想1-分治算法

作者: 新欣enjoy | 来源:发表于2021-04-24 16:39 被阅读0次

分而治之,分治算法(divide and conquer),是计算机科学中非常重要的算法之一。该算法的核心思想可概括为,分解与合并。即把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

可采用分治算法解答的问题的基本特征

  • 该问题缩小到一定规模能够容易的解决
  • 该问题可以分解为若干个规模相同的子问题,即具有最优子结构性质
  • 计算得到的子问题的解可以合并
  • 该问题分解出的各个子问题相互独立

以上性质中,以第四条最为关键。否则可以采用贪婪算法或动态规划算法完成。

由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

分治算法实例

归并排序算法

def merge_sort(alist):
    if len(alist)<=1:
        return alist

    mid=len(alist)//2
    left=merge_sort(alist[:mid])
    right=merge_sort(alist[mid:])

    return merge(left,right)

## 需要另开一个列表存储已排序的序列
def merge(left,right):
    l,r=0,0
    s=[]
    while l<len(left) and r<len(right):
        if left[l] < right[r]:
            s.append(left[l])
            l += 1
        else:
            s.append(right[r])
            r += 1

    ## 将一个列表合并到已有列表,应当使用extend(比+代价更小)。append只是增加一个元素。
    s.extend(left[l:]) if l<len(left)
    s.extend(right[r:]) if r<len(right)

    return s

查找最长公共前缀字符串
https://leetcode-cn.com/problems/longest-common-prefix/

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        def lcp(start, end):
            if start == end:
                return strs[start]

            mid = (start + end) // 2
            lcpLeft, lcpRight = lcp(start, mid), lcp(mid + 1, end)
            minLength = min(len(lcpLeft), len(lcpRight))
            for i in range(minLength):
                if lcpLeft[i] != lcpRight[i]:
                    return lcpLeft[:i]

            return lcpLeft[:minLength]

        return "" if not strs else lcp(0, len(strs) - 1)


参考

https://www.cnblogs.com/xsyfl/p/6921687.html

相关文章

  • 经典算法思想1-分治算法

    分而治之,分治算法(divide and conquer),是计算机科学中非常重要的算法之一。该算法的核心思想可概...

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

  • Leetcode-Java(二十五)

    241. Different Ways to Add Parentheses 采用分治算法,分治算法的基本思想是将...

  • 归并排序

    阅读经典——《算法导论》02 不同算法中往往蕴含着通用的思想,分治法就是最常用的一种。 分治法使用递归的方式,将原...

  • 算法导论第2.3章 - 分治算法

    分治算法 递归:算法一次或多次递归地调用其自身已解决紧密相关的若干子问题。这些算法遵循分治法的思想。 分治算法三个...

  • 算法思想 - 分治算法

    其实相比于分治算法,我更愿意称之为分治“思想”。因为这种思想的应用非常广泛,不仅是在计算机中,在生活中到处都是分治...

  • 12 基本排序算法:归并排序

    归并排序 原理 归并排序思想 该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(d...

  • 09《算法入门教程》分治算法

    1. 前言 本节内容是分治算法系列之一:分治算法的介绍,主要介绍了分治算法的定义及基本思想和实现策略,然后我们介绍...

  • 呕心之作,一篇博客带你精通五大核心算法

    目录 一、分治法 思想原理 具体步骤 例题1 算法结语 二、动态规划算法 思想原理 具体步骤 算法实现 算法结语 ...

  • 分治算法思想

    分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个...

网友评论

      本文标题:经典算法思想1-分治算法

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