ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《数据结构》王争 学习笔记

2022-02-24 16:05:33  阅读:154  来源: 互联网

标签:数据结构 队列 王争 笔记 列表 链表 算法 排序 贪心


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

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

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

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

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

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

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

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

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

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

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

哈希算法:

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

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

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

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

标签:数据结构,队列,王争,笔记,列表,链表,算法,排序,贪心
来源: https://blog.csdn.net/m0_56036452/article/details/123113861

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有