书山有路之学习算法导论(一)--基础知识

这个寒假打算学习算法导论这本书,每学完一部分我都尽量更新,希望在寒假结束时有一些收获!

书山有路勤为径,加油!

一、基础知识

1.算法在计算中的作用

算法其实就是任何良定义的计算过程,算法把给定的输入通过规定的计算步骤运算转换为输出。

数据结构是一种存储和组织数据的方式,为了使程序访问修改更加便利。

算法应该被作为一种技术,巧妙设计与合理使用算法将可以在空间和时间上降低复杂度,将可以有效地使用计算机的计算资源与存储空间。

2.算法基础

2.1 插入排序

以插入排序开始我们的算法之路。(我只会介绍算法的使用,具体复杂度分析暂不讨论)

对于少量元素的排序,插入排序是一个有效的算法。其算法的核心思想就是,首先将待排序的数组分为两类,一类是已排好序的部分,一类是暂时未排序的部分,初始状态下,已排序部分为空,未排序部分就是整个数组。接下来,每次取未排序部分的第一个元素,并从已排序部分找到合适的位置将这个元素插入,这个位置使得元素插入后已排序部分仍然有序。重复此过程,直至未排序部分为空,那么整个数组将完成排序。

对数组A[1,..,n]进行插入排序的算法如下(后续的算法均以类似C/C++风格的伪码给出):

INSERTION-SORT(A)
for(j=2;j<=A.length;j++){
    key=A[j];
    i=j-1;   //将A[j]插入到有序数组A[1,..,j-1]中,从小到大排列
    while(i>0 && A[i]>key){
        A[i+1]=A[i];
        i=i-1;
    }
    A[i+1]=key;
}

书中使用循环不变式证明算法的正确性,我将不会给出具体的证明过程,只来简要介绍一下循环不变式。

循环不变式必须证明三条性质:

初始化:循环的第一次迭代之前,它为真,即符合输出的目标要求。

保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍未真。

终止:在循环终止时,不变式提供了一个有用的性质,该性质有助于证明算法是正确的。

其实这类似于数学归纳法,需要证明基本情况与归纳步骤的正确性,不同之处在于循环不变式必须终止,终止的时候即停止归纳并且可以证明算法的正确性。

2.2 分析算法

分析算法的过程主要集中于求最坏情况运行时间,因为最坏情况运行时间给出了任何输入的运行时间的一个上界。

更简化的抽象一下,我们真正感兴趣的是运行时间的增长率,当输入规模n很大时,我们只考虑低阶项与系数就不重要了,于是可以记插入排序的最坏情况运行时间为Θ(n^2)。

如果一个算法的最坏情况运行时间具有比另一个算法更低的增长量级,那么通常认为前者比后者更有效。

2.3 设计算法

许多有用的算法在结构上是递归的,这些算法典型地遵循分治法的思想:

将原问题分解为规模较小的但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。

分治模式在每层递归时都有三个步骤:

分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。

解决这些子问题,递归的求解各子问题。然而,若子问题的规模足够小,则直接求解。

合并这些子问题的解完成原问题的解。

以归并算法为例来说明分治法的思想:

分解:将待排序的n个元素分成各具n/2个元素的两个子序列

解决:使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值