![](https://img-blog.csdnimg.cn/df535de143a6411898fe5b6aeb64302a.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构Java版
文章平均质量分 87
算法与数据结构
shark-chili
这个作者很懒,什么都没留下…
展开
-
LinkedHashMap源码分析
支持遍历时会按照插入顺序有序进行迭代。支持按照元素访问顺序排序,适用于封装LRU缓存工具。因为内部使用双向链表维护各个节点,所以遍历时的效率和元素个数成正比,相较于和容量成正比的HashMap来说,迭代效率会高很多。LinkedHashMap逻辑结构如下图所示,它是在HashMap基础上在各个节点之间维护一条双向链表,使得原本散列在不同bucket上的节点、链表、红黑树有序关联起来。原创 2020-07-10 14:50:30 · 1343 阅读 · 1 评论 -
来聊聊Java常用集合类HashMap
HashMap是我们比较常用的集合类型,它是以键值对的逻辑结构来存储数据的。HashMap允许存储null键或者null值的键值对。HashMap非线程安全。HashMap底层初始化用的是数组+链表,当链表长度大于8(默认值)时,若size小于64则进行2倍扩容,反之会对对应的数组桶进行链表转红黑树操作。HashMap默认大小为16。先来回答第一个问题,容量为什么是2的幂次方,首先我们步入hashMap的源码中查看。hashMap计算键值对存到桶中索引位置的代码。原创 2022-03-02 21:44:21 · 1348 阅读 · 0 评论 -
Java集合常见工具类
void reverse(List list)//反转void shuffle(List list)//随机排序void sort(List list)//按自然排序的升序排序void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑void swap(List list, int i , int j)//交换两个索引位置的元素void rotate(List list, int distance)//旋转。原创 2021-10-07 23:53:56 · 2739 阅读 · 0 评论 -
来聊聊动态数组ArrayList和LinkList的区别
在前文数据结构与算法-单链表/** 最好:O(1)* 最坏:O(n)* 平均:O(n)} else {/** 最好:O(1)* 最坏:O(n)* 平均:O(n)} else {}如果空间使用一段时间并扩容无数次且不进行缩容的话,会出现空间浪费的现象,所以我们需要对其进行缩容的操作由此可知我们很可能会因为不断添加元素导致数组动态扩容的情况,所以我们可以提前调用ensureCapacity顶下最终容量一次性完成动态扩容提高程序执行性能。@Test。原创 2020-08-03 23:57:47 · 488 阅读 · 0 评论 -
数据结构与算法-单向链表的实现以及相关面试题
前言在之前的博文中,我们已经用动态数组实现了线性表算法-动态数组的实现然而动态数组的缺点也很明显,即常会出现内存空间的大量浪费的情况,所以本文我们就是使用另一种解决方案,单向链表单向链表如下图所示,所有元素的内存地址不一定是连续的,但通过next指针却依然可以实现他们的两两相连。链表的设计思路如下图所示,由于该接口与之前的顺序表有很多可复用代码,以及需要实现相关的操作,所以在笔者所使用的java语言中,选用抽象类配合接口实现一个线性表公用父类相关代码接口设计public interf原创 2020-08-03 00:34:04 · 194 阅读 · 0 评论 -
数据结构于算法-基础排序
选择排序基本思想指定一个索引位置的元素,和后面元素比较选拔出最小的,和当前指定的进行交换实现package com.study.sortBase;public class SelectionSort { // 我们的算法类不允许产生任何实例 private SelectionSort(){} public static void sort(Comparable[] arr) { int minIndex; for (int i = 0;原创 2020-09-05 10:46:10 · 121 阅读 · 0 评论 -
数据结构与算法-集合与映射
数学中的函数就是映射,一一对应,俗称字典。原创 2023-12-15 08:37:08 · 264 阅读 · 0 评论 -
数据结构与算法-三种队列基础入门
一般队列概述一种特殊的线性表,只能在对头、队尾进行操作,如下图所示,是一种先进先出(FIFO)的数据结构接口设计◼ int size(); // 元素的数量◼ boolean isEmpty(); // 是否为空◼ void clear(); // 清空◼ void enQueue(E element); // 入队◼ E deQueue(); // 出队◼ E front(); // 获取队列的头元素代码实现说明由于考虑到队列操作都是在队首队尾进行操作,综合考虑,笔者在这里使用原创 2020-08-06 22:29:46 · 375 阅读 · 0 评论 -
数据结构与算法-AVL树入门
基本概念什么是avl树为解决普通二叉树结果添加后会成为链表从而影响性能而诞生的一种数据结构。avl树的平衡标准任意一个节点中,左右子树和树的高度不超过1。如下图所示的一棵树就是失衡的avl树。avl树的基本实现基本思路由于之前已经实现了二叉搜索树二叉搜索树,所以只需要在二叉搜索树的基础上加以改造即可。增加节点分析对于avl树不平衡的情况有四种,分别是LL、RR、LR、RL这几种情况。对于这些情况具体的解决方案如下列图片所示:核心代码 // 向二分搜索树中添加新的元素(key原创 2020-09-02 15:41:29 · 162 阅读 · 0 评论 -
数据结构与算法-最短路径基础入门
最短路径的用处路径规划Dijkstra算法求最短路径实现思路在没有负权边的情况下,从0点开始将邻接边存入索引堆中,在取出权最小的边并访问该结点,再从该结点开始将邻接边存入索引堆中,再从堆里取出权最小边如此往复,若最小边对应点之前访问过且权值比现在访问所要权还要大,则更新该值,如此往复……复杂度O(pointCount log ^ pointCount)实现代码package com.study.shortPathDemo;import java.util.Stack;import ja原创 2020-09-09 16:09:39 · 146 阅读 · 0 评论 -
数据结构与算法-循环链表详解
单项循环链表图解实现步骤分析由于之前已经写过了单链表单向链表,而单向循环链多数操作和单链表操作一致,所以我们只需基于之前的代码进行修改添加结点和删除结点的操作即可。代码范例添加操作过程图解代码实现删除操作过程图解代码实现...原创 2020-08-04 23:39:00 · 705 阅读 · 1 评论 -
数据结构与算法-图论的基础入门
图可以应用的场景交通运输 网络 脑区活动等图的基本概念图的分类无向图 有向图无权图 有权图(即图的边有数值)图的连通性从一点是否可以到达另一点的路径平行边和自环边图的表达形式邻接矩阵如下图所示,适合表示稠密图的情况,即两两相连的图邻接表如下图所示,适合表示稀疏图图的实现稠密图package com.study.graphDemo;import java.util.Vector;/** * 稠密图 用邻接矩阵来表示 */public class DenseG原创 2020-09-07 15:08:22 · 194 阅读 · 0 评论 -
数据结构与算法-递归思想
递归将问题转化为更小的同一问题范例sum求和如下所示,将一个庞大的转化成若干个小问题递归本质就是一个函数,我们在编程中不要特别纠结递归,把递归当作一个子函数即可。 // 计算arr[l...n)这个区间内所有数字的和 private static int sum(int[] arr, int l){ if(l == arr.length)//终止条件 return 0; return arr[l] + sum(arr, l + 1)原创 2020-08-13 11:31:25 · 107 阅读 · 0 评论 -
数据结构与算法-双向链表知识详解
概述鉴于党项链表添加、修改等操作的复杂度,我们可以使用双向链表提升链表的综合性能双向链表的实现原创 2020-08-04 10:59:30 · 779 阅读 · 0 评论 -
数据结构与算法-Trie树添加与搜索
trie树的使用场景我们若需要制作一个通讯录的软件,使用常规树结构查询的复杂度为O(logn),但trie树的复杂度确与数据多少无关,与单词长度有关,这就大大缩减的查询的时间复杂度。trie树的基本实现基础结构package com.study.trieDemo;import java.util.TreeMap;/** * Created by Zsy on 2020/8/21. */public class Trie { private class Node {原创 2020-08-21 14:40:32 · 135 阅读 · 0 评论 -
数据结构与算法-最小生成树入门
先行知识带权图如下图所示,边有权值的图就是带权图带权邻接矩阵带权邻接表最小生成树概念一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边最小生成树常用场景电缆设计网络设计电路设计实现先行补充本次设计默认图为连通图,针对的图是带权无向图实现方式切分定理任意切分,横切边中权值最小的边必然属于最小生成树prim算法(lazy prim)复杂度O(edge log ^edge)实现图解如下图所示,从0点原创 2020-09-09 15:52:10 · 206 阅读 · 0 评论 -
数据结构与算法-并查集多种实现以及优化步骤
并查集所解决的问题网结构连接网结构各个结点是否连接实现常规实现接口设计public interface UF { public int getSize(); public boolean isConnected(int id1,int id2); public void unionElements(int id1,int id2);}实现思路用一段连续的地址空间,索引所谓键,值则是代表他们所在的集合对应的值。若要连接两个结点,就需要将一个堆元素移动到另一原创 2020-09-01 10:38:16 · 263 阅读 · 0 评论 -
数据结构与算法-排序进阶入门
归并排序简介归并排序整体排序方式就是先向底分开,再向上归并,下图即可看出与平方阶的差距,因为有n个元素递归次数为logn,所以归并排序是nlogn级别的排序实现代码package com.study.sortAdvDemo;import java.util.Arrays;public class MergeSort { /** * 归并拍排序 * * @param arr */ public static void sort(Com原创 2020-09-06 16:22:39 · 155 阅读 · 0 评论 -
数据结构与算法-线段树(segment-tree)
为什么要使用线段树若要查询某个区间的情况时,使用普通数组查询和更新时间为O(n)而线段树只需要O(logn)线段树图线段树特点线段树不是完全二叉树线段树是平衡二叉树线段树的实现这里我们使用数组的实现,由于线段树区间是固定的,所以不涉及插入操作,我们可以按照如下如推到得出通用的线段树空间计算公式:解: 线段树如上图所示,也是二叉树,所以每一层的节点树为2 ^(h-1) 所以每个线段树的最后一层节点数最多是2^(h-1) 由二叉树求节点数公式为:2^h -1 所以线段树从第一层到原创 2020-08-19 23:09:38 · 169 阅读 · 0 评论