![](https://img-blog.csdnimg.cn/20191118110957244.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
啦啦啦小骑士
此人并不懒,但还是什么都没有写,嘿嘿
展开
-
O(n²)排序算法——冒泡、选择、插入
一、冒泡排序(Bubble Sort)动图转载自Github作者hustcc● 基础版本/** * 静态方法:冒泡排序算法 */public static void sort(Comparable[] arr) { // 外层循环控制每趟排序 for (int i = 0; i < arr.length - 1; i++) { // 内层循环控制元素交换 for (...原创 2019-12-06 23:17:04 · 219 阅读 · 0 评论 -
空间换时间的经典结构——哈希表(Hash Table)
设计背景在数组中,我们可以根据索引快速取出某个位置元素的值(时间复杂度为O(1)级别),但是数组中每一个元素的索引是依据添加顺序决定的,该索引与元素本身也没有任何关联,当我们想再次查找某个元素的时候,只能将数组遍历一次才能找到我们需要的元素,相当的耗时(时间复杂度为O(n)级别)树结构的诞生在很大程度上加快了搜索速度(例如二分搜索树在理想状态下的时间复杂度为O(logn)级别),但单从速度上讲...原创 2019-12-05 21:40:53 · 1070 阅读 · 0 评论 -
著名的黑平衡BST——红黑树(Red Black Tree)
设计背景AVL树通过严格的平衡因子制度来触发自平衡操作,它是一种高度平衡的BST,在数据的查询上有着显著的优势,但在某些场景下,过于频繁的自平衡操作可能会带来多余的时间消耗。在树领域中还有一种著名的自平衡BST——红黑树(Red Black Tree),它通过特殊的机制来降低自平衡触发的次数,以牺牲平衡性来节省开销,其属于弱平衡的BST。红黑树是一种综合性能折中的选择,适合增删改查等多重操作频...原创 2019-12-05 17:06:31 · 819 阅读 · 0 评论 -
最早的自平衡BST——AVL树(AVL Tree)
设计背景二分搜索树(Binary Search Tree)拥有相对高效的查找能力,但是依然存在很大的缺陷。当添加的所有元素都比现有的元素大或者小时,二分搜索树将会退化成一个链表(LinkedList)。即使只有部分元素发生这种状况,也会使二分搜索树变得极不平衡,大大降低树结构的效率。这种问题产生的根源在于二分搜索树没有一套自平衡的机制,只有添加的元素拥有足够的随机性时它才能趋向于平衡。...原创 2019-11-29 22:16:22 · 253 阅读 · 0 评论 -
优先级高者先出的队列——优先队列(Priority Queue)
设计背景普通队列是先入队的元素先出队,它的权重衡量是入队的先后,我们希望设计一种按照特定衡量标准进行优先级排序的队列,这种队列就叫做优先队列(Priority Queue)结构分析【底层实现】Heap等【核心方法】同队列代码实现利用最大堆(MaxHeap)实现优先队列:public class PriorityQueue<E extends Comparable<E>...原创 2019-11-26 15:31:24 · 797 阅读 · 0 评论 -
一颗完全二叉树——堆(Heap)
设计背景二叉树有满二叉树(Full binary Tree)和完全二叉树(Complete Binary Tree)等特殊情况,满二叉树指“除了叶子节点外,所有节点都有左子树和右子树”,它的叶子节点只会出现在最后一层;而完全二叉树因为有的节点可能缺失子树,所以它的叶子节点可能出现在最后的两层中。而堆(Heap)可以看作一颗完全二叉树的数组,堆有最大堆(MaxHeap)和最小堆(MinHeap...原创 2019-11-25 21:56:29 · 1210 阅读 · 0 评论 -
值与值相对应的结构——映射(Map)
设计背景在信息存储的场景中,我们经常遇到“一个值对应着另一个值”的情况,这种关系在数学中被称作函数(function)或者映射(mapping)。在数据结构中也有这样一种设计类型,每一个节点存储着一个key键和一个value值,两者合称“键值队”(key-value),用户可以通过key键定位到value值,这种结构类型被称为映射(Map)。映射中key的值不能重复,而value得值可以重复,...原创 2019-11-24 17:23:22 · 659 阅读 · 0 评论 -
独一且无序的结构——集合(Set)
设计背景传统的数组可以存放重复的元素,且其存放有序,而有时我们不希望数据结构存储重复的元素,且我们不关注它的排序,例如IP访问量统计、文本字数统计等。这种存储无序且不重复元素的结构类型就被称之为集合(Set)。结构分析【底层实现】二分搜索树(BST)/链表(LinkedList)【核心方法】public void add(E e); //向集合添加元素public void re...原创 2019-11-22 10:39:55 · 313 阅读 · 0 评论 -
左小右大的树形结构——二分搜索树(Binary Search Tree)
设计背景在链表(LinkedList)中,每一个节点都存储着一个元素,还有一个指向下一个节点的指针。与这种特性类似,我们把“每一个节点都拥有两个指向不同节点的指针”的结构称之为二叉树(Binary Tree);从形状上来看,这两个指针所指向的节点分别叫做“左子树”(left subtree)和“右子树”(right subtree),而这个节点就是左右子树(亦可称作左右孩子)的父亲节点(fath...原创 2019-11-20 23:31:01 · 2232 阅读 · 0 评论 -
一颗串一颗的链状结构——链表(LinkedList)
设计背景动态数组(ArrayList)拥有良好的随机访问能力,虽然从用户的层面讲其为动态的,但其仍然没有摆脱容量的约束,它内部依旧面临着扩容/缩容等繁琐操作。我们希望设计一种存储风格类似于数组,却完全不需要涉及到容量的纯动态线性结构。在这个结构中,每一个元素通过指针引用的形式指向下一个元素,直至NULL值,以串成一条数据链,这种结构就被称之为链表(LinkedList)。结构分析【结构类...原创 2019-11-20 22:39:32 · 665 阅读 · 0 评论 -
先进先出的排队结构——队列(Queue)
设计背景与栈“后进先出”(LIFO)的特性相对应,应当还有一种“先进先出”(FIFO)特性的数据结构,这种数据结构被称之为队列(Queue)。该结构的实现过程与栈几乎类似,区别在于每次存入元素和获取元素的位置不同。结构分析【结构类型】线性结构【底层实现】动态数组(ArrayList)【核心方法】public void enqueue(E e); //入队public E deq...原创 2019-11-19 23:28:56 · 3439 阅读 · 0 评论 -
后进先出的桶状结构——栈(Stack)
设计背景计算机中很多场景会遇到“后存入的元素先被调用”(LIFO)的情况,例如编辑器的撤销操作、系统的递归调用操作。数组(Array)作为一种线性表,它可以在任意位置插入元素和取出元素,如果将数组限制为只能在尾部插入和取出元素,那么就实现了这种需求。这种数据结构被称之为栈(Stack)。结构分析【结构类型】线性结构【底层实现】动态数组(ArrayList)/链表(LinkedList)...原创 2019-11-18 13:42:29 · 770 阅读 · 0 评论 -
自动管理容量的线性表——动态数组(ArrayList)
设计背景传统的数组在声明时必须确定大小,一旦创建便不能再改变容量。如果需要增大/缩小容量的话,则需要手动创建一个新数组,然后再将旧数组的内容拷贝至新数组,从而完成扩容/缩容。动态数组(ArrayList)的数据结构将这一系列操作进行了封装,只向用户提供的相应的方法(增删改查),提高了数组的利用效率。结构分析【结构类型】线性结构【底层实现】数组(Array)【核心方法】public v...原创 2019-11-18 11:07:37 · 240 阅读 · 0 评论