算法导论 第一部分 基础知识
算法导论 第一部分 基础知识
引言
第一章 算法在计算中的作用
算法
简单来讲,所谓**算法(algorithm)**就是定义良好的计算过程,它取一个或一组值作为输入,并产生一个或一组值作为输出。亦即,算法就是一系列的计算步骤,用来将输入数据转换成输出结果。
算法也是一种工具,用来解决一个具有良好规格说明的计算问题。
有关该问题的表达可以用通用的语言,来规定所需要的输入/输出关系。与之对应的算法则描述了一个特定的计算过程,用于实现这一输入/输出关系
例如,假设需要将一列数按照非降序进行排序
算法可以解决哪些类型的问题?
数据结构
技术
一些比较难的问题
作为一种技术的算法
算法和其他技术
算法入门
插入排序
Python实现
class Solution(object):
def insertionSort(self,a_list):
for key,item in enumerate(a_list):
print(key,item)
index = key
while index > 0 and a_list[index-1] > item:
a_list[index] = a_list[index-1]
index -= 1
a_list[index] = item
return a_list
算法分析
插入排序算法的分析
最坏情况和平均情况分析
增长的量级
算法设计
分治法
有很多算法在结构上是递归的:
为了解决一个给定的问题,算法要一次或多次地递归调用其自身来解决相关子问题。这些算法通常采用分治策略:将原问题划分成 n 个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
Python实现
class Solution(object):
def mergeSort(self,a_list):
if len(a_list) > 1:
mid = len(a_list)//2
lefthalf = a_list[:mid]
righthalf = a_list[mid:]
self.mergeSort(lefthalf)
self.mergeSort(righthalf)
i,j,k = 0,0,0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
a_list[k] = lefthalf[i]
i += 1
else:
a_list[k] = righthalf[j]
j += 1
k += 1
while i < len(lefthalf):
a_list[k] = lefthalf[i]
i += 1
k += 1
while j < len(righthalf):
a_list[k] = righthalf[j]
j += 1
k += 1
return a_list
分治法分析
函数的增长
渐进记号
标准记号和常用函数
递归式
代换法
用代换法解递归式需要两个步骤:
1)猜测解的形式
2)用数学归纳法找出使解真正有效的常数
“代数法”这一名称源于当归纳假设用较小值时,用所猜测的值代替函数的解
此方法很有效 但是只能用于解的形式很容易猜的情形。
递归树方法
画出一个递归树是一种得到还猜测的直接方法。
在递归树中,每一个结点都代表递归函数调用集合中一个子问题的代价。我们将树中每一层内的代价相加得到一个没层代价的集合,再将每层的代价相加得到递归是所有层次的总代价。当用递归式表示分治算法的运行时间时,递归树的方法尤其有用。
主方法
主定理的证明
取正合幂时的证明
上取整数函数和下取整函数
概率分析和随机算法
雇用问题
最坏情况分析
概率分析
随机算法
指示器随机变量
利用指示器随机变量分析雇用问题
随进算法
随机排列数组
概率分析和指示器随机变量的进一步使用
生日悖论
球与盒子
序列
在线雇用问题