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

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

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

第十章 排序与次序

  • 插入排序
    • 从无序部分抽取一张插入有序部分
    • 为原地排序。无需占用暂时存储空间
    • 最优情况下为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)
  • 常数搜索:散列搜索
    • 直接散列:很easy,不会发生碰撞,空间浪费大
    • 除法(模除法)散列
      • 元素对散列表大小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,原文链接为点击打开

  
  

转载于:https://www.cnblogs.com/gavanwanggw/p/7259274.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生社团网站html,学生社团活动平台的设计与实现.docx

PAGE 67学生社团活动平台的设计与实现摘 要本系统立足于实现社团活动申请与审批、资源申请与审批等工作,面向高校中所有的社团,建立一个使用便捷、可靠的社团活动平台,从而更方便地进行社团活动的申请、社团资源的申请及相应审批,…

tornado 学习笔记17 HTTPServerRequest分析

代表Http请求。 所有的属性都是字符串型。 17.1 属性 (1) method:请求方法类型,比如”GET”、”POST” (2) uri: 请求的uri (3) path:请求路径,作为uri的一部分。 (4) query:查询字符串:作为uri的一部分。 (5) version&#xff1a…

Android 动画效果及Interpolator和AnimationListener的使用

转载http://www.itzhai.com/android-animation-used-to-achieve-control-of-animation-effects-and-use-of-interpolator-and-animationlistener.htmlandroid:interpolator可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面…

html怎么使图片无法另存为,如何禁止图片另存为?禁止网页另存为到本地的方法...

在很多企事业单位,处于商业机密保护的需要,常常需要禁止一些文件格式的“另存为”功能,防止通过“另存为”将文件另行保存,据为己有的目的;尤其是在局域网中访问服务器共享文件的时候,常常需要禁止将共享文…

正益工场为京西创客工场输送双创“软”实力

12月30日,中关村门头沟科技园“京西创客工场”正式揭牌,这里将成为京西“生态科创”的聚集地。正益工场作为唯一入驻的“移动互联网”双创生态平台,将为双创输送“移动技术移动模式”等软实力。北京市副市长隋振江、市政协、中关村管委会等领…

【动态规划】【线段树】 Codeforces Round #426 (Div. 1) B. The Bakery

给你一个序列,让你划分成K段,每段的价值是其内部权值的种类数,让你最大化所有段的价值之和。 裸dp f(i,j)max{f(k,j-1)w(k1,i)}&#…

几种服务器端IO模型的简单介绍及实现(转载)

作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/服务器端几种模型: 1、阻塞式模型(blocking IO) 我们第一次接触到的网络编程都是从 listen()、accpet()、send()、recv() 等接口开始的。使用这些接口可以很方便的…

html细边框表格代码,html中表格细边框的四种实现及其比较.doc

html中表格细边框的四种实现及其比较?html中表格细边框的四种实现及其比较第一种使用css!--- 华丽的分隔线。。 -- .box ?border-top-width: 1px;?border-right-width: 0px;?border-bottom-width: 0px;?border-left-width: 1px;?border-top-style: solid;?border-right-…

margin 等高布局

<div id"main"><div id"left">我是左边的内容的啦啦啦啦。。。。<br> 我是左边的内容的啦啦啦啦。。。。<br> 我是左边的内容的啦啦啦啦。。。。<br> 我是左边的内容的啦啦啦啦。。。。<br> 我是左边的内容的啦啦啦啦…

c、c++---linux上的GetTickCount函数

http://blog.csdn.net/guang11cheng/article/details/6865992 http://wenda.so.com/q/1378766306062794

C#判断一个类中有无指定名称的方法

C#中可以通过反射分析元数据来解决这个问题&#xff0c;示例代码如下&#xff1a;12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849using System;using System.Reflection;namespace Hello{class Program{static void Main(string[…

2021年高考成绩查询襄阳状元,大胆猜测一下,2021年高考,湖北省文理状元会花落谁家?...

随着2021年高考的逼近&#xff0c;考生进入紧张有序的复习中&#xff0c;家长也在为孩子筹谋着哪所学校更适合&#xff0c;作为吃瓜群众的我们&#xff0c;可能更关注今年湖北省的文理科状元会花落谁家&#xff0c;要知道&#xff0c;一所学校如果可以出现一名高考状元&#xf…

为什么写Java程序需要接口

为什么写Java程序需要接口 我之所以以这个作为标题&#xff0c;并不是为了玩噱头&#xff0c;讲一些似是而非的空话&#xff0c;还是以探索加发现&#xff0c; 追本溯源的讲解一下为什么Java需要接口&#xff0c;怎么理解&#xff0c;怎么用它。 首先接口并不是Java才有的&…

《领域特定语言》一1.5使用代码生成

1.5使用代码生成 在迄今为止的讨论中&#xff0c;要处理DSL&#xff0c;组装“语义模型”&#xff08;第11章&#xff09;&#xff0c;然后执行语义模型&#xff0c;提供我们希望从控制器得到的行为。在语言圈子里&#xff0c;这种方式称为解释&#xff08;interpretation&…

SVG 基础图形

SVG 基础图形 SVG包含了以下的基础图形元素&#xff1a; 矩形&#xff08;包括可选的圆角&#xff09;&#xff0c;使用<rect>元素创建圆形&#xff0c;使用<circle>元素创建椭圆形&#xff0c;使用<ellipse>元素创建直线&#xff0c;使用<line>元素创…

枣庄三中高考2021成绩查询,2021枣庄中考成绩查询系统入口

2021枣庄中考成绩查询系统入口2021-05-20 19:11:35文/王佳慧2021年&#xff0c;枣庄的中考时间快到了&#xff0c;本文分享了枣庄中考成绩查询入口&#xff0c;系统开通后考生可登陆查询成绩。枣庄中考成绩查询入口志愿填报须知1.录取标准&#xff1a;提前批、第一批、第三批学…

移动端”宴席知多少

转载(http://adt.aicai.com/index.php/archives/179/) 瞎折腾移动端的项目已经很长一段时间了&#xff0c;并不像其它企业一样&#xff0c;可以有项目组去完成&#xff0c;基本都是一个人瞎尝试&#xff0c;时而web&#xff0c;时而web app。恍恍惚惚过了这段岁月&#xff0c;也…

快速的取整方法(~~)

为什么80%的码农都做不了架构师&#xff1f;>>> 最近看一篇js装逼小技巧————双波浪号的妙用(将内容转化为数字,或者小数取整)&#xff0c;但是本身我的JavaScript水平比较低对其底层操作和其使用范围不甚了解&#xff1b;通过翻阅资料现进行简单的整理。 ###装…

git log友好显示

查看commit 提交日志 $ git log $git log --prettyoneline $git reflog 显示所有提交记录&#xff0c;包括已经回退的提交&#xff0c;如图&#xff1a;提交了abc 和 bb 然后回退到 abc   $git log 只显示abc提交 可以使用 $git reset --hard commit号 回退到bb git reflog…

jprofiler_windows-x64_9_1注册码

L-Larry_Lau163.com#5481-ucjn4a16rvd98#6038 L-Larry_Lau163.com#36573-fdkscp15axjj6#25257 转载于:https://www.cnblogs.com/sprinng/p/5104507.html