数据结构和算法
数据结构和算法
科氏加速度
岁寒,然后知松柏之后凋也。
展开
-
剑指offer进阶版刷题记录
补充,图广度优先遍历邻接矩阵表示图。顶点出队后要用visited判断是否访问过,即使在入队前判断未访问才入队,也得在出队后判断,因为同一层可能有两个顶点关联的点是重复的,导致一个顶点重复入队。 /** * @description 广度优先,访问一个节点A后,依次访问与其相连的节点BC,再访问B C的相连节点 * @author PangTiemin * @date 2022/2/20 21:03 */ public void bfs(int[原创 2022-03-07 15:45:07 · 438 阅读 · 1 评论 -
约瑟夫杀人法
把人围成一个圈,隔固定间隔杀人,最后剩一个人。package com.data.structur.josephus;/** * @author :PangTiemin * @date :Created in 2021/7/14 18:04 * @description: 约瑟夫 * @modified By: */public class Josephus { int num = 20;//多少人 int m = 5;//数到多少就杀人 class Node原创 2021-07-14 18:34:41 · 224 阅读 · 0 评论 -
回溯、八皇后
正方形棋盘, 皇后的垂直、水平、对角线方向上 不能有其他皇后/** * @author :PangTiemin * @date :Created in 2021/7/11 11:08 * @description: 皇后的垂直、水平、对角线方向上 不能有其他皇后 * @modified By: */public class Queen { //方法个数 private static int num =0; //皇后个数 private static fin原创 2021-07-11 12:01:13 · 105 阅读 · 0 评论 -
动态规划,最长公共子序列、最长回文子串
目录最长公共子序列总结动态规划最长回文子串动态规划不同与排序那些固定解法,不同题有相似套路,不同的规律需要自己找最长公共子序列两个字符串,找出最长的公共部分,公共部分只需要保证字符顺序相同、不需要必须相连,比如"randomx","androidx",a an and ando andox都是公共子序列,最长的是andox.下图是计算的表达式,C[i,j],比如random是第一个字符串,i表示它的第几位,android是第二个字符串,j表示其第几位,C[i,j]表示第一个...原创 2021-05-13 17:28:58 · 157 阅读 · 0 评论 -
分治,循环赛日常表、棋盘覆盖
分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。循环赛日常表2的n次幂支球队打球,否则不适合分治。2的n次幂支球队,循环比赛,保证每只球队互相都打过一场。纵坐标球队名称,横坐标是第几天,球队1,在七天中分别和234568球队比赛,球队2在七天中依次和1436587球队比赛。如果像篮球圣诞大战,要给特殊队伍设置比赛,只需要把队的顺序换下,比如湖人本来是2,换成原创 2021-05-10 15:11:34 · 218 阅读 · 0 评论 -
贪心,背包问题
有一个背包能装40kg东西,有一些物品,重量和价值分别如下:价值:10, 40, 30, 50, 35, 40, 30重量:35, 30, 60, 50, 40, 10, 25怎样能拿可以让背包中物品价值最大,最值钱。先计算他们的性价比,价值/重量,优先拿性价比高的东西public class GreedyPackage { //背包容纳重量 private int MAX_WEIGHT = 40; //物品重量 private int weights[]原创 2021-05-07 16:43:03 · 128 阅读 · 1 评论 -
穷举:泊松分酒
有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。首先定义一套规则题目中的瓶子总共有三种,最大的A,中等的B,最小的C,我们规定:最大的瓶子只能往中等的瓶子倒;(若中等的瓶子为空)中等的瓶子只能往最小的瓶子倒;(若最小的瓶子不满)最小的瓶子只能往最大的瓶子倒;(若最小的瓶子已满)按照规则把所有情况列举出来即可,如果最后没倒成功,说明此规则对目标不可行。public class ShareW..原创 2021-03-04 10:16:29 · 1140 阅读 · 1 评论 -
递归:欧几里得算法、阶乘
欧几里得算法,又称辗转相除法: 如果m>n,m和n的最大公约数=n和 m%n的最大公约数证明过程:递归实现:public class Gcd { public int gcd(int m,int n){ if (n==0){ return m; }else { return gcd(n,m%n); } } public static void main(Stri原创 2021-03-03 10:37:42 · 576 阅读 · 0 评论 -
递归:汉诺塔(java)
A B C三个柱子。可以列举移动2个、3个盘子的步骤。规律是:n个盘子从A到C ==n-1个盘子借助C从A挪到B 第n个盘子从A挪到C n-1个盘子借助A从B挪到Cpublic class HanNota { private int count=1; // 核心思想: n个盘子从A到C== n-1个盘子借助C从A挪到B ; 第n个盘子从A挪到C ; n-1个盘子借助A从B挪到C //移动n个盘子,从from(A) 借助 dependOn(B) 移..原创 2021-03-03 10:05:59 · 80 阅读 · 0 评论 -
递归:二分法查找
一.概念前提,在一个有序序列中,寻找与目标元素相等的元素。确定该序列区间的中间位置K,将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]。b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将原创 2021-03-02 10:28:52 · 393 阅读 · 0 评论 -
排序算法比较
1.时间性能2.空间性能3.稳定稳定:两个关键字相等的记录,排序前后相对位置不变,只要举出一个反例,就是不稳定排序两个关键字排序:比如先按总分排、再按数学成绩排,总分一样,数学成绩高的在前,这类排序得用稳定排序4.最快有多少...原创 2021-03-02 09:37:34 · 88 阅读 · 0 评论 -
基数排序(java)
一.概念举例1:二.算法分析k是关键字个数,也是分配回收的趟数每一趟分配n个,回收m个,但回收其实要把全部元素放到一个序列中,所以回收也是n个。所以一趟回收和分配的时间复杂度是O(2n)即O(n),有k趟,时间复杂度为O(kn).对算法分析的案例:三.实现public class BaseSort { public static void main(String[] args) { int[] a = new int[]{1原创 2021-03-01 11:33:36 · 106 阅读 · 2 评论 -
归并排序(java)
一.概念案例:如何将两个有序序列归并为一个有序序列,两个序列本身有序二.实现public class MergeSort { public static void main(String[] args) { int a[] = new int[]{1, 6, 9, 4, 7, 3, 8, 2}; sort(a,0,a.length-1); int x=0; while (x<a.length){原创 2021-03-01 11:26:30 · 110 阅读 · 0 评论 -
选择排序(简单、堆排、java)
一.简单选择排序在待排序的数据中选出最大的元素放在最终位置。 而交换排序刚开始排序还不是最终位置。 public static void main(String[] args) { int arr[] = new int[]{1, 6, 9, 4, 7, 3, 8, 2}; for (int i = 0; i < arr.length; i++) { int index = i; int small .原创 2021-02-24 11:08:12 · 150 阅读 · 0 评论 -
交换排序(冒泡、快排、java)
一.概念两两比较,发生逆序则交换二.冒泡排序 public static void main(String[] args) { int arr[] = new int[]{1, 8, 6, 9, 9, 4, 7, 3, 8, 9, 3, 2, 7}; int n=arr.length;//n个数 int m; //m趟 for (m = 0; m < n - 1; m++) {原创 2021-02-06 11:13:23 · 139 阅读 · 0 评论 -
插入排序(直接、折半、希尔、java)
一.概念基本操作:插入位置:a[i]即将要插入的位置j,有可能是中间、开始、结尾。插入排序种类:按寻找插入位置划分二.直接插入排序普通和哨兵的代码效率分析原创 2021-02-04 17:33:42 · 217 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayList 还是把add方法上锁了,不像concurrentHashMap 是分段锁,只对线程操作的部分上锁。CopyOnWriteArrayList是一个有趣的例子,它规避了只读操作(如get/contains)并发的瓶颈,但是它为了做到这点,在修改操作中做了很多工作和修改可见性规则。 此外,修改操作还会锁住整个List,因此这也是一个并发瓶颈。所以从理论上来说...原创 2018-05-02 21:55:07 · 112 阅读 · 0 评论 -
HashMap的缺点
1.缺陷就在于其高度依赖hash算法,如果key是自定义类,你得自己重写hashcode方法,写hash算法。而且hashmap要求,存入时的hashcode什么样,之后就不能在变更,如果一个类的hashcode与其成员变量name有关,而之后name又发生了变化,那么hashmap行为将不正常。两个对象如果equals相同,那hashcode的值一定相同,如果hashcode值相同,对象不一定e...原创 2018-05-03 23:24:09 · 1928 阅读 · 1 评论 -
树(java)
以下哪些是树?三个都不是结点的度:结点拥有的子树数称为结点的度。度为0的结点称为叶子结点或终端结点,度不为0的结点称为非终端结点或分支结点。除根结点以外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。层次与深度:有序与无序树:森林:...原创 2018-05-10 11:58:50 · 3757 阅读 · 0 评论 -
HashCode的作用
转载:https://blog.csdn.net/zhangyuan19880606/article/details/51240372前言Object提供给我们了一个Native的方法“public native int hashCode();”,本文讲讲Hash是什么以及HashCode的作用Hash先用一张图看下什么是HashHash是散列的意思,就是把任意长度的输入,通过散列算法变换成固定长...转载 2018-05-04 10:14:10 · 109 阅读 · 0 评论 -
HashMap的keySet()和entrySet()实现原理
借鉴两篇文章:https://www.cnblogs.com/dsj2016/p/5551059.htmlhttps://blog.csdn.net/u013370551/article/details/77113154keySet() entrySet() 可以获得hashmap的key集合和键值对集合。keySet是父类AbstractMap的属性,entrySet是本身的属性,...原创 2018-05-04 11:51:22 · 5998 阅读 · 3 评论 -
LinkedHashMap双向链表
双链回环循环链表,名字相当唬人。首尾相接才算循环,但1.8这个没发现有首尾相接,LinkedList也没有LinkedHashMap,有两种排序,一种是顺序存储排序,像队列,先放入的元素在队头,后放入的元素在队尾,移除操作在队头进行。另一种是访问排序,被访问的元素放在队尾,没被访问的放队头,put get这些操作都算是访问1.顺序存储排序LinkedHashMap继承了HashMap,比其多了两个...原创 2018-05-04 16:28:16 · 3609 阅读 · 0 评论 -
线性表(java)
一。一些用到的概念数据结构:数据间一种或多种 特定关系 的元素的集合存储结构:1.顺序存储,数据是存放是连续的(美女来插队,所有人往后退一步) 2.链式存储,数据存放不是连续的,但之间有联系保证找到下一个数据,跟卧底一样,之间是单线联系()逻辑结构:数据对象中数据元素之间的相互关系,集合结构、线性结构、树形结构、图形结构物理结构(存储结构):1.顺序存储结构,数据是...原创 2018-04-29 10:42:40 · 3128 阅读 · 0 评论 -
二叉树(java)
用JAVA写二叉树public class BinaryTree { Node root; //得到树的深度 public Integer getHeight(){ return getHeight(root); } private Integer getHeight(Node node){ if(node==null) return 0; else{ ...原创 2018-05-13 11:10:10 · 3297 阅读 · 0 评论 -
栈和队列(java)
一.栈栈是限定仅在表尾进行插入和删除操作的线性表允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表栈的顺序存储结构:如用数组实现,栈底是:下标为0的一端栈的链式存储结构:链栈的入栈操作:链栈的出栈操作:Stack和VectorStack继承Vector,是栈结构,他们本质还是数组public class Vector<...原创 2018-04-29 17:13:51 · 180 阅读 · 0 评论 -
2-3树、红黑树、B树
2-3树转载https://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html二叉树对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。本文及后面文章介绍的平衡查找树的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证树在插入完成之后始终保持平衡状态,这就是平衡查找...原创 2019-03-22 22:04:23 · 480 阅读 · 0 评论 -
一套图 搞懂“时间复杂度”
写在前面:这篇文章是在公众号: 程序员小灰 中发布的。是我到目前为止所看到的关于时间复杂度介绍的最好的文章,简介 清晰 明了。所以拿来po出来 仅供学习交流,如侵则删。现已将此文收录至:《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理正文:时间复杂度的意义究竟什么是时间复杂度呢?让我们来想象一个场景...转载 2019-03-17 11:14:09 · 148 阅读 · 0 评论 -
HashMap jdk1.8
数组(桶)、链表、红黑树。数组里面是node节点,node实现Entry接口 static class Node<K,V> implements Map.Entry<K,V> { final int hash; //每个key的hash值 final K key; V value; Node<K,V...原创 2018-05-02 12:00:05 · 171 阅读 · 0 评论