数据结构和算法
文章平均质量分 60
数据结构和算法
古月日月衣羊
博观而约取,厚积而薄发
展开
-
【排序算法】排序算法-桶排序(Bucket Sort)
排序算法-桶排序概述例子桶排序 - 实现复杂度概述执行流程创建一定数量的桶(比如用数组、链表作为桶)按照一定的规则(不同类型的数据,规则不同),将序列中的元素均匀分配到对应的桶分别对每个桶进行单独排序将所有非空桶的元素合并成有序序列例子需要对下图中的元素进行排序,采用元素值*元素数量的规则寻找元素在桶中的索引,将其放入到对应的桶中分别对每个桶进行单独排序将所有非空桶的元素合并成有序序列桶排序 - 实现复杂度...原创 2022-01-19 21:41:20 · 418 阅读 · 0 评论 -
【数据结构】基环树(环套树)
基环树概念基环树相关问题转载自https://www.codetd.com/article/7620085概念具有N个点N条边的连通图,如果不保证连通,它就会称为基环树森林在有向图中,我们也有类似的概念。N个点、N条边、每个节点有且仅有一条入边的有向图就好像以“基环”为中心,有向外扩展的趋势,故称为“外向树”。N个点、N条边、每个节点有且仅有一条出边的有向连通图就好像以“基环”为中心,有向内收缩的趋势,故称为“内向树”。外向树和内向树也经常统称为“基环树”。如果不保证连通,那么N个点、N条边、每转载 2022-01-03 15:35:32 · 725 阅读 · 0 评论 -
【数据结构】并查集(Union Find)
并查集需求分析概述如何存储数据接口定义初始化为Quick Find和Quick Union定义抽象类Quick Find示例查找方法合并方法具体实现测试Quick Union示例需求分析假设有n个村庄,有些村庄之间有连接的路,有些村庄之间并没有连接的路设计一个数据结构,能够快速执行两个操作查询2个村庄之间是否有连接的路连接2个村庄数组、链表、平衡二叉树、集合(Set)?查询、连接的时间复杂度都是: O(n)并查集能够办到查询、连接的均摊复杂度都是O(α(n)), α原创 2021-12-31 13:58:05 · 668 阅读 · 0 评论 -
【数据结构】Trie
Trie需求简介接口设计实现类测试类总结需求如何判断一堆不重复的字符串是否以某个前缀开头?用Set\Map存储字符串遍历所有字符串进行判断时间复杂度: O(n)有没有更优的数据结构实现前缀搜索Trie简介Trie 也叫做字典树、前缀树(Prefix Tree)、单词查找树Trie搜索字符串的效率主要跟字符串的长度有关假设使用Trie存储cat、dog、doggy、does、cast、add六个单词接口设计或者实现类public class Trie<原创 2021-12-28 14:58:28 · 297 阅读 · 0 评论 -
【排序算法】排序算法-计数排序(Counting Sort)
计数排序概述核心思想执行流程示例代码(版本1)测试存在问题代码(版本2)(解决上面的问题)复杂度测试执行流程(图解)使用场景概述冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于比较的排序平均复杂度最低是O(nlog(n))计数、桶、基数排序,都不是基于比较的排序是典型的空间换时间,在某些时候,平均时间复杂度可以比O(nlog(n))更低核心思想统计每个整数在序列中出现的次数,进而推导出每个整数在有序序列中的索引执行流程首先需要找出需要排序的数组或者集合arr中的原创 2021-12-28 00:24:43 · 324 阅读 · 0 评论 -
Arrays.sort底层原理
Arrays.sort源码剖析概述案例运行结果1 进入Arrays.sort()方法方法上的注释2 进入DualPivotQuicksort类内部的静态方法sort方法上的注释3. 走sort的流程1. 排序范围小于286的数组使用快速排序2. 进入sort方法,判断数组长度是否小于47,小于则直接采用插入排序,否则执行3。3. 用公式length/8+length/64+1近似计算出数组长度的1/7。4. 取5个根据经验得出的等距点。5.将这5个元素进行插入排序6. 选取a[e2],a[e4]分别作为pi原创 2021-12-17 22:16:11 · 1932 阅读 · 0 评论 -
图的入门学习
图数据结构物回顾相关概念图有向图出度、入度无向图混合图简单图、多重图无向完全图有向完全图有权图连通图连通分量强连通图强连通分量图的实现方案邻接矩阵邻接矩阵 - 有权图邻接表邻接表 - 有权图实现图Graph接口ListGraph类测试类测试生成图测试删除边测试删除顶点数据结构物回顾线性结构: 数组、链表、栈、队列、哈希表树形结构: 二叉树、B树、堆、Trie(字典树)、哈夫曼树、并查集图形结构相关概念图图由顶点(vertex)和边(edge)组成,通常表示为G=(V,E)G表示一个图,原创 2021-12-15 23:10:07 · 945 阅读 · 0 评论 -
【排序算法】排序算法-拓扑排序
拓扑排序相关概念AOV网拓扑排序实现思路实现过程代码测试测试类测试样例相关概念AOV网一项大的工程常被分为多个小的子工程子工程之间可能存在一定的先后顺序,即某些子工程必须在其他的一些子工程完成后才能开始在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,子工程被称为活动(Activity)以顶点表示活动、有向边表示活动之间的先后关系,这样的图简称为AOV网标准的AOV网必须是一个有向无环图(Directed Acyclic Graph, 简称 DAG)拓扑排原创 2021-12-15 22:31:27 · 1369 阅读 · 0 评论 -
【排序算法】排序算法-堆排序(Heap Sort)
堆排序概述执行流程代码概述堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。执行流程将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前原创 2021-12-11 01:15:04 · 838 阅读 · 0 评论 -
【排序算法】排序算法-快速排序(QuickSort)
排序算法-快速排序代码时间复杂度代码public class QuickSort { public static void main(String[] args) { int[] arrays = {49,38,65,97,76,13,27,49}; System.out.println("快速排序之挖坑排序前的数组:" + Arrays.toString(arrays)); QuickSort.quickSort(arrays);原创 2021-11-05 21:23:39 · 179 阅读 · 0 评论 -
动态规划入门
动态规划入门一、动态规划题目特点二、动态规划组成部分问题2.1 组成部分1: 确定状态最后一步子问题递归解法递归解法的问题2.2 组成部分2: 转移方程2.3 组成部分3: 初始条件和边界情况2.4 组成部分4: 计算顺序小结一、动态规划题目特点计数有多少种方式走到右下角有多少种方法选出k个数使得和是Sum求最大最小值从左上角走到右下角路径的最大数字和最长上升子序列长度求存在性取石子游戏,先手是否必胜能不能选出k个数使得和是Sum二、动态规划组成部分问题你有原创 2021-10-30 18:41:25 · 2026 阅读 · 0 评论 -
哈希表总结
哈希表哈希表哈希函数哈希碰撞拉链法线性探测法常见的三种哈希结构哈希表经典题目数组作为哈希表set作为哈希表map作为哈希表总结转载大佬的博客哈希表首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。哈希表是根据关键码的值而直接进行访问的数据结构。这么这官方的解释可能有点懵,其实直白来讲其实数组就是一张哈希表。哈希表中关键码就是数组的索引下表,然后通过下表直接访问数组中的元素,如下图所示:那转载 2021-10-19 11:39:35 · 147 阅读 · 0 评论 -
链表总结篇
链表总结篇链表的理论基础什么是链表链表的类型单链表双链表循环链表链表的存储方式链表的定义链表的操作删除节点添加结点性能分析链表经典题目虚拟头结点链表的基本操作反转链表删除倒数第N个结点链表相交环形链表转载大佬的博客链表的理论基础什么是链表什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点是又两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链接的入口点称为列表的头结点也就是head,链表的空间是不连续的。如图所示:链转载 2021-10-18 12:19:25 · 78 阅读 · 0 评论 -
数组相关算法总结
文章目录数组定义数组的经典题目二分法双指针法滑动窗口模拟行为数组定义数组是存放在连续内存空间上的相同类型数据的集合举一个字符数组的例子,如图所示:需要注意的两点是:数组下标都是从0开始的数组内存空间的地址是连续的正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。数组的经典题目二分法leetcode704-二分查找时间复杂度: O(N)双指针法leetcode27-移除元素双指针法(快慢指针法):通过一个快指针和慢指针在一个原创 2021-10-16 21:22:18 · 156 阅读 · 0 评论 -
【排序算法】排序算法-归并排序(Merge Sort)
排序算法-归并排序归并排序介绍从下往上的归并排序从上往下的归并排序归并排序实现从上往下部分从下往上部分归并排序的时间复杂度和稳定性归并排序时间复杂度归并排序稳定性java代码实现转载将两个的有序数列合并成一个有序数列,我们称之为"归并"。归并排序(Merge Sort)就是利用归并思想对数列进行排序。归并排序介绍根据具体的实现,归并排序包括"从上往下"和"从下往上"2个部分。从下往上的归并排序将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这原创 2021-10-10 20:18:36 · 225 阅读 · 0 评论 -
栈(java实现)
package com.hmx.datastructure;/** * @program: datastructureandalgorithm * @description: * @author: hmx * @create: 2021-06-29 16:42 **/public class MyStack<E> { private Node<E> ...原创 2021-06-29 17:54:49 · 48 阅读 · 0 评论 -
队列(java实现)
package com.hmx.datastructure;import javax.xml.soap.Node;/** * @program: datastructureandalgorithm * @description: * @author: hmx * @create: 2021-06-29 17:07 **/public class MyQueue<E>...原创 2021-06-29 17:55:20 · 50 阅读 · 0 评论 -
LRU(Least Recently Used)(最近最少使用)
新数据插入到链表头部;每当缓存命中(即缓存数据被访问),则将数据移到链表头部;当链表满的时候,将链表尾部的数据丢弃。package com.hmx.algorithm;import java.util.HashMap;import java.util.Map;/** * @program: datastructureandalgorithm * @description...原创 2021-06-30 08:16:02 · 158 阅读 · 0 评论