高级算法日记7:专题
来源:互联网 发布:java枚举单例模式 编辑:程序博客网 时间:2024/05/22 01:46
专题
作者:相国大人
联系:sunxiangguodut@qq.com
版权所有,禁止转载
- 专题
- 专题一时间复杂度分析
- 1 普通复杂度函数的增长
- 2 递归与分治的复杂度主定理
- 专题二求解迷宫问题
- 专题三分治法深入
- 1 二元搜索问题
- 2 both max and min
- 3 dominating numbers
- 4 max sum two
- 专题四线性规划
- 专题五贪心算法
- 专题六中位数和顺序统计量
- 专题七散列表
- 专题八红黑树
- 专题九斐波那契堆wenti
- 专题十van Emde Boas树
- 专题十一 网络流
- 专题十二字符串问题
- 专题十三外排序
- 专题一时间复杂度分析
1. 专题一:时间复杂度分析
1.1 普通复杂度:函数的增长
1.2 递归与分治的复杂度:主定理
主定理:
对于
- 若对于某个常数
ε>0 ,有f(n)=O(nlogba−ε) ,则T(n)=Θ(nlogba) - 若
f(n)=Θ(nlogba) ,则T(n)=Θ(nlogbalgn)=Θ(f(n)lgn) - 若对某个常数
ε>0 ,有f(n)=Ω(nlogba+ε) ,且对某个常数c<1 和所有足够大的n有af(n/b)⩽cf(n) ,则T(n)=Θ(f(n))
练习:
答案:
回顾:堆的维护
def max_heapify(A,current_root): largest=max(current_root.left,current_root,current_root.right) if largest is not current_root: swap(largest,current_root) max_heapify(A,largest)
这段代码的复杂度是多少?
根据主定理得到复杂度为
因此,在优先队列中,如果采用堆来存储,那么函数
因此,堆排序的复杂度为
判断下面代码的时间复杂度:
快速排序:
def partition(A,p,r) x=A[r] i=p-1 for j=p to r-1 if A[j]<=x i=i+1 swap(A[i],A[j]) swap(A[i+1],A[r]) return i+1def quick_sort(A,p,r) q=partition(A,p,r) quick_sort(A,p,q-1) quick_sort(A,q+1,r)
显然,第一个函数的代码时间复杂度为
根据主定理,
归并排序:
def merge_sort(A[p...r]) mid=(p+r)/2 merge_sort(A[p...mid]) merge_sort(A[mid+1...r]) merge(A[p...mid],A[mid+1...r],C[p...r]) A[p...r]=C[p...r]
merge的复杂度为
所以整体的复杂度为
根据主定理,
确定下面这个式子的复杂度:
解答:
令
我们令
根据主定理,有
因为
2. 专题二:求解迷宫问题
待续未完
3. 专题三:分治法深入
分治法是将一个规模为n的问题分解为若干个规模小一些的子问题,然后找出这些字问题或者一部分子问题的解并由此得到原问题的解。在解决这些子问题时,分治法要求用同样的方法递归解出。也就是说,我们必须能把这些子问题用同样的方式再分为更小的问题直至问题的规模小到可以直接解出。这个不断分解的过程看起来很复杂,但用递归的算法表达出来却往往简洁明了。通常,分治法只要讲明三件事即可:
- Bottom case:对于足够小的输入规模,如何直接解出
- Divide:如何将一个规模为n的输入分为整数个规模小一些的字问题
- Conquer:如何从子问题的解中获得原规模为n的解
3.1 二元搜索问题
假定要在一个已经排好序的数组
def binary_search(A,p,r,x) if p>r: return none mid=(p+r)/2 if A[mid]=x: return mid elif x<A[mid]: binary_search(A,p,mid-1,x) else: binary_search(A,mid+1,r,x)
(想一想,复杂度是多少?)
3.2 both max and min
Given n numbers stored in A[1..n], we wish to design a divide-and-conquer algorithm that finds both the maximum number and the minimum number in this array.
时间复杂度
3.3 dominating numbers
3.4 max sum two
4. 专题四:线性规划
待续未完
5. 专题五:贪心算法
待续未完
6. 专题六:中位数和顺序统计量
待续未完
7. 专题七:散列表
待续未完
8. 专题八:红黑树
待续未完
9. 专题九:斐波那契堆wenti
待续未完
10. 专题十:van Emde Boas树
待续未完
11. 专题十一: 网络流
待续未完
12. 专题十二:字符串问题
待续未完
13. 专题十三:外排序
待续未完
- 高级算法日记7:专题
- 树状数组----算法高级专题
- 高级算法日记1:摸底课
- 高级算法日记4:查找与排序
- 高级算法日记5:二叉树
- 高级算法日记6:表栈队列
- 高级算法日记8:图(1)
- 高级算法日记9:图(2)
- 高级算法日记10:图(3)
- 高级算法日记11:图(4)
- 高级算法日记12:图(5)
- 高级算法日记3:python数据结构之栈和队列
- 高级算法日记2:第1次课笔记
- 高级算法日记4:第2次课笔记
- 高级正则表达式专题
- 【Python专题】 高级特性
- 【笨鸟先飞】Java重新学习日记7---高级数组之集合
- IBM AIX 高级管理专题
- java学习9:生产和消费问题,先生产才能消费,线程间通信与等待
- Linux下更改目录及其下的子目录和文件的访问权限
- Druid 介绍及配置
- 热敏打印机
- 普元EOS中NUI的提示为英文,如何修改为中文提示
- 高级算法日记7:专题
- 欢迎使用CSDN-markdown编辑器
- jstl的jar包
- 【Hystrix系列】三、适用的熔断降级场景
- VC添加.chm帮助文档 --HtmlHelp
- Activity之任务和返回栈
- Cpp基础
- mysql函数
- openstack project list