《算法之道》精华 经典算法部分

《算法之道》精华 经典算法部分

  • 本书作者绉恒明,作者另有一本书《数据结构之弦》,以及《操作系统之哲学原理》都是很好的书
  • 这本书可以算得上是深入浅出,文笔很好,作者添加了很多自己的思考
  • 本文包括经典算法部分

第十章 排序与次序

  • 插入排序

    • 从无序部分抽取一张插入有序部分
    • 为原地排序,无需占用临时存储空间
    • 最优情况下为O(n),平均O(n^2)
  • 折半插入排序
    • 插入时使用二分查找
  • 归并排序
    • 分治,从中间分解,分别排序后进行仔细的合并
    • 异地排序,需要占用额外空间
    • n>=30时性能比插入排序更好。复杂度固定为O(nlog(n))
  • 快排
    • 分治,复杂的部分在于分解,而归并复杂在于合并
    • 原地排序
    • 最坏情况为O(n^2),但只要不是每次都是最坏,复杂度就不是n^2,具有韧性
  • 任何基于比较的排序,决策树高度至少为nlog(n)
  • 计数排序
    • 元素值范围必须有限
    • 空间复杂度高
    • O(n)
  • 基数排序
    • 从最低位到最高位排序,每一位排序都采用稳定排序,如计数排序
    • 一位排序应该选择log(n)个比特,使整体成本最低
  • 桶排序
    • 把n元素按值分到n个桶里,每个桶内部进行插入排序,将各桶首位相连
    • 元素应该是均匀分布
  • 快速次序选择:求第K大的数
    • 使用快排的partition
    • 最差O(n^2),平均O(n)
  • 线性最差快速次序选择
    • 将元素每5个一组,分别取中值。在n/5个中值里面找到中值,作为partition的pivot
    • 为什么*不每3个一组?
    • 保证pivot左边右边至少3n/10个元素
    • 最差O(n)

第十一章 搜索与散列

  • 顺序搜索

    • 在序列里面如果搜索频率从头到尾指数递减,则为O(1)
  • 折半搜索
    • 对于有序序列,为O(logn)
  • 常数搜索:散列搜索
    • 直接散列:非常简单,不会发生碰撞,空间浪费大
    • 除法(模除法)散列
      • 元素对散列表大小m取模得到
      • m必须为素数,否则造成不均匀散射。比如m包含因子d,而大部分元素对d余数相等
      • m不能靠近2的幂。如m为2的幂,散列结果将不依赖元素的所有位。靠近也不行,为什么?
    • 乘法散列
      • h(k) = (A * k ) % 2^r >> (w - r),w为计算机字宽,A为2^(w-1)与2^w之间的一个奇数
      • 乘方取中法:乘方n次(常取n=2),取中间r位
  • 开放寻址散列:散列碰撞时纵深扩展,添加一个链表
    • 平均搜索时间为O(1+a),a为加载因子
  • 封闭寻址散列:散列碰撞时为元素找到另一个位置
    • 找另一个位置的操作称为探寻
    • 线性探寻
      • h(k,i)
        = (h‘(k) + i) % m
        ,h‘(k)为家位
      • 向单方向寻找未被占用的位置
      • 易出现顶级聚集
    • 非线性探寻
      • 平方探寻 h(k,i)
        = (h‘(k) + c1 * i + c2 * i^2) % m
         易出现次级聚集
    • 双重散列探寻
      • 使用两个散列函数h1、h2来构造新散列函数
      • h(k,i)
        = (h1(k) + i * h2(k) ) mod m
    • 伪随机探寻
      • 使用伪随机序列
      • 存在次级聚集
    • 不成功搜索的探寻次数期望为1/(1-a)
    • 成功搜索探寻次数最多为1
      / a * ln( 1/(1-a))
    • 封闭散列不能删除元素,可以放标记解决。如果插入相比搜索非常稀疏,则可以通过重新散列解决空位问题
  • 随机化散列
    • 找到一组散列函数,每次随机选择一个不同的散列函数
    • 用于避免单个散列函数极端情况下聚集效应严重
    • 全域散列
      • 一组H个散列函数,将任意两个不同的元素映射到同一位置的函数个数为H/m
  • 完美散列
    • n个元素,构造m=O(n)大小的散列表,使搜索最坏达到O(1)
    • 采用双层散列,第一层大小n,第二层每个表的大小为落到第一层位置i上的元素个数的平方
    • 空间消耗为O(n)

第十二章 最短路径

  • 如果图中有负环,则不存在最短路径
  • 单源多点最短路径
    • Dijkstra算法

      • 贪婪算法,要求不存在负路径
      • 最优子结构:最短路径里的每一段都是两点之间的最短路径
      • 贪婪选择属性:路径向外延伸的下一个节点就是离源点最近的节点
      • 每次选取离源点最近的节点,更新所有与此节点相邻节点的距离
      • 时间复杂度为O(V^2),采用堆实现,可以达到O(E log(V))。与Prim算法相同
    • Bellman-Ford算法
      • 可以应对负权重
      • 进行V-1轮降距,每次更新图中所有边
      • 复杂度为O(VE)
    • BFS
      • 各边权重相等的情况
      • O(V+E)
  • 多源多点最短路径
    • Floyd-Warshall算法

      • 动态规划算法
      • 子问题为从i到j,中间结点只属于集合1...k的最短路径长度
      • c_ijk = min{c_ij(k-1), c_ik(k-1) + ckj(k-1)}|k
      • 复杂度O(n^3)
    • Jonhson算法
      • 等效变换为无负权重的图,使用Dijkstra算法
      • 添加一个节点s,到所有点路径长度为0,运行Bellman-Ford算法,对节点赋值
      • 对每个节点运行Dijkstra算法
      • 复杂度主要是Dijkstra算法运算,为O(VE + V^2 log(V))
      • 若Bellman-Ford算法报告有负环存在,不能使用此方法

  

  

转载请注明作者:Focustc,博客地址为http://blog.csdn.net/caozhk,原文链接为点击打开

  

  

《算法之道》精华 经典算法部分

时间: 2024-10-07 14:02:41

《算法之道》精华 经典算法部分的相关文章

10道java经典算法题,每一题都能提升你的java水平!第二弹!

10道java经典算法! 持续更新java小知识,跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早生贵子,从不掉发! [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去   掉不满足条件的排列. public class Wanshu { public static void main(String[] args) { int i=0; int j=

《算法之道》精华 算法设计部分

<算法之道>精华 算法设计部分 本书作者邹恒明,作者另有一本书<数据结构之弦>,以及<操作系统之哲学原理>都是非常好的书 这本书能够算得上是深入浅出.文笔非常好,作者加入了非常多自己的思考 本文仅包含算法设计部分,算法分析略去,并没有严格依照章节顺序来记录 附录 算法随想 有人喜欢遍历,希望踏遍千山万水,人生丰富多彩:有人一生贪婪,眼界不宽,及时行乐:有人注定穷搜,辛辛苦苦,收获有限:有人善用时空均衡,用最少的时间办最多的事情.十分精明:有人会分治,再难的问题也能解决.

《算法之道》精华 难解问题部分

<算法之道>精华 难解问题部分 本书作者绉恒明,作者另有一本书<数据结构之弦>,以及<操作系统之哲学原理>都是很好的书 这本书可以算得上是深入浅出,文笔很好,作者添加了很多自己的思考 本文包括难解问题部分 第十三章 易解与难解 易解指的是多项式问题,难解指的是指数级问题 决策问题 需要输出答案是/否 若回答为是,通常需要一个证人来证明.对一个潜在证人,证明之后即为真证人 优化问题和决策问题之间可以相互转化 P类问题 确定性多项式时间可解 对于一个决策问题,输入的大小为n

【软帝学院】12道java经典入门算法题!

12道java经典入门算法题! [程序1]   题目:将一个数组逆序输出. 程序分析:用第一个与最后一个交换. 其实,用循环控制变量更简单: for(int k=11;k>=1;k--) System.out.print(myarr[k]+","); [程序2]   题目:取一个整数a从右端开始的4-7位. 程序分析:可以这样考虑: (1)先使a右移4位. (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) (3)将上面二者进行&运算. pu

12道java经典入门算法题!

12道java经典入门算法题![程序1] ? 题目:将一个数组逆序输出. ? 程序分析:用第一个与最后一个交换. ? 其实,用循环控制变量更简单:for(int k=11;k>=1;k--)System.out.print(myarr[k]+","); [程序2] ? 题目:取一个整数a从右端开始的4-7位. ? 程序分析:可以这样考虑: ? (1)先使a右移4位. ? (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) ? (3)将上面二者进行&a

javascript常用经典算法实例详解

javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与使用技巧,需要的朋友可以参考下 本文实例讲述了javascript常用算法.分享给大家供大家参考,具体如下: 入门级算法-线性查找-时间复杂度O(n)--相当于算法界中的HelloWorld ? 1 2 3 4 5 6 7 8 9 10 //线性搜索(入门HelloWorld) //A为数组,x为要

机器学习与数据挖掘中的十大经典算法

背景: top10算法的前期背景是吴教授在香港做了一个关于数据挖掘top10挑战的一个报告,会后有一名内地的教授提出了一个类似的想法.吴教授觉得非常好,开始着手解决这个事情.找了一系列的大牛(都是数据挖掘的大牛),都觉得想法很好,但是都不愿自己干.原因估计有一下几种:1.确实很忙2.得罪人3.一系列工作很繁琐等等.最后和明尼苏达大学的Vipin Kumar教授一起把这件事情承担下来.先是请数据挖掘领域获过kdd和icdm大奖的十四个牛人提名候选,其中一人因为确实很忙,正从ibm转行到微软,吴教授

《算法导论》为什么经典

许久,你要我写的东西对非技术类没少依赖于博客. 来自0学习技术的开始.你会遇到很多类似的问题,我把他们失望.它会给人帮.但是,非技术性的东西,他还写信给自己看的,在不存在的“我想小”转换成“我想为大”之前(看了刘未鹏的博客后的感触),我不须要别人的理解和同情. 再者,即使面对面交流,也不能保证使一个人全然理解还有一个人.更何况活的思考变成死的文字.然而今天.我仅仅是想把憋在心里的话写出来.人的层次并不同样,譬如很多计算机专业的学生在进入大学之前已能熟练编程,而我其时还连光驱和光盘都弄不清楚.我仅

机器学习经典算法详解及Python实现--CART分类决策树、回归树和模型树

摘要: Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree),本文介绍了CART用于离散标签分类决策和连续特征回归时的原理.决策树创建过程分析了信息混乱度度量Gini指数.连续和离散特征的特殊处理.连续和离散特征共存时函数的特殊处理和后剪枝:用于回归时则介绍了回归树和模型树的原理.适用场景和创建过程.个人认为,回归树和模型树