数据结构与算法
小钢炮vv
这个作者很懒,什么都没留下…
展开
-
LRU算法
LRULRU算法可以用于内存淘汰策略,策略是最近最少使用,使用双线链表可以轻松满足这个要求,新元素插入表头,元素被get将其移动到表头,淘汰表尾元素,缺陷在于会有大量的内存碎片和指针内存消耗、内存拷贝,查找、删除时间复杂度都为O(n),因为要遍历查找相应元素。双向链表+hash的方式可以解决这些问题,使得插入、查找、删除都是O(1)LRU实现// 双向链表结点type dllNode struct { value interface{} prev, next *dllNode}/原创 2021-05-21 11:24:42 · 238 阅读 · 0 评论 -
跳表
顺序数组可以使用二分法快速搜索到元素,但是顺序链表需要遍历才能找到相应元素。插入、删除同理,跳表可以对链表进行优化,使得插入、查找、删除的时间复杂度都为nlogn,其原理在于使用多级索引参考:数据结构之跳表golang 实现:package mainimport ( "fmt" "math/rand" "time")type List interface { Insert(data int) Delete(data int) bool Search(data int)}ty原创 2021-05-17 11:46:53 · 207 阅读 · 0 评论 -
最短路径算法
迪杰斯特拉算法思想:先找到所有点中路径最小的,再以路径最小的点作为中转站,遍历在当前已经查找到的基础上的查找更小的路径// 最短路径算法// 可以使用一个三角形形式进行记忆public class ShortestPath { public static int INF = Integer.MAX_VALUE; // param // @adjMatrix:邻接矩阵 // @v0:查找v0到各个点的最短路径 public static int[] dijks原创 2021-02-22 14:05:37 · 266 阅读 · 0 评论 -
最小生成树
参考:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175最小生成树图的最小生成树是不重复的连接所有顶点所花的最低成本如上图中图,最小生成树为粗黑线的边集合Prim算法思想:{V}为已生成树的集合,lowcost保存每个顶点与已生成树集合中的所有顶点中最低的成本,adjvex保存每个顶点与{V}集合中最低成本关联的顶点,每次从lowcost中找到最低成本,在adjvex找到对应的关联的顶点加到集合{V}中,然后重置原创 2021-01-20 19:36:27 · 100 阅读 · 1 评论 -
邻接表、邻接多重表、十字链表实现图
邻接表实现相对简单// 邻接表实现(adjacency list)// B----A// | |// D----Cpublic class AdjList { private VexNode[] vexs;// 顶点数组 // 顶点表 private class VexNode{ int data;// 顶点值 Edge firstEdge;// 指向第一条边 public原创 2021-01-16 17:58:36 · 330 阅读 · 0 评论 -
线索二叉树
假设二叉树有n个结点,那么就有2n个指针域(左、右),n-1个连接分支线,意味着只有n-1个指针域得到利用,有2n-(n-1)个指针域为空指针域占用空间线索二叉树线索二叉树就是解决普通二叉树的空间利用率不够的问题。普通二叉树没有前驱和后继保存。刚好可以利用空指针域保存前驱和后继,当左指针域为空指针域时将左指针域指向它的前驱,当右指针域为空时指向该结点的后继。为了区分指针域此时是前驱后继还是指向左子树右子树,那么就需要添加一个标志,标注此时指针域的状态。当指针域指向前驱后继时,可以很方便的查找到它的下一原创 2021-01-11 09:36:07 · 197 阅读 · 0 评论 -
KMP算法next数组
暴力法求解模式匹配example:S:A B C A B C A B C ...T:A B C A B X如果使用暴力法S匹配T,当主串指针为6(均以1开始计数)、模式串指针为6时不匹配,此时主串指针会回溯到2,T指针回溯到初始位置0,重新开始比较。最终匹配到如下位置:S:A B C A B C A B C ...T: A B C A B X思想example:S:a b c d e f g h i j k l m nT:a b c d e aKMP算法使得主串指针i不进行回原创 2021-01-04 16:52:09 · 297 阅读 · 0 评论 -
排序-优先队列
优先队列很多时候我们可能需要处理有序的元素,但是并不需要全部有序,可能只需要取出某个优先级较高的元素(最大优先队列),只处理当前键值较大元素,API为插入元素和删除最大元素。这种数据类型为优先队列。API:public class MaxPQ<Key extends Comparable<Key>> { // 创建一个优先队列 public MaxPQ(){} // 创建一个初始容量为max的优先队列 public MaxPQ(int max){原创 2020-06-13 11:40:33 · 294 阅读 · 0 评论 -
排序-快速排序
快速排序public class Quick { private Quick(){} private static boolean less(Comparable v,Comparable w){ return v.compareTo(w)<0; } private static void exch(Comparable[] a,int vIndex,int wIndex){ Comparable temp = a[vIndex];原创 2020-06-12 11:50:19 · 130 阅读 · 0 评论 -
排序-归并排序
归并排序public class Merge { private static Comparable[] aux; private Merge(){} private static boolean isSorted(Comparable[] a){ for(int i=1,len=a.length;i<len;i++) if(less(a[i],a[i-1])) return false; return true;原创 2020-06-11 12:07:10 · 113 阅读 · 0 评论 -
排序-希尔排序
希尔排序public class Shell { private Shell(){} public static void sort(Comparable[] a){ int N = a.length; int h = 1; while (h<N/3) h =3*h + 1; while (h>=1){ for(int i=h;i<N;i++){ for原创 2020-06-10 13:29:19 · 176 阅读 · 0 评论 -
排序-插入排序
插入排序public class Insertion { private static boolean less(Comparable v,Comparable w){ return v.compareTo(w)<0; } private static void exch(Comparable[] a,int vIndex,int wIndex){ Comparable temp = a[vIndex]; a[vIndex]原创 2020-06-09 21:08:07 · 100 阅读 · 0 评论 -
排序-选择排序
前言java中排序通过Comparable接口实现,Integer、Double、String、Date、File等都实现了Comparable接口,此类数据类型可以通过v.compareTo(w)进行比较。在研究排序算法时的成本模型为比较和交换的数量,一些不存在交换的算法通过访问数组的次数进行统计选择排序/** name:选择排序** 成本模型:交换和比较的次数,如果没有则使用数组访问的次数* 策略:通过循环找出最小的值并与第一个值交换,接着在剩下的* 值中找出最小的值并与第二原创 2020-06-09 11:55:41 · 107 阅读 · 0 评论 -
union-find问题
问题具有N个触点,接近的两个节点间可以相连接,连接的通道称为一个分量,传入两个点,判断是否相连,如果没有相连则连接。最后可以返回连通分量的数量,刚开始数量为N,每一个触点都是独立的分量,基本除了过程如下quick-find算法/** name:union-find问题** description:Union-find 问题quick-find方案,判断是否相连,查找已知相连的分量** 成本模型:数组的访问** find快,但是union需要遍历整个数组,比较慢* */public原创 2020-06-08 21:09:25 · 140 阅读 · 0 评论 -
二分查找的时间复杂度
时间复杂度:算法最复杂情况下的运行时间,在很多情况下是意义不大的,算法不能单纯看最坏的情况增长数量级:结合成本模型下的算法运行时间,成本模型是指确切的指标,比如访问数组的次数二分查找public class BinarySearch { private BinarySearch(){} public static int rank(int key,int[] arr){ int lo = 0; int hi = arr.length-1;原创 2020-06-08 17:07:27 · 3669 阅读 · 0 评论 -
栈、队列、背包(基本集合数据结构)
前言栈、队列、背包都是基本的数据结构,栈遵循LIFO(后进先出的原则),队列遵循FIFO(先进先出)。背包类似栈,但是不像队列和栈一样强调顺序,并且,只进不出,用于不强调顺序的集合。栈java中存在栈的数据结构,但是不推荐使用,其也实现了从栈尾添加的功能,宽接口设置,并不符合栈的特点。import java.util.Iterator;// 使类可迭代需添加Iterable接口public class ResizingArrayStack<Item> implements Iter原创 2020-06-01 10:38:49 · 272 阅读 · 0 评论 -
牛顿迭代法求平方根
问题算法一书中,提到求平方根的方法sqrt用到了牛顿迭代法牛顿迭代法很多方程在求解根时比较困难(或者说求解精确根比较款那),并且我们经常会遇到求平方根无法直接得出结果的时候,牛顿迭代法就发挥了作用,牛顿迭代法的思想主要是利用切线方程无限逼近的特点求得结果,用于获取近似根。假设有f(x)=(x-2)^2,用牛顿迭代法求根((x-2)^2=0)过程如下:选取一点做切线,然后作垂线交曲线于另...原创 2020-05-01 14:37:11 · 1296 阅读 · 0 评论 -
二叉树的创建与方法
二叉树是一种重要的数据存储结构,它体现了一对多的数据存储方式,一颗二叉树有一个根节点(root),与众多分结点组成,每个双亲最多有两个子树分为左子树和右子树,结点的分支数称为这个结点的度,整个二叉树的度为最大的度.度为0的结点称为叶结点.满二叉树与完全二叉树满二叉树每个层级的结点都达到最大完全二叉树必须从左到右依次排序,造成只能右边存在缺失(如果左边缺失势必造成不是正确的排序)二叉树...原创 2019-11-02 14:09:40 · 470 阅读 · 0 评论