数据结构与算法
数据结构与算法
红桃六
这个作者很懒,什么都没留下…
展开
-
数据结构与算法-总结-大纲
数据结构与算法-总结-大纲原创 2021-01-10 19:00:11 · 176 阅读 · 0 评论 -
数据结构与算法-二叉树,前序,后续,中序遍历
树的几个重要元素1,节点:树里面的元素2,父子关系:节点之间相连的关系3,子树:当节点大于1是,其余不相交的节点的集合称作子树4,度:一个节点拥有子树的数量称作度5,孩子:节点的子节点6,双亲节点7,兄弟节点9,森林:由N个不相交的树组成节点的高度:节点到叶子节点的最长路径节点的深度:根节点到该节点的边个数节点的层数:节点的深度+1树的高度:根节点的高度二叉树1,每个节点最多有两个节点2,第N层最多有2^(N-1)个节点满二叉树:除叶子结点外,每个结点都有左右两个子结点。完原创 2020-12-28 11:51:44 · 215 阅读 · 0 评论 -
数据结构与算法-算法的魅力-一行代码性能提升千百不止
无意计算机底层原理及JVM底层后,就发现一行代码竟然会让系统性能提升一千倍不止。不是吹牛,本人亲测优化后:唯一的区别就是将临时变量提取出来,如果是200w+数据,第一种方式需要很久很久很久才会出结果,而加了临时变量后,性能提升千倍不止;原因分析:频繁的开辟新的空间导致JVM频繁的垃圾回收,导致运行效率下降个人建议:在开发中如果需要用到临时变量,最可能避免频繁的开辟大空间,销毁空间,这对系统性能提升有很大很大的帮助接下来看下归并排序优化前package edu.sort;import java原创 2020-12-22 14:14:53 · 191 阅读 · 0 评论 -
数据结构与算法-贪心算法
贪心算法的套路:一定会有一个排序。哈夫曼编码,贪心算法,压缩算法。最短路径贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。贪心算法其最重要的两个点就是:贪心策略:排序通过局部最优解能够得到全局最优解一般通过以下问题就可以通过贪心算法解决:1.针对某个问题有限制值,以及有一个期望的最好结果,通常是从某些数据中选出其中一些,达到最好的结果。2.一般会有一个排序,找出贡献最大的。3.举例看贪心原创 2020-12-21 21:00:03 · 318 阅读 · 0 评论 -
数据结构与算法-插入,冒泡,选择,希尔,归并,快速排序优缺点及使用场景
常见的算法对比如下如何选择使用什么排序算法1 分析场景:稳定还是不稳定2.数据量:数据量小的时候选什么?比如就50个数,优先选插入,数据量比较大如(5000*5000=25000000)则选择其他排序3.分析空间:综上所述,没有一个固定的排序算法,都是要根据情况分析的。但是如果你不会分析的情况下 选择归并或者快排。C++ qsort:快排+插入排序jdk里面有arrays.sort:一种是基础类型,int double 用的快排。对象排序,用的是归并+timeSort...原创 2020-12-20 18:43:20 · 498 阅读 · 0 评论 -
数据结构与算法-冒泡排序
核心思路:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。package edu.sort;import cn.hutool.core.util.ArrayUtil;/** * 冒泡排序 * 时间复杂度:O(n^2) * 空间复杂度:O(n) * 思路:冒泡排序智慧操作相邻的的两个数据, * 每次冒泡操作都会对相邻的两个.原创 2020-12-20 18:39:38 · 259 阅读 · 0 评论 -
数据结构与算法-插入排序
1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素2.到未排序段取元素插入到已排序段,并保证插入后仍然有序3,重复执行上述操作,直到未排序段元素全部加完。循环次数:2,时间复杂度:n^2最好的情况 O(n)最坏的情况 O(n^2)package edu.sort;/** * 插入排序 * * @author: LHT * @date: 2020/12/14 14:44 */public class InsertionSort { /** .原创 2020-12-20 18:38:03 · 194 阅读 · 0 评论 -
数据结构与算法-快速排序
1.时间复杂度:nlogn 最坏的情况就是O(n^2)2.空间复杂度:O(n)3.稳定性:不稳定4.快排和归并的对比:(1)归并排序的处理过程是由下到上的,先处理子问题,然后再合并。(2)快排其实就是从上到下,先分区,在处理子问题,不用合并。其优化就是优化基准数,提供一个取三个数中间的思路.package edu.sort;import cn.hutool.core.util.ArrayUtil;/** * 快速排序 * 核心概念:基准数。一般取第一个。 * 第一遍对比,结果原创 2020-12-20 18:36:21 · 432 阅读 · 4 评论 -
数据结构与算法-插入排序和归并排序
常见的算法快速排序、冒泡排序,希尔排序,二分排序(二路归并)(nlogn),桶排序,堆排序,基数排序插入,希尔,归并选择,冒泡,快速堆排序:##分析算法的指标1,时间效率2,空间复杂度3,比较次数和交换次数4,稳定性1 9 3 5 3第一种:1 3 3 5 9第二种:1 3 3 5 9哪一种是稳定的?相同的两个数排完序后,相对位置不变。意义:电商里面订单排序:首先会按金额从小到大排,金额相同的按下单时间。我从订单中心过来的时候已经按照时间排好序了。1插入排序假设有个这样的问原创 2020-12-14 16:48:36 · 272 阅读 · 0 评论 -
数据结构与算法-递归思想,及使用场景和优化思路
什么情况下可以使用递归1,一个问题可以分解为几个子问题的解,我们可以通过分治思想将一个数据规模大的问题分解为很小的问题2,这个问题和分解之后的子问题,求解思路一样。3.一定有一个最后确认的答案,技递归的终止条件斐波那契数列1 1 2 3 5 8求解公式fn(n)=fn(n-1)+fn(n-2)package edu.rec;/** * 什么情况下可以使用递归 * 1,一个问题可以分解为几个子问题的解,我们可以通过分治思想将一个数据规模大的问题分解为很小的问题 * 2,这个问题和分解原创 2020-12-14 11:55:33 · 220 阅读 · 0 评论 -
Hash函数的整理和归纳,以及应用
1,加密:MD5,Hash加密算。存在密码冲突,128位的二进制串。不可逆。破解,将MD5密码库存起来了, 利用穷举列举出来2,怎么判断视频是否重复3,相似性检测,论文检测,指纹算法,每一个论文有一个指纹,计算汉明距离4,负载均衡,NGINX 两台机器计算IP落到那个机器上5,分布式系统:数据分库问题。10亿数据:hash()%10,将数据分配到10个库里面。分表问题,id%10 =()?出现的问题:动态扩容问题。查询问题。数据量很大。迁移问题6,一致性哈希,哈希环:假如有K个表,数原创 2020-11-29 14:20:27 · 341 阅读 · 0 评论 -
JVM垃圾收集器分带收集理论介绍
分代收集理论年轻代1,标记-复制,把存活的对象标记出来,复制到另外一个区域,然后把这个区域的全部删除缺点:1,标记的对象太多,效率不高老年代使用2,标记-清理(缺点,内存会有很多碎片,不易管理,性能高)3,标记-整理(内存中不会有碎片,但是性能低于清理)4,Serial垃圾收集器串行收集,stop the world,简单5,Paralle; 垃圾收集器串行收集,多线程性能高。默认线程数是和CPU核数一样的6,ParNew可以和 CMS配合使用,负责年轻代使用7,CMS垃圾收集器原创 2020-11-21 15:06:41 · 244 阅读 · 0 评论 -
多线程,厨师,饭店,工作之间到底有什么关系呢?
经常面试的时候,会被问到多线程!知道是怎么回事,但却用的很少。今天,小编带带着大家看看身边的多线程。先将一个工作中遇到的趣事把。 近期比较忙,也在学习多线程。 一日同事问我:你一天感觉好忙啊,那些事情不能一个个做么? 我看了他一眼,便问道:你知道**多线程**吗? 同事说:知道呀。用过不少。 我跟着说:我每天很忙的原因呢,是因为很多人同时找我解决需求。所以很忙。为什么不能一个个做呢?跟你打个比方吧,就跟饭店一样,同时去很多桌子客人,厨师为什么不一桌子一桌子上菜,而是一个桌子上一个呢?为了堵住每个.原创 2020-07-02 21:38:34 · 374 阅读 · 0 评论 -
基础数据结构与算法-数组,队列,链表,栈
package edu.stack;/** * @author: LHT * @date: 2020/12/13 11:38 */public class MyStack { String[] data = new String[1]; int index; /** * 入栈 * * @param value * @return */ public int push(String value) { .原创 2020-12-13 15:41:27 · 178 阅读 · 0 评论 -
数据结构与算法-链表
1.链表的定义链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。画图演示:2.特点(1)不需要连续的内存空间。(2)有指针引用(3)三种最常见的链表结构:单链表、双向链表循环链表和单向表类似,不过头尾相连(4)头结点:第一个节点(5)尾结点: 最后一个节点...原创 2020-12-12 16:20:32 · 374 阅读 · 0 评论 -
数据结构与算法-算法设计原则,评价算法的两个重要指标及时间复杂度计算的意义
1,设计原则正确性,可读性,健壮性,高效性与低内存内存占用小,CPU占用最小,运算最快2,评价算法的两个重要指标时间复杂度:运行一个程序所需要的时间 O空间复杂度:运行一个程序索引需要的空间 OOM3,账时间复杂度计算的意义?怎么测试接口的性能?压测,冒烟,要依赖测试环境,流程长,规模和数据不准确比如排序算法:123 、321 效率不一样一个数和1亿个数不一样。导致结果不准确。所以需要自己计算时间复杂度时间复杂度表达方式:O(n) O(ologn)...原创 2020-12-12 16:04:37 · 2344 阅读 · 0 评论 -
数据结构与算法-基础数据结构-数组
数据结构与算法(基础数据结构-数组)1.数组的定义所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。int 的数组你就不能存float 也不能存double数组是用于储存多个相同类型数据的集合。通常用Array表示,也称原创 2020-12-12 16:03:21 · 240 阅读 · 0 评论 -
JAVA面试题,判断一个数是否是2的N次方
1,while(n>1){n%2==0;//不等于0,肯定不是,等于0及,n=n/2;}2,位运算1: 012:103: 0114: 1007: 01118: 1000判断方法if(n&(n-)==0) 是 否则 不是代码/** * 高效率和低内存 * 判断一个数是否是2的N次方 */public class ACM2N { /** * 1: 01 * 2:10 * 3: 011 * 4: 100原创 2020-12-07 21:25:52 · 727 阅读 · 0 评论 -
常见算法的思想,面试必备
树的遍历算法前序遍历(Pre-Order Traversal)对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子。以上图为例,递归的过程如下:(1):输出 1,接着左孩子;(2):输出 2,接着左孩子;(3):输出 4,左孩子为空,再接着右孩子;(4):输出 6,左孩子为空,再接着右孩子;(5):输出 7,左右孩子都为空,此时 2 的左子树全部输出,2 的右子树为空,此时 1 的左子树全部输出,接着 1 的右子树;(6):输出 3,接着左孩子;(7):输出 5,左右孩原创 2020-05-17 15:45:24 · 384 阅读 · 0 评论 -
令牌算法和 漏桶算法思想精髓
令牌算法思想是:令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃;请求要消耗等比例的令牌才能被处理;令牌不够时,请求被缓存。漏桶算法思想是:水(请求)从上方倒入水桶,从水桶下方流出(被处理);来不及流出的水存在水桶中(缓冲),以固定速率流出;水桶满后水溢出(丢弃)。这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的从作用上来说,漏桶和令牌桶算法原创 2020-05-17 14:43:35 · 864 阅读 · 0 评论