[算法导论]网易MIT算法导论课笔记(简略版)

这是一份关于《算法导论》的网易MIT算法课程的全面笔记,涵盖了从算法分析到数据结构,包括分冶法、排序算法、哈希表、平衡搜索树、跳跃表和平摊分析等多个主题。详细讲解了各种算法的基本概念、实现原理及源码,并提供了相关博客资源链接,旨在深入理解算法和数据结构。
摘要由CSDN通过智能技术生成

Introduction to Algorithm

  • 说明lgn是以2为底的对数
  • 编译环境:g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
  • g++ -std=c++11 XX.cpp -o XX

第一课 算法分析

第二课 渐近符号、递归及解法

  • f(n)的值总位于c1g(n)与c2g(n)之间或等于它们,那么记f(n)=Θ(g(n))。
  • f(n)的值总小于或等于cg(n),那么记f(n)=O(g(n))。
  • f(n)的值总大于或等于cg(n),那么记f(n)=Ω(g(n))。
  • 用主方法求解递归式,
    如下图:

另外这一篇BLOG详细了介绍了这种方法的用途:BLOG

第三课 分冶法(Divide and Conquer)

  • 二分法 源码
  • 菲波那切数列 源码
  • 结:朴素递归算法用时太多,实用价值不大,自底向上算法效率为线性,较高,平时用较多,递归平方算法效率为对数级,且编程可实现,实用价值很大。并且经过测试,当n值变很大后,递归平方算法效率明显高于自底向上算法效率。BLOG

第四课 快排及随机化算法

  • 快速排序及随机快速排序 源码
  • Hoare的代码对快排有重复的情况运行的更好。
  • 随机化快速排序,其运行时间不依赖于输入序列的顺序Θ(nlgn),一般来说比归并快3倍。
  • 这篇博客对此进行了详细的介绍我就摘录了一些 BLOG
    自我小结:对随机产生的数组进行排序,1)可以发现插入排序没有优势、特别是数组比较大时耗时太多;2)快速排序、随机化快速排序、归并排序性能不错,然而两种快排比归并排序性能好点;3)当数据量变大时,可以看出性能排序为快速排序、随机化快速排序、归并排序、插入排序;4)由于这里的数组是由随机数产生的,没有显示出随机化快速排序的优势,但是当数组为已排序情况下随机化快排将比快排性能好。

第五课 线性时间排序

  • 在最坏情况下,任何比较排序算法都需要做Ω(nlgn)次比较。故堆排序和归并排序都是渐进最优的比较排序算法。
  • 计数排序 源码

它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序)

源码中实现排序的代码是和计数排序一样的。
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

第六课 顺序统计、中值

  • 随机选择算法(一般选择这个) 源码 :

运行时间的复杂度期望是Θ(n),最坏的情况复杂度为Θ(n2)。

  • 最坏线性选择算法
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值