
数据结构和算法
数据结构和算法
A__17
这个作者很懒,什么都没留下…
展开
-
优先队列浅谈
前言普通队列是一种先进先出的数据结构,先放进队列的元素取值时优先被取出来。 优先队列是一种具有最高优先级元素先出的数据结构,比如每次取值都取最大的元素。 优先队列有两个核心方法,一个是insert(val)向队列中添加元素,另外一个是delMax()删除最大元素(优先级最高的)并返回。可以考虑使用数组来存储优先队列的数据。优先队列的实现有序数组调用insert方法时使用类似插入排序把新增元素放到正确位置,插入的时间复杂度:N 调用delMax方法时直接取数组最后一个元素:删除的时间复杂度原创 2015-10-31 20:29:57 · 685 阅读 · 0 评论 -
跳跃列表 -- SkipList
前言我们先回顾一下在有序序列中查找某个特定元素的情境:如果该序列使用支持随机访问的数组存储,那我们通过二分查可以很快地找到某个元素。 但是考虑到增加、删除的效率以及内存空间的使用,很多时候我们会使用不支持随机访问的链表存储,那么我们查询某个元素时就只能遍历整个链表。 综合考虑查询和增加、删除操作,我们通常会使用二叉搜索树存储,这样我们就可以不依赖随机访问特性来进行二分查找了。 普通的二叉搜索树插入元素越有序效率越低,最坏情况会退化回链表,为了解决这个问题,我们采用平衡二叉树来存储,以保证在任何原创 2017-08-06 23:30:42 · 21804 阅读 · 0 评论 -
LRU - 最近最少访问缓存策略
Least Recently Used (LRU) cache最近最少访问缓存策略:/** * 基于LinkedHashMap自定义LRU的实现。 */class LRUCache extends LinkedHashMap<Integer, Integer>{ private int capacity; public LRUCache(int ...原创 2020-03-05 22:04:37 · 549 阅读 · 0 评论 -
数组中逆序对的个数
import com.google.common.base.Preconditions;/** * 数组中的逆序对:数组中任意的两个数字,如果前一个数字大于后一个数字,则这两个数字就构成了一个逆序对。 */public class InverseParisInArray { /** * 求指定数组中,逆序对的个数。 */ public static...原创 2018-08-29 22:48:49 · 2285 阅读 · 0 评论 -
借助辅助空间来排序
import com.google.common.base.Preconditions;import java.util.Arrays;/** * 借助常数大小的辅助空间来实现时间复杂度为O(n)的排序。 */public class SortWithAuxiliarySpace { /** * 将数组中的数排序,数组中存放的是学生的考试成绩。 *...原创 2018-08-13 23:28:40 · 850 阅读 · 0 评论 -
栈--根据栈的入栈序列来判断某一序列是否为该栈的弹出序列。
import java.util.Stack;/** * isPopOrder 根据栈的入栈序列来判断某一序列是否为该栈的弹出序列。 */public class StackUtil { /** * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断二个序列是否为该栈的弹出顺序,假设压入栈的所有数字均不相等。 * eg:序列1,2,3,4,5是某个栈...原创 2018-08-14 23:35:42 · 451 阅读 · 0 评论 -
栈--提供获取最小元素方法的栈
import java.util.NoSuchElementException;import java.util.Stack;/** * 一个提供获取最小元素方法的栈。 * * 说明: * 1)每次向操作栈中添加元素后,在辅助栈中也添加一个元素 且 向辅助栈中添加的元素是当前操作栈中的最小元素。 * 2)每次弹出操作栈的栈顶元素后,将辅助栈的栈顶元素也弹出。 * 3)无论...原创 2018-08-14 23:36:20 · 501 阅读 · 0 评论 -
队列--利用两个栈来实现队列的add和remove功能
import java.util.NoSuchElementException;import java.util.Stack;/** * 自定义的队列:利用两个栈来实现队列的add和remove功能 */public class CustomQueue<T> { public Stack<T> pushStack = new Stack<T&g...原创 2018-08-14 23:36:54 · 758 阅读 · 0 评论 -
矩阵
/** * 要点:画图找规律。 */public class Matrix { /** * 从外向里顺时针打印矩阵中的数字 * * 打印第一圈的起始坐标为(0,0),第二圈的起始坐标为(1,1),第三圈的起始坐标为(2,2)...,故我们将左上角的坐标设为(startX,startY) 且 startX==startY。 * 5X5的矩阵中...原创 2018-08-14 23:36:32 · 265 阅读 · 0 评论 -
丑数
import com.google.common.base.Preconditions;/** * 因子:所有可以整除这个整数的数(不包括这个数自身)就是这个整数的因子。eg:12的因子为:1、2、3、4、6 * * 丑数: * 1)丑数所有的因子(除1外)都是 2的倍数 或 3的倍数 或 5的倍数。 * 2)通常认为1是最小的丑数。 * 2)丑数 ...原创 2018-08-06 21:44:48 · 358 阅读 · 0 评论 -
字符串排列
/** * 字符串排列 */public class StringPermutation { /** * 打印字符串(字符数组)的全排列。 * * @param charArray */ public static void permutation(char[] charArray) { if (null == c...原创 2018-08-21 00:51:14 · 356 阅读 · 0 评论 -
在递增排序的数组中,找到和为指定值的两个元素
import com.google.common.base.Preconditions;import java.util.Arrays;/** * 在递增排序的数组中,找到和为指定值的两个元素。若存在多对这样的元素,则找到任意一对即可。 * * 输入一个正数sum,打印出所有和为sum的连续正数序列(序列中最少2个数字)。 */public class GetNumbersWi...原创 2018-08-31 00:24:07 · 968 阅读 · 0 评论 -
Partition方法
/** * partition()方法:在基准元素左边的元素都小于基准元素,在基准元素右边的元素都大于等于基准元素。 * * 可以使用partition()方法解决以下常见的问题: * * 1)查找数组中出现次数超过数组长度一半的元素。 * eg:MoreThanHalfSize类中的getElementOfMoreThanHalfSizeByPartition方法。 ...原创 2018-08-29 22:25:14 · 6638 阅读 · 3 评论 -
把数组排成最小的数
import com.google.common.base.Preconditions;import org.apache.commons.lang3.StringUtils;import java.util.Comparator;/** * 输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 */public class GetMin...原创 2018-08-28 00:07:48 · 403 阅读 · 0 评论 -
topK问题
import com.again.common.arithmetic.Sort.HeapSort;import com.google.common.base.Preconditions;import java.util.Arrays;/** * TopK问题:在指定数据中查找最大(或最小)的k个数。 */public class TopK { /** * 打印...原创 2018-08-28 01:42:37 · 527 阅读 · 0 评论 -
位操作
import com.google.common.base.Preconditions;/** * 位运算: * <p> * Integer.MAX_VALUE = 2147483647 十进制 2^31-1 * Integer.MAX_VALUE = 1111111111111111111111111111111 二进制 31个1(注:省略了最前...原创 2018-08-22 23:40:38 · 222 阅读 · 0 评论 -
一个整形数组中除了两个数字外,其它的数字都出现了两次,将这两个数字打印出来
import com.google.common.base.Preconditions;import java.util.Arrays;/** * 一个整形数组中除了两个数字外,其它的数字都出现了两次,将这两个数字打印出来。 */public class FindSingleNumInArray { /** * 一个整形数组中除了两个数字外,其它的数字都出现了...原创 2018-08-29 22:48:36 · 477 阅读 · 0 评论 -
删除链表中指定的节点
package com.again.common.arithmetic.LinkedList;import com.again.common.arithmetic.Node;import com.google.common.base.Preconditions;/** * 单向链表 * * 删除链表中指定的节点 * */public class SinglyLinkedL...原创 2018-07-25 22:11:25 · 3758 阅读 · 0 评论 -
求一个数的整数次方
/** * 求一个数的整数次方 */public class PowerOperator { /** * 问题:求一个数的整数次方 * * @param base 基数 * @param exponent 指数 */ public static double power(double base, int exp...原创 2018-07-25 01:31:47 · 1097 阅读 · 0 评论 -
二分查找
/** * 二分查找(折半查找) * * 时间复杂度:O(logN) * * 注意:二分查找的前提是 查找的序列是有序的! */public class BinarySearch { /** * 二分查找 - 非递归 * * 时间复杂度:O(logn) * * @param array * @param left...原创 2015-06-07 12:19:05 · 1004 阅读 · 0 评论 -
链表的反转
import java.util.ArrayList;import java.util.Stack;/** * 链表的反转 */public class ReverseLinkedList { /** * 非递归地反转链表: * * 特点:没有进行节点间的两两反转,而是采用依次插入到新链表的方式来实现反转。 * * 过程:...原创 2018-04-27 23:43:55 · 1061 阅读 · 0 评论 -
堆排序
/** * 【堆】 * 堆的概念:堆是一棵顺序存储的完全二叉树。 * * 堆分为大根堆和小根堆: * 大根堆:每个节点的值不小于等于其左、右孩子的值 * 小根堆:每个节点的值不大于等于其左、右孩子的值 * * 【堆排序】 * * 1)概念:指利用堆的特性将待排序的序列进行排序。 * * 2)过程: * ...原创 2015-09-23 16:27:13 · 2784 阅读 · 0 评论 -
一致性哈希算法原理
一致性哈希算法原理一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。 但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存...转载 2018-03-14 23:12:37 · 318 阅读 · 0 评论 -
二叉树的遍历
import java.util.*;import java.util.concurrent.LinkedBlockingQueue;/** * 先序遍历:按照“根左右”的顺序,先遍历根节点,再遍历左子树,再遍历右子树 * 中序遍历:按照“左根右“的顺序,先遍历左子树,再遍历根节点,最后遍历右子树 * 后续遍历:按照“左右根”的顺序,先遍历左子树,再遍历右子树,最后遍历根节点 * ...原创 2015-05-29 17:33:13 · 893 阅读 · 0 评论 -
算法的复杂度
算法的复杂度: 概念:算法效率的度量是通过时间复杂度和空间复杂度来描述的。 时间复杂度: 概念: 1)一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记作T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。 2)算法中基本运算(注:基本运算是指最深层循环内的语句)的频度与T(n)同数量级,故我们通常 用算法中基本运算的频...原创 2014-01-16 21:27:28 · 1109 阅读 · 0 评论 -
排序
/** * 快速排序 * * 原理:基于分治的思想,在数组或链表中找到基准元素,小于基准元素的放在左边,大于或等于基准元素的放在右边,然后对基准元素两边再次进行排序。 * * 时间复杂度: * 最坏O(N^2) 说明:当待排序的序列在排序前是有序(顺序或逆序)的,此时的时间复杂度最差(这种情况下,快排退化成了冒泡排序)。 * 平均O(NlogN) * 最好O(...原创 2014-01-17 09:25:42 · 1137 阅读 · 0 评论 -
二叉树基础
二叉树:特点:每个结点最多有两棵子树。 左子树和右子树是有顺序的,次序不能颠倒。 即使某结点只有一个子树,也要区分左右子树。性质: 在非空二叉树的i层上,至多有2i-1个结点(i>=1)。 在深度为K的二叉树上最多有2k-1个结点(k>=1)。 对于任何一棵非空的二叉树,如果叶结点个数为n0,度数为2的结点个数为n2,则有: n0 = n2 + 1 在一棵二叉树中,除了叶子结点(度为0)之外,就剩下度为2(n2)和1(n1)的结点了。树的结点总数为:T=n0+n1...原创 2017-11-08 23:34:27 · 871 阅读 · 0 评论 -
字符串的反转
import com.google.common.base.Preconditions;import org.apache.commons.lang3.StringUtils;/** * 反转字符串 */public class StringReverse { /** * 字符串的反转 * * @param str * @return...原创 2016-12-01 02:07:28 · 502 阅读 · 0 评论 -
动态规划
/** * 动态规划(Dynamic Programming): * 1)将待求解的问题分解为若干个子问题(即:将求解的过程分为若干阶段),按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息; * 2)在求解任一子问题时,列出可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它的局部解; * 3)依次解决各子问题,最后一个子问题的解...原创 2018-06-11 23:16:05 · 228 阅读 · 0 评论 -
输入整数n,按顺序打印出从1到最大的n位数
import com.google.common.base.Preconditions;/** * 打印大数: * * 1)字符和整数(0~127)之间可以相互转换,ascii码表中维护着字符和整数之间的映射关系。 * char emptyChar = 0; // emptyChar表示空字符 * char zeroChar = '0'; /...原创 2018-07-25 01:31:05 · 1028 阅读 · 0 评论 -
整数的二进制形式中1的个数
/** * Integer.MAX_VALUE = 2147483647 十进制 2^31-1 * Integer.MAX_VALUE = 1111111111111111111111111111111 二进制 31个1(注:省略了最前面的符号位0) * * Integer.MIN_VALUE = -2147483648 十进制 -2^31 * Inte...原创 2018-07-23 22:19:17 · 550 阅读 · 0 评论 -
斐波那契数列
import com.google.common.base.Preconditions;/** * 斐波纳契数列: * * 定义: * { 0 n=0 * f(n)=| 1 n=1 * { f(n-1) + f(n-2) n>1 * * 问题:求斐波那契数列第n项的值。 * * ...原创 2018-07-23 22:19:27 · 258 阅读 · 0 评论 -
二维数组中查找元素
/** * 说明:二维数组中,每一行的元素都按照从左到右递增的顺序排列,每一列的元素都按照从上到下递增的顺序排列,判断二维数组中是否包含某个元素。 * * 方法一: * 遍历所有的元素,若二维数组有n行n列,则时间复杂度为o(n^2) * * 方法二: * 1)选取二维数组中右上角的元素,如果该元素等于要查找的元素,则直接返回。 * 2)若该元素大于要...原创 2018-07-11 23:12:33 · 2627 阅读 · 0 评论 -
旋转数组
import com.google.common.base.Preconditions;/** * 数组的旋转: * * 概念:把一个数组最开始的若干元素搬到数组的末尾。 * 举例:数组{3,4,5,1,2}是数组{1,2,3,4,5}的一个旋转。 * * 问题:输入一个递增排序的数组的一个旋转,输出该旋转数组的最小元素。 * * 分析: * 1)旋转数组...原创 2018-07-23 22:19:32 · 1269 阅读 · 0 评论 -
字符串替换
import com.google.common.base.Preconditions;import org.apache.commons.lang3.StringUtils;import java.util.Arrays;public class StringReplace { /** * 说明:将字符串中的某个字符替换为指定字符。 * * 时间...原创 2018-07-10 23:11:06 · 459 阅读 · 0 评论 -
找出数组中出现次数超过数组长度一半的元素
import com.google.common.base.Preconditions;/** * 问题:找出数组中出现次数超过数组长度一半的元素。 * * 解法: * 方法一:先将数组中的元素排序,由于目标元素的数量超过数组长度的一半,故排序后数组的中间元素(即数组的中位数)就是目标元素。 * 时间复杂度O(nlogn) * * 方法二:使用partition(...原创 2018-07-10 23:09:54 · 2377 阅读 · 0 评论 -
遍历文件夹
import java.io.File;import java.util.ArrayList;import java.util.concurrent.LinkedBlockingQueue;/** * 遍历文件夹 */public class TraversalFolder { /** * 深度优先遍历文件夹 * <p> * 要点:...原创 2018-06-11 23:19:19 · 481 阅读 · 0 评论 -
B树和B+树
目录背景相关概念:MySQL中InnoDB引擎:B树概念:B树结构:优点:缺点:举例:B+树概念:数据库记录结构:B+树结构:优点:缺点:举例:B树与AVL树(平衡二叉树)相比:B树和B+树的比较:背景相关概念:操作系统从硬盘中读取数据时是以块(block)为单位读取的。硬盘的最小读写单元为扇区(sector),操作系统就将相邻的扇区组合在一起,形成一个块,然后再对块进行整体的操作。 读取数据时位于同一磁盘块.原创 2017-11-09 23:13:40 · 1415 阅读 · 0 评论