算法
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
React-虚拟dom-diff算法,Levenshtein Distance最小编辑距离
Levenshtein Distance是最小编辑距离的一种实现,网上搜到的一些python的实现,现在用前端的JavaScript来实现一下。什么是最小编辑距离?请看斯坦福的课件。简单地说就是将string1变成string2需要的最少步骤。例如string1是abc,sting2是123abc。把string1变成string2的最小编辑距离是3,即新增1,新增2,新增3。例如string1是abc,string2是abd。把string1变成string2的最小编辑距离是1,即c替换成d。(也转载 2020-12-11 17:29:50 · 600 阅读 · 0 评论 -
BST删除操作(二叉搜索树)
BST的删除操作向来被认为难度很大,因为它不同于插入,定位到了那个该插入的位置选择左边/右边进行插入即可,而删除操作则需要分成以下三种情况进行讨论,删除难度从上到下依次递增:case1 叶子结点 case2 只有左子树/只有右子树的结点 case3 左子树和右子树都存在的结点其实case1,case2的难度系数都不大,重难点就是在于处理case3这种情况的结点case1 叶子结点直接将结点删除(树少了ta照样长得很茁壮,没有人会记得一片叶子的存在) case2 要删除的结点用一个指针进行保存转载 2020-08-27 20:31:40 · 780 阅读 · 0 评论 -
浅谈单链表与双链表的区别
昨天面试官面试的时候问了我一道关于链表的问题:情境如下面试官:请说一下链表跟数组的区别?我:数组静态分配内存,链表动态分配内存;数组在内存中连续,链表不连续;数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。根据以上分析可得出数组和链表的优缺点如下:数组的优点随机访问性强(通过下标进行快速定位) 查找速度快数组的缺点插入和删除效率低(插入和删除需要移动数据) 可能浪费内存(因为是连续的.转载 2020-08-23 09:59:21 · 724 阅读 · 0 评论 -
二叉搜索树详解(Java实现)
二叉搜索树定义#二叉搜索树,是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 任意节点的左,右子树也分别为二叉搜索树; 没有键值相等的节点。用Java来表示二叉树#public class BinarySearchTree{ // 二叉搜索树类 private class Node { // 节点类 int data; .转载 2020-08-16 10:27:11 · 641 阅读 · 1 评论 -
2020-08-16
BST的删除操作向来被认为难度很大,因为它不同于插入,定位到了那个该插入的位置选择左边/右边进行插入即可,而删除操作则需要分成以下三种情况进行讨论,删除难度从上到下依次递增:case1 叶子结点 case2 只有左子树/只有右子树的结点 case3 左子树和右子树都存在的结点其实case1,case2的难度系数都不大,重难点就是在于处理case3这种情况的结点case1 叶子结点直接将结点删除(树少了ta照样长得很茁壮,没有人会记得一片叶子的存在) case2 要删除的结点用一个指针进行保存转载 2020-08-16 08:41:22 · 569 阅读 · 0 评论 -
堆排序应用-优先级队列PriorityQueue源码分析
1. 回顾在上一篇文章中分享了堆这种数据结构,同时提到,堆可以用来对数据排序,也可以用来解决Top N、定时任务、优先级队列等问题,今天要分享的是Java中优先级队列PriorityQueue的源码实现,看看堆在Java中的实际应用。需要说明的是,本文与上篇文章:「重温《数据结构与算法》之堆与堆排序」密切相关。2. PriorityQueue优先级队列有两个常用的操作:向队列中添加元素、取出元素,这两个操作的方法为「add(E e)和poll()」,接下来将围绕这两个方法的源码展开。Pri.转载 2020-05-20 10:53:00 · 742 阅读 · 0 评论 -
重温《数据结构与算法》之堆与堆排序
1. 堆二叉树可以被细分为普通二叉树、满二叉树、完全二叉树,而今天所分享的堆这种数据结构就是一种完全二叉树。堆中的每个结点的值要么都大于左右子结点的值,要么都小于左右子结点的值。前者形成的是大顶堆,即堆顶元素是最大的;后者形成的是小顶堆,即堆顶元素是最小的。如下图所示,分表是一个大顶堆和小顶堆。堆❝完全二叉树的特点是:最后一层的叶子结点靠左排列,从根结点到倒数第二层结点,是一颗满二叉树。通常储存二叉树这种数据结构的方法有链式存储和顺序存储,链式存储就是通过指针来维护左右子结点的关系,而转载 2020-05-19 16:08:46 · 733 阅读 · 1 评论 -
最短路径问题——迪杰斯特拉算法(Dijkstra)
前段时间看到一篇文章,里面提到了统治世界的十大算法,其中之一就是迪杰斯特拉算法(Dijkstra),该算法主要解决的”最短路径“这一类问题。说法虽然夸张了点,但它在实际生活中确实应用广泛,例如地图软件等,大部分游戏中自动寻路等功能,使用到的 A*搜索算法也是基于迪杰斯特拉算法优化而来。那么迪杰斯特拉算法是如何实现的呢?假如我们现在有如下一个有向图,图中有 6 个顶点,编号分别为 1~6,带有箭头的直线表示的是能从一个顶点到达另外一个顶点,直线上的数字表示的是两个顶点之间的距离,现在求顶点 1 到顶点 6转载 2020-05-09 14:33:04 · 1148 阅读 · 0 评论 -
堆排序(大顶堆、小顶堆)----C语言
堆排序之前的随笔写了栈(顺序栈、链式栈)、队列(循环队列、链式队列)、链表、二叉树,这次随笔来写堆1、什么是堆?堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲堆其实就是利用完全二叉树的结构来维护的一维数组按照堆的特点可以把堆分为大顶堆和小顶堆大顶堆:每个结点的值都大于或等于其左右孩子结点的值小顶堆:每个结点的值...转载 2020-04-22 12:08:11 · 1299 阅读 · 0 评论 -
缓存淘汰算法LIRS原理与实现
问题背景传统的缓存淘汰算法 LRU(Least Recently Used 最近最少访问)以其简单有效性被广泛应用,LRU 的核心思想是淘汰掉未访问时间最长的缓存块,它对所有的数据做了一个简单假设:如果数据块被访问了一次,那么该数据块在接下来的一段时间中还会被再次访问。但是当 LRU 算法遇到下面场景时候存在一定的局限性:数据块可能被访问一次之后不会再被访问,大量的对这种数据块访问会频繁地...转载 2020-04-15 14:22:21 · 5642 阅读 · 1 评论 -
一个整数拆分为连续自然数之和
问题描述:将一个正整数,拆分成连续的自然数之和,输出所有可能的情况例如: 3 = 1+210 = 1+2+3+416 =5+6+7...问题求解:连续的自然数之和让我们想到了等差数列求和公式:其中Sum为要分解的正整数,n为连续自然数的个数,aFirst为连续自然数的第一位数将以上公式改写成另外一种格式求...转载 2020-04-13 16:27:00 · 5893 阅读 · 2 评论 -
Hash算法解决冲突的方法
Hash算法解决冲突的方法一般有以下几种常用的解决方法1, 开放定址法:所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入公式为:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1)※ 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探测技术在散列表中形成一个探测序列。沿此序...转载 2019-11-28 18:19:18 · 573 阅读 · 0 评论 -
二叉树实现(构造,遍历)-jav
构造函数-节点public class TreeNode { public int val=0; public TreeNode left = null; public TreeNode right = null; public int getVal() { return val; } public TreeNode(int v...转载 2019-10-14 17:53:35 · 629 阅读 · 0 评论 -
详解布隆过滤器的原理、使用场景和注意事项
https://www.jianshu.com/p/2104d11ee0a2今天碰到个业务,他的 Redis 集群有个大 Value 用途是作为布隆过滤器,但沟通的时候被小怼了一下,意思大概是 “布隆过滤器原理都不懂,还要我优化?”。技术菜被人怼认了、怪不得别人,自己之前确实只是听说过这个,但是没深入了解过,趁这个机会补充一下知识。在进入正文之前,之前看到的有句话我觉得说得很好:Da...转载 2019-05-20 19:54:51 · 946 阅读 · 0 评论 -
跳表:为什么Redis一定要用跳表来实现有序集合?
跳表这种数据结构对你来说,可能会比较陌生,因为一般的数据结构和算法书籍里都不怎么会讲。但是它确实是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree)。Redis 中的有序集合(Sorted Set)就是用跳表来实现的。如果你有一定基础,应该知道红黑树也可以实现快速的插入、删除和查找操作。那 Redis ...转载 2019-04-19 11:40:15 · 1104 阅读 · 0 评论 -
贪心算法
https://www.cnblogs.com/xsyfl/p/6938642.html贪心算法简介: 贪心算法是指:在每一步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解。 贪心算法每一步必须满足一下条件: 1、可行的:即它必须满足问题的约束。 2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。 ...转载 2019-04-12 18:55:57 · 938 阅读 · 0 评论 -
判断两个IP大小及是否在同一个网段中
https://blog.csdn.net/lipslive/article/details/10776381功能点判断某个IP地址是否合法判断两个IP地址是否在同一个网段中判断两个IP地址的大小关系知识准备IP协议子网掩码Java正则表达式基本原理IP地址范围0.0.0.0~255.255.255.255,包括了mask地址。IP地址划分A类地址:1....转载 2019-04-01 18:19:07 · 2036 阅读 · 0 评论 -
无锁环形缓冲RingBuffer的原理及Java实现
https://blog.csdn.net/jkqwd1222/article/details/82194305在多线程环境下为了保证线程安全,往往需要加锁,例如读写锁可以保证读写互斥,读读不互斥。有没有一种数据结构能够实现无锁的线程安全呢?答案就是使用RingBuffer循环队列。在Disruptor项目中就运用到了RingBuffer。RingBuffer的基本原理如下:...转载 2019-03-27 19:11:17 · 4994 阅读 · 0 评论 -
一套图 搞懂“时间复杂度”
https://blog.csdn.net/qq_41523096/article/details/82142747正文:时间复杂度的意义究竟什么是时间复杂度呢?让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司......一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花1...转载 2019-03-09 13:51:29 · 657 阅读 · 0 评论 -
BFS & DFS(Java实现)
https://blog.csdn.net/lixibin0829/article/details/79262763BFS 广度优先搜索 (Broadth First Search)类似于树按层次遍历的过程要求顺次访问为了顺次访问路径长度为2、3、…的顶点,需要使用队列记录已访问的顶点时间复杂度:O(n + e)e为无向图中边的数或有向图中弧的数 /** * Br...转载 2019-06-08 13:30:57 · 3114 阅读 · 0 评论 -
缓存淘汰算法--LFU算法
https://blog.csdn.net/qq_32198277/article/details/79773695LFU(Least Frequently Used)淘汰一定时期内被访问次数最少的元素。如果元素的一定时间内的访问次数相同时,则比较他们的最新一次的访问时间。public class LFU<k, v> { private final int capcity...转载 2019-02-25 09:55:30 · 812 阅读 · 0 评论 -
浅谈算法和数据结构: 一 栈和队列
https://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因。另外普林斯顿大学在Coursera上也有这本书同...转载 2019-05-31 21:44:39 · 639 阅读 · 0 评论 -
Java数组实现循环队列的两种方法RingBuffer
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Victor_Cindy1/article/details/46604575用java实现循环队列的方法:1、增加一个属性size用来记录目前的元素个数。目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满。2、数组中只存储数组大小-1个元...转载 2019-06-04 16:21:41 · 1056 阅读 · 0 评论 -
反转二叉树
https://blog.csdn.net/qq_31692013/article/details/82381671/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tr...转载 2019-05-29 17:52:51 · 642 阅读 · 0 评论 -
Java 循环队列的实现
队列概念 队列(Queue)是限定只能在一端插入、另一端删除的线性表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空队列”。 队列具有先进先出(FIFO)的特性。 普通顺序队列存在的问题 在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位。出队时,则是头指针front后移一个单...转载 2019-06-07 19:03:38 · 1303 阅读 · 0 评论 -
图的搜索算法:BFS和DFS详解(Java实现)
https://www.jianshu.com/p/2226dbe98e06图的搜索算法:BFS和DFS详解(Java实现)上一篇我们介绍了图的基本概念以及图的存储方式:邻接矩阵和邻接表;接下来我们将介绍一下有关图的基本的遍历算法,BFS(广度优先搜索遍历 )和DFS(深度优先搜索遍历 )这两种遍历方式。这里我们就以无向图来做示例:无向图G1DFS(深度优先遍历)深...转载 2019-06-08 13:28:15 · 5743 阅读 · 2 评论 -
图的BFS和DFS搜索及其JAVA实现
https://blog.csdn.net/qq_40860649/article/details/81271231本文采用邻接表来构建无向图 (需要基础图的知识)按照提示输入即可完成图的测试。对BFS和DFS代码都进行了详细的注解, 但是如果读者明白算法思想可以事半功倍,这里只给出了实现代码。DFS:深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Searc...转载 2019-06-08 13:30:03 · 633 阅读 · 0 评论 -
【算法】大数乘法问题及其高效算法
https://blog.csdn.net/u010983881/article/details/77503519题目编写两个任意位数的大数相乘的程序,给出计算结果。比如:题目描述: 输出两个不超过100位的大整数的乘积。输入: 输入两个大整数,如1234567 和 123输出: 输出乘积,如:151851741或者求 123456789101112131415161...转载 2019-07-15 18:49:16 · 1486 阅读 · 0 评论 -
【Java数据结构】判断单链表是否有环,并且找出环的入口
一:判断是否有环思路:使用快慢引用法解决 是否有环假设链表是一个有环链表,且由f指向c构成环。那么使用两个指针A 和 B,让两指针同时向后遍历而且B的遍历速度是A的两倍,呢么如果是有环的话,B终究会追上A。因此我们可以 以AB是否相遇作为判断是否有环的必要条件。下面是图例:...转载 2019-09-19 12:06:05 · 805 阅读 · 0 评论 -
理解单链表的反转(java实现)
要求很简单,输入一个链表,反转链表后,输出新链表的表头。 反转链表是有2种方法(递归法,遍历法)实现的,面试官最爱考察的算法无非是斐波那契数列和单链表反转,递归方法实现链表反转比较优雅,但是对于不了解递归的同学来说还是有理解难度的。递归法总体来说,递归法是从最后一个Node开始,在弹栈的过程中将指针顺序置换的。为了方便理解,我们以 1->2->3->4这个链表...转载 2019-09-19 13:31:51 · 562 阅读 · 0 评论 -
Java冒泡排序,插入排序,选择排序
冒泡排序:package com.zyg.test.sort;//博客:http://blog.csdn.net/m_changgongpublic class BubbleSort { public static void main(String[] args) { int[] array = {10,5,7,12}; System.out.print("排序前;");转载 2012-12-17 10:15:18 · 1282 阅读 · 0 评论 -
Java进阶--从源码理解Integer类的toString方法
https://blog.csdn.net/u013309870/article/details/72158054Java中的jdk是深入学习Java编程的宝库,其中各种方法的实现不仅可以深入了解 设计模式的应用,还可以看到jdk编写者如何优化代码(这种优化已经到达了一种极端的程度)对我们编写自己的代码是有十分重要的作用的。read the fucking source code 是成为一名优秀程...转载 2018-06-05 18:06:44 · 1250 阅读 · 0 评论 -
时间复杂度和空间复杂度
https://blog.csdn.net/zxm490484080/article/details/72210501算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量; 而空间复杂度是指执行这个算法所需要的内存空间。 (算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资转载 2018-05-09 09:58:16 · 716 阅读 · 0 评论 -
汉诺塔问题的算法分析与实现(Java)
http://www.cnblogs.com/chenying99/p/3675843.html汉诺塔问题是源于印度一个古老传说的益智玩具。要求将圆盘从A柱移动到C柱规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。可以先通过3个盘子的hanoi游戏得出其算法步骤如下:if n=1 , 直接将圆盘移到c棒if n>1 , 将A棒上的n-1转载 2018-04-08 15:26:53 · 938 阅读 · 0 评论 -
冒泡排序最佳情况的时间复杂度,为什么是O(n)
转自:http://www.cnblogs.com/melon-h/archive/2012/09/20/2694941.html我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下。但我一直不明白这是怎么算出来的,因此通过阅读《算法导论-第2版》的2.2节,使用对插入排序最佳时间复杂度推算的方法,来计算冒泡排序的复杂度。1. 《算法导论》2.2中对插入转载 2017-01-17 17:58:09 · 3926 阅读 · 0 评论 -
Heapsort 堆排序算法详解(Java实现)
Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析。同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择对这个算法进行分析主要是因为它用到了一个非常有意思的算法技巧:数据结构 - 堆。而且堆排其实是一个看起来复杂其实并不复杂的排序算法,个人认为heapsort在机器学习中也有重要作用。这里重新详解下关于转载 2016-12-30 15:30:05 · 4188 阅读 · 0 评论 -
搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法。给定一个m*n的格子或棋盘,问从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)解答:把棋盘看做二维坐标,设f(m,n)代表从坐标(0,0)到坐标(m,n)的移动方法,则f(m,n)=f(m-1,n)+f(m,n-1)初始为f(0,0)=0,f(0,1)转载 2015-10-07 13:07:49 · 2811 阅读 · 0 评论 -
Timing Wheel 定时轮算法
最近自己在写一个网络服务程序时需要管理大量客户端连接的,其中每个客户端连接都需要管理它的 timeout 时间。通常连接的超时管理一般设置为30~60秒不等,并不需要太精确的时间控制。另外由于服务端管理着多达数万到数十万不等的连接数,因此我们没法为每个连接使用一个Timer,那样太消耗资源不现实。最早面临类似问题的应该是在操作系统和网络协议栈的实现中,以TCP协转载 2016-12-07 11:14:55 · 1630 阅读 · 0 评论 -
程序员应该了解的查找(java实现)
上一星期写了关于排序的几篇博文,得到很多道友的支持,在这里非常感谢。 相比较排序来说,今天所说的查找就简单多了,今天我们先来说:1, 顺序查找2, 折半查找 一、顺序查找的基本思想:从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找转载 2016-11-23 17:09:04 · 1062 阅读 · 0 评论 -
Java排序算法(十二):总结
前面讲了10种基本的排序算法,现在来作下总结,基于下面几个方面来比较各个排序算法的优劣:时间复杂度,空间复杂度,稳定性,适用场景排序算法时间复杂度空间复杂度稳定性适用场景直接选择排序O(n^2)O(1)不稳定时间效率不高,但是空间效率很高,算法实现比较简单堆排序O(nlogn),底数为2O(1)不稳定时转载 2015-03-06 10:46:59 · 1130 阅读 · 0 评论