非多项式量级只有两个:O(2n)和O(n!), 是非常低效的算法。

均摊时间复杂度分析方法。

基本数据结构:

基于链表的实现方式,可以实现一个支持无限排队的无界队列(unbounded queue),但是可能会导致过多的请求排队等待,请求处理的响应时间过长。所以,针对响应时间比较敏感的系统,基于链表实现的无限排队的线程池是不合适的。

而基于数组实现的有界队列(bounded queue),队列的大小有限,所以线程池中排队的请求超过队列大小时,接下来的请求就会被拒绝,这种方式对响应时间敏感的系统来说,就相对更加合理。不过,设置一个合理的队列大小,也是非常有讲究的。队列太大导致等待的请求太多,队列太小会导致无法充分利用系统资源、发挥最大性能。

排序:

归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。

归并排序算法是一种在任何情况下时间复杂度都比较稳定的排序算法,这也使它存在致命的缺点,即归并排序不是原地排序算法,空间复杂度比较高,是O(n)。正因为此,它也没有快排应用广泛。

桶排序、计数排序、基数排序,是非基于比较的排序算法,都不涉及元素之间的比较操作, 对要排序的数据要求很苛刻,掌握这些排序算法的适用场景。

桶排序比较适合用在外部排序中。数据量比较大,内存有限,无法将数据全部加载到内存中。

跳表:

跳表是通过随机函数来维护前面提到的“平衡性”。

哈希表:

当数据量比较小、装载因子小的时候,适合采用开放寻址法。这也是Java中的ThreadLocalMap使用开放寻址法解决散列冲突的原因。
基于链表的散列冲突处理方法比较适合存储大对象、大数据量的散列表,而且,比起开放寻址法,它更加灵活,支持更多的优化策略,比如用红黑树代替链表。

何为一个工业级的散列表?工业级的散列表应该具有哪些特性?
支持快速地查询、插入、删除操作;
内存占用合理,不能浪费过多的内存空间;
性能稳定,极端情况下,散列表的性能也不会退化到无法接受的情况。

哈希算法:

字符串算法:

经典的单模式串匹配算法全部讲完了,它们分别是BF算法、RK算法、BM算法和KMP算法,
Trie树这种数据结构总体上来讲是比较费内存的,是一种空间换时间的解决问题思路。
Trie树的优势并不在于,用它来做动态集合数据的查找,因为,这个工作完全可以用更加合适的散列表或者红黑树来替代。Trie树最有优势的是查找前缀匹配的字符串
多模式串匹配算法,AC自动机

贪心、分治、回溯、动规:

在贡献相同期望值(纸币数目)的情况下,我们希望多贡献点金额,这样就可以让纸币数更少,这就是一种贪心算法的解决思路。
贪心 : 最优子结构、无后效性和贪心选择性
分治算法其中一个要求是,子问题合并的代价不能太大
动态规划解决的问题,需要满足三个特征,最优子结构、无后效性和重复子问题
贪心、回溯、动态规划可以归为一类,都可以抽象成我们今天讲的那个多阶段决策最优解模型,而分治单独可以作为一类

“一个模型三个特征”。其中,“一个模型”指的是,问题可以抽象成分阶段决策最优解模型。“三个特征”指的是最优子结构、无后效性和重复子问题。

高级数据结构:

从散列表讲到位图,再讲到布隆过滤器。
CPU计算可能是要比内存访问更快速的,所以,理论上讲,布隆过滤器的判重方式,更加快速。

布隆过滤器有一定的判错率。但是,我们可以规避它的短处,发挥它的长处。尽管对于判定存在的数据,有可能并不存在,但是对于判定不存在的数据,那肯定就不存在。而且,布隆过滤器还有一个更大的特点,那就是内存占用非常少。我们可以针对数据,构建一个布隆过滤器,并且存储在内存中。当要查询数据的时候,我们可以先通过布隆过滤器,判定是否存在。如果通过布隆过滤器判定数据不存在,那我们就没有必要读取磁盘中的索引了。对于数据不存在的情况,数据查询就更加快速了。

并行处理的实现思路,也就是对数据进行分片,对没有依赖关系的任务,并行地执行。

并行计算是一个工程上的实现思路,尽管跟算法关系不大,但是,在实际的软件开发中,它确实可以非常巧妙地提高程序的运行效率,是一种非常好用的性能优化手段。

《数据结构》王争 学习笔记相关推荐

  1. 《设计模式》王争 学习笔记

    <设计模式>王争 学习笔记 面向对象 面向对象 用面向对象编程语言,我们照样可以进行面向对象编程

  2. 数据结构与算法学习笔记之先进先出的队列

    前言 队列是一种非常实用的数据结构,类似于生活中发排队,可应用于生活,开发中各个方面,比如共享打印机(先请求先打印),消息队列.你想知道他们是怎么工作的么.那就来一起学习一下队列吧 正文 一.队列的定 ...

  3. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  4. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  5. 邓俊辉《数据结构》-列表学习笔记

    2021.12.9 向量&列表的关系 向量结构中各数据项的物理存放位置与逻辑次序完全对应,可通过秩直接访问对应的元素,即"循秩访问".好像可以通过一个人的家庭住址找到那个人 ...

  6. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  7. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  8. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

  9. 数据结构与算法 学习笔记(5):字符串

    数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...

最新文章

  1. lua 开发环境搭建(windows 平台)
  2. 高可用可伸缩架构实用经验谈
  3. 全球及中国回流冷凝管行业发展前景整体预测及十四五发展趋向展望报告2022-2027年版
  4. Openstack迁移DDH最佳实践
  5. sql语句ding_mybatis plus 写sql语句
  6. [Java基础]反射练习之越过泛型检查,运行配置文件制定内容
  7. 程序员都很老实?你错了,其实程序员真实的样子是这样的
  8. spring 优越性实践
  9. 在js中实现邮箱格式的验证
  10. javascript学习笔记 - 引用类型 Object
  11. linux终端什么字体舒服,推荐一款 Linux 上比较漂亮的字体
  12. 微信OpenIdUnionID
  13. 英文横版游戏《玛丽师傅》源码H5+安卓+IOS三端源码
  14. 植物大战僵尸修改植物攻击力
  15. 今天花了点时间详细了解了一下WiFi
  16. 我的第一个python程序源代码_科学网—我的第一个Python程序——删除代码前行号的小工具 - 闫小勇的博文...
  17. 生活污水是怎么处理的
  18. 快速简单对接【短信验证码】API接口
  19. adf的主要功能之一是_ADF软件介绍
  20. 【BP靶场portswigger-服务端6】信息泄露漏洞-5个实验(全)

热门文章

  1. 反汇编专用工具——objdump
  2. Spring源码 IOC和循环依赖AOP
  3. 电源拓扑从入门到精通 - 3
  4. 中国海洋大学计算机博士毕业要求,博士毕业要求
  5. Java如何解析markdown_Java类库解析markdown文本
  6. cas99970-84-0|2,2‘-联吡啶-4,4’-二甲醛 中间体材料
  7. vivo新系统originos和鸿蒙,vivo发布新系统“Origin OS”,这三批机型支持升级,你期待吗?...
  8. ai写作生成器哪个好用?这些软件不可错过
  9. 中国石油大学《化工原理一》第三阶段在线作业
  10. Office Server 镜像下载及安装