数据结构与常用算法

Posted 超维链习社

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与常用算法相关的知识,希望对你有一定的参考价值。


数据结构

队列

  • 《java队列——queue详细分析》

    • 非阻塞队列:ConcurrentLinkedQueue(无界线程安全),采用CAS机制(compareAndSwapObject原子操作)。

    • 阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。

  • 《LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析》

集合

  • 《Java Set集合的详解》

链表、数组

  • 《Java集合详解--什么是List》

字典、关联数组

  • 《Java map 详解 - 用法、遍历、排序、常用API等》

  • 《java数据结构与算法之栈(Stack)设计与实现》

  • 《Java Stack 类》

  • 《java stack的详细实现分析》

    • Stack 是线程安全的。

    • 内部使用数组保存数据,不够时翻倍。

二叉树

每个节点最多有两个叶子节点。

  • 《二叉树》

完全二叉树

  • 《完全二叉树》

    • 叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

平衡二叉树

左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

  • 《浅谈数据结构-平衡二叉树》

  • 《浅谈算法和数据结构: 八 平衡查找树之2-3树》

二叉查找树(BST)

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)。

  • 《浅谈算法和数据结构: 七 二叉查找树》

红黑树

  • 《最容易懂得红黑树》

    • 添加阶段后,左旋或者右旋从而再次达到平衡。

  • 《浅谈算法和数据结构: 九 平衡查找树之红黑树》

B-,B+,B*树

mysql是基于B+树聚集索引组织表

  • 《B-树,B+树,B*树详解》

  • 《B-树,B+树与B*树的优缺点比较》

    • B+ 树的叶子节点链表结构相比于 B- 树便于扫库,和范围检索。

LSM 树

LSM(Log-Structured Merge-Trees)和 B+ 树相比,是牺牲了部分读的性能来换取写的性能(通过批量写入),实现读写之间的。 Hbase、LevelDB、Tair(Long DB)、nessDB 采用 LSM 树的结构。LSM可以快速建立索引。

  • 《LSM树 VS B+树》

    • B+ 树读性能好,但由于需要有序结构,当key比较分散时,磁盘寻道频繁,造成写性能。

    • LSM 是将一个大树拆分成N棵小树,先写到内存(无寻道问题,性能高),在内存中构建一颗有序小树(有序树),随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历(二分查找)所有的小树,但在每颗小树内部数据是有序的。

  • 《LSM树(Log-Structured Merge Tree)存储引擎》

    • 极端的说,基于LSM树实现的HBase的写性能比MySQL高了一个数量级,读性能低了一个数量级。

    • 优化方式:Bloom filter 替代二分查找;compact 小数位大树,提高查询性能。

    • Hbase 中,内存中达到一定阈值后,整体flush到磁盘上、形成一个文件(B+数),HDFS不支持update操作,所以Hbase做整体flush而不是merge update。flush到磁盘上的小树,定期会合并成一个大树。

BitSet

经常用于大规模数据的排重检查。

  • 《Java Bitset类》

  • 《Java BitSet(位集)》

常用算法

  • 《常见排序算法及对应的时间复杂度和空间复杂度》

排序、查找算法

  • 《常见排序算法及对应的时间复杂度和空间复杂度》

选择排序

  • 《Java中的经典算法之选择排序(SelectionSort)》

    • 每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。

冒泡排序

  • 《冒泡排序的2种写法》

    • 相邻元素前后交换、把最大的排到最后。

    • 时间复杂度 O(n²)

插入排序

  • 《排序算法总结之插入排序》

快速排序

  • 《坐在马桶上看算法:快速排序》

    • 一侧比另外一次都大或小。

归并排序

  • 《图解排序算法(四)之归并排序》

    • 分而治之,分成小份排序,在合并(重建一个新空间进行复制)。

希尔排序

TODO

堆排序

  • 《图解排序算法(三)之堆排序》

    • 排序过程就是构建最大堆的过程,最大堆:每个结点的值都大于或等于其左右孩子结点的值,堆顶元素是最大值。

计数排序

  • 《计数排序和桶排序》

    • 和桶排序过程比较像,差别在于桶的数量。

桶排序

  • 《【啊哈!算法】最快最简单的排序——桶排序》

  • 《排序算法(三):计数排序与桶排序》

    • 桶排序将[0,1)区间划分为n个相同的大小的子区间,这些子区间被称为桶。

    • 每个桶单独进行排序,然后再遍历每个桶。

基数排序

按照个位、十位、百位、...依次来排。

  • 《排序算法系列:基数排序》

  • 《基数排序》

二分查找

  • 《二分查找(java实现)》

    • 要求待查找的序列有序。

    • 时间复杂度 O(logN)。

  • 《java实现二分查找-两种方式》

    • while + 递归。

Java 中的排序工具

  • 《Arrays.sort和Collections.sort实现原理解析》

    • Collections.sort算法调用的是合并排序。

    • Arrays.sort() 采用了2种排序算法 -- 基本类型数据使用快速排序法,对象数组使用归并排序。

布隆过滤器

常用于大数据的排重,比如email,url 等。 核心原理:将每条数据通过计算产生一个指纹(一个字节或多个字节,但一定比原始数据要少很多),其中每一位都是通过随机计算获得,在将指纹映射到一个大的按位存储的空间中。注意:会有一定的错误率。 优点:空间和时间效率都很高。 缺点:随着存入的元素数量增加,误算率随之增加。

  • 《布隆过滤器 -- 空间效率很高的数据结构》

  • 《大量数据去重:Bitmap和布隆过滤器(Bloom Filter)》

  • 《基于Redis的布隆过滤器的实现》

    • 基于 Redis 的 Bitmap 数据结构。

  • 《网络爬虫:URL去重策略之布隆过滤器(BloomFilter)的使用》

    • 使用Java中的 BitSet 类 和 加权和hash算法。

字符串比较

KMP 算法

KMP:Knuth-Morris-Pratt算法(简称KMP) 核心原理是利用一个“部分匹配表”,跳过已经匹配过的元素。

  • 《字符串匹配的KMP算法》

深度优先、广度优先

  • 《广度优先搜索BFS和深度优先搜索DFS》

贪心算法

  • 《算法:贪婪算法基础》

  • 《常见算法及问题场景——贪心算法》

回溯算法

  • 《 五大常用算法之四:回溯法》

剪枝算法

  • 《α-β剪枝算法》

动态规划

  • 《详解动态规划——邹博讲动态规划》

  • 《动态规划算法的个人理解》

朴素贝叶斯

  • 《带你搞懂朴素贝叶斯分类算法》

    • P(B|A)=P(A|B)P(B)/P(A)

  • 《贝叶斯推断及其互联网应用1》

  • 《贝叶斯推断及其互联网应用2》

推荐算法

  • 《推荐算法综述》

  • 《TOP 10 开源的推荐系统简介》

最小生成树算法

  • 《算法导论--最小生成树(Kruskal和Prim算法)》

最短路径算法

  • 《Dijkstra算法详解》


以上是关于数据结构与常用算法的主要内容,如果未能解决你的问题,请参考以下文章

工程实践中最常用的10大数据结构与算法讲解

数据结构与常用算法

4-1 Python常用内置算法与数据结构常考题

Java数据结构和算法:常用排序算法与经典题型

算法与数据结构常用算法模板1

C#程序设计之常用数据结构与算法