数据结构与常用算法
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算法详解》
以上是关于数据结构与常用算法的主要内容,如果未能解决你的问题,请参考以下文章