![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
ambitfly
这个作者很懒,什么都没留下…
展开
-
Java中图的通用数据结构实现、接口函数、宽度优先和深度优先遍历
由于图的表达形式多种多样,如果没有一个统一的数据结构描述图,那么解题的时候就要对每一种图的数据结构实现一套对应的算法。所以要构建一套通用的结构函数,把多种多样的图转化为上面图的数据结构,每次都使用上面的数据结构解题即可。 图的宽度优先遍历(BFS)算法是一个分层搜索的过程,和树的层序遍历算法相同。(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。下面的代码构建的图是有向图,加权图,非连通图(可能存在孤立的点)原创 2023-01-05 11:23:33 · 435 阅读 · 0 评论 -
链表经典算法题目
思路:利用一个map,把原链表的Node当作key,新复制的Node当作value,然后利用Map的映射关系把原链表的Node的next和random复制到新复制的Node中。思路: 在Node后面串一个复制的Node,然后给复制的Node的random赋值,把复制的Node从老链表里拆出来。思路:使用快慢指针,找到中间的节点,然后从中间节点反转链表,头尾同时遍历比较,最后再把反转的链表恢复过来。对于这种比较简单的题目,想要出彩,就要考虑优化的点,考虑空间复杂度,压缩空间。函数,复制一个复杂链表。原创 2022-11-27 01:31:47 · 470 阅读 · 0 评论 -
堆排序桶排序
堆排序实现思路 用数组模拟完全二叉树,第i个下标的左子节点为2i+1,第i个下标的右子节点为2i+2,父节点为(i-1)/2 往大顶堆或小顶堆插入元素时,把元素插入最后面,然后和父节点比较,如果是大顶堆,大于父节点就交换,然后父节点变为当前节点继续和父节点比较,小与父节点停止,大顶堆构建完成,如果大于继续和父节点交换,重复此动作直到顶节点。 改变顶的元素,如果一个大顶堆的顶元素变大,执行类似于插入的操作,和父节点比较交换, 一个大顶堆的顶元素变小,找到自己的子节点最大的节点,和它比较,如果它比子节点小,交换原创 2022-03-15 23:56:01 · 183 阅读 · 0 评论 -
KMP算法
KMP算法核心,部分匹配值表 package com.ambitfly.datastruct; public class KMPALg{ public static void main(String[] args){ String str1 = "ABCABDABCABDABCABC"; String str2 = "ABCABDABCABC"; System.out.println(kmpSearch(str1, str2)); } public原创 2021-02-26 16:38:39 · 76 阅读 · 0 评论 -
LRU算法手写双向链表
LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。 哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。 这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1)O(1) 的时间内完成 get 或者 put 操作。具体的方法如下: 对于 get 操作,首先原创 2021-02-25 23:06:58 · 309 阅读 · 0 评论 -
归并排序
public class Test{ public static void main(String[] args){ int[] arr = {11,6,5,7,9,2,3,15,17}; int find = 10; } public static void mergeSort(int[] arr){ int[] temp = new int原创 2021-02-25 10:56:39 · 60 阅读 · 0 评论 -
二分查找
public class Test{ public static void main(String[] args){ int[] arr = {1,3,5,7,9,10,11,15,17} int find = 10; } public static int binarySearch(int[] arr,int find){ int left = 0;原创 2021-02-25 10:54:59 · 56 阅读 · 0 评论 -
快速排序java实现
代码 package cn.hpu.sort; import java.util.Arrays; import org.junit.Test; public class QuickSort { public void quickSort(int arr[]){ if(arr.length<2) return;//如果数组长度为1或为空直接返回 int max = 0;...原创 2019-03-01 16:03:05 · 141 阅读 · 0 评论 -
希尔排序java实现
思路: 比如,我们有1000个数据项需要排序,利用h=3*h+1产生的间隔序列为:1,4,13,40,12,121,364,1093,3280…0000000000 364就是第一轮排序的步长,接下来依次是121,12… 1.确定第一次排序的步长h 2.排序 —while(结束条件步长为零) --------for ---------------对从第一对到第h对拆分的数组排序 ---------...原创 2019-02-28 22:45:09 · 131 阅读 · 0 评论 -
单链表Java实现
链表是一种插入和删除都比较快的数据结构,缺点是查找比较慢。除非需要频繁的通过下标来随机访问数据,否则在很多使用数组的地方都可以用链表代替 在链表中,每个数据项都包含在“链结点”中,一个链结点是某个类的对象。每个链结点对象中都包含一个对下一个链接点的引用,链表本身的对象中有一个字段指向第一个链结点的引用 在数组中,每一项占用一个特定的位置,这个位置可以用一个下标号直接访问,就像一排房子,你可以凭房间...翻译 2019-02-11 16:32:36 · 259 阅读 · 0 评论 -
循环列队和优先级列队java实现
循环列队 public class Queue { private int[] queueArray; private int maxSize; private int front;//队列首指针 private int end;//队列尾指针 private int length;//队列长度 //构造函数 public Queue(int maxSize){ this....原创 2019-02-09 12:57:30 · 171 阅读 · 0 评论 -
数据结构之栈Java实现及分配符匹配
数据结构之栈Java实现及分配符匹配 数组、链表、树等数据结构适用于存储数据库应用中的数据记录,它们常常用于记录那些现实世界的对象和活动的数据,便与数据的访问:插入、删除和查找 而栈和队列更多的是作为工具来使用。他们主要作为构思算法的辅助工具,而不是完全的数据存储工具。这些数据结构的生命周期比那些数据库类型的结构要短很多。在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当任务完成后就...原创 2019-02-08 16:05:58 · 205 阅读 · 0 评论