算法基础:分治模式,归并排序ΘΘΘΘΘΘ知识小结

  1. 
    

    1.分治模式在每层递归时都有三个步骤:分解,解决,合并

  2. 2.归并排序算法完全遵循分治模式
  3. 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列
  4. 解决:使用归并排序递归的排序两个子序列
  5. 合并:合并两个已排序的子序列以产生已排序的答案
  6. 3.分析分治算法所需要的时间计算:
  7. 假设T(n)是规模为n的一个问题的运行时间,若问题足够小,如对某个常量c,n≦c,则直接求解需要常量时将,我们将其写作Θ(1).假设吧原问题分解成a个子问题,每个子问题的规模是原问题的1/b(对归并排序,a和b都为2,然而,我们将看到在许多分治算法中a≠b)为了求解一个规模为n/b的子问题,需要T(n/b)的时间,所以需要aT(n/b)的时间n来求解a个子问题,如果分解问题成子问题需要时间D(n),合并子问题的解成原问题的解需要时间C(n) 那么得到递归式:
  8. T(n)={Θ(1) 若,n≦c
  9. aT(n/b)+D(n)+C(n)    其他
  10. 4.归并排序算法

  分析建立归并排序n个数的最坏情况运行时间T(n)的递归式,归并排序的一个元素需要常量时间,当有n>1

我们元素分解运行时间如下:

    分解:分解步骤仅仅计算子数组的中间位置,需要常量时间,因此D(n)=Θ(1)

    解决:我们递归的求解两个规模均为n/2的子问题,将贡献2T(n/2)的运行时间

   合并:我们已经注意到在一个具有n个元素的字数组上过程MERGE需要Θ(n)的时间,所以C(n)=Θ(n)

当分析归并排序而把函数D(n) 与C(n)相加时,我们是在吧一个Θ(n)函数与另一个Θ(1)函数相加,相加的和是n的一个线性函数,即Θ(n),把它与来自“解决”步骤的2T(n/2)相加,

将给出归并排序的最坏情况运行时间T(n)的递归式

Θ(1)    
            若n=1

T(n)={   2T(n/2)+Θ(n)
  若n>1

在第4章,我们将看到“主定理” ,可以用改定理来证明T(n)为Θ(nlgn),其中lgn代表㏒2n,因为对数函数比任何线性函数增长要慢,所以对足够大的输入,在最坏的情况下运行实际为Θ(nlgn)的归并排序将优于运行时间为Θ(n2)的插入排序

重写归并排序算法:

              c                      若n=1

T(n)={   2T(n/2)+cn     若n>1

(常量c代表求解规模为1的问题所需的时间以及在分解步骤与合并步骤处理每个数组元素所需的时间)

 
      

lgn
+1 代表层,cn 为每层贡献总代价

 cnlgn
+ cn=cn(lgn +1)  忽略低阶项和常量c便给出了期望的结果 Θ(nlgn)                                                                                                                                  

时间: 2024-10-13 00:56:31

算法基础:分治模式,归并排序ΘΘΘΘΘΘ知识小结的相关文章

算法基础-归并排序

一.前提知识(分治思想) 将原问题分解为几个规模较小但类似与原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治模式在每层递归时都有三个步骤: 1.分解原问题为若干子问题,这些子问题是原问题的规模较小的实例. 2.解决这些子问题,递归地求解各子问题.当子问题的规模足够小的时候,则直接求解. 3.合并这些子问题的解成原问题的解. 二.归并排序算法 思想:分治的思想. 归并的步骤包括拆分和合并,其中合并是主要的步骤. 1.拆分过程 例如我们要排序的数组是 int a

awk基础知识小结(1)

1.使用规则 awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计. awk  的语法较为常见.它借鉴了某些语言的一些精华部分,如C 语言.python 和 bash. 第一个 awk 让我们继续,开始使用 awk,以了解其工作原理.在命令行中输入以下命令: $ awk '{ print }'  /etc/passwd 您将会见到 /etc/passwd 文件的内容出现在眼前.现在,解释 awk 做了些什么.调用 awk 时,我们指定  /etc/passwd

算法——基础知识

算法--基础知识 1.什么是算法? 答:算法(Algorithm):一个计算过程,解决问题的方法. 程序 =  数据结构 + 算法 2.时间复杂度(三连图) 时间复杂度小结: 1.时间复杂度是用来估计算法运行时间的一个式子(单位). 2.一般来说,时间复杂度高的算法比复杂度低的算法慢 3.常见的时间复杂度(按效率排序) -  O(1)  < O(logn) <O(n) < O(nlogn) <O(n2) <(n2logn) <O(n3) 4.不常见的时间复杂度 O(n!

分治算法的完美使用----归并排序

归并排序(Merge Sort)算法完全依照了分治模式 分解:将 n 个元素分成各含 n/2 个元素的子序列: 解决:对两个子序列递归地排序: 合并:合并两个已排序地子序列以得到排序结果:和快速排序不同的是 归并的划分比较随意,快排重点就是划分 归并的重点就是合并,快排不需要合并 代码: import java.util.Arrays; public class MergeSort { public static void main(String[] args) { int arr[] = ne

awk基础知识小结(2)

10.循环结构循环结构awk 的 while 循环结构,它等同于相应的 C 语言 while 循环.awk 还有 "do...while" 循环,它在代码块结尾处对条件求值,而不象标准 while 循环那样在开始处求值.它类似于其它语言中的 "repeat...until" 循环.示例:do...while 示例 {     count=1     do {    print "I get printed at least once no matter w

算法基础之四(归并排序)

归并排序算法是一种建立在分治法思想之上的排序算法,分治分治可以简单的理解为"分而治之",核心思想就是将复杂的问题分为若干个子问题,使这些子问题都是原问题的规模较小的实例:然后解决这些较简单的子问题,最后将结果合并,从而得到最开始那个复杂的问题的答案. 归并排序的思想也是如此,步骤如下: 一.将一个数组拆分为两个部分,一般取数组长度一般的位置为界,分为两个子数组,再分别对这两个子数组进行递归归并排序 二.我们确信在进行完递归排序之后,原两数组都会分别变为各自排好序的两个数组,于是接下来我

递归分治算法(一)-归并排序算法

前言: 分治法是一种算法设计思想,所谓分治,意为分而治之,是指将一个难以直接解决的大问题,递归的分割成一些规模的较小的问题,以便逐个解决.采用分治法设计的算法通常用到递归算法来实现,故标题为递归分治. 归并排序算法 归并就是将两个或两个以上的有序表合并成一个新的有序表.归并排序就是将无序的待排序的序列分解成若干个有序的子序列,并把有序子序列合并为整体有序序列的过程.一般分为2-路归并排序和多路归并排序. 他的大概流程如下图: 我们来看看java代码怎么写的: package guibing; /

[算法学习笔记]算法基础知识

算法基础知识 算法的五大要素 有穷性:算法必须能够在有限个步骤内完成. 确定性:算法的每一步必须有确定的定义. 输入 输出 可行性:算法的每个步骤都必须能分解为基本的可执行操作,每个步骤都必须能在有限时间内完成 循环不变式 循环中的循环不变式可以帮助我们理解算法的正确性.为了证明算法的正确,必须证明循环不变式的三个性质: 1. 初始化:循环不变式在循环开始之前是正确的. 2. 保持:循环不变式在循环的每一次迭代开始之前是正确的. 3. 终止:在循环结束时,不变式会给出一个可以对判断算法是否正确有

javascript之正则表达式基础知识小结

javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料. 元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要用“\”来进行转移. 如果记不清楚那些标点符号需要转移,可以在使用标点符号时都使用反斜杠“\” 简单匹配 1.直接量 /javascript/ 匹配带有“javascript”的字符串 比如“javascript is an object-oriented scripting language” 2.[