
算法
文章平均质量分 88
TimeTDIT
不驰于空想,不骛于虚声。
展开
-
两种常用的选择排序算法--简单选择排序、堆排序
两种常用的选择排序算法--简单选择排序、堆排序原创 2017-11-24 12:39:44 · 1058 阅读 · 0 评论 -
自旋锁、排队自旋锁、MCS锁、CLH锁
转载自https://coderbee.net/index.php/concurrent/20131115/577自旋锁(Spin lock)自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。自旋锁适用于锁保护的临界区很小的情况,临界区很小的话,锁占用的时间就很短。简单的实现import java.util.concurren...转载 2018-02-10 00:40:54 · 330 阅读 · 0 评论 -
B树、B-树、B+树、B*树介绍,和B+树更适合做文件索引的原因
转载自http://blog.youkuaiyun.com/cangchen/article/details/44817807 今天看数据库,书中提到:由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片,这和磁盘碎片、内存碎片产生原理是类似的,这些存储碎片不仅占用了存储空间,而且降低了数据库运行的速度。如果发现索引中存在过多的...转载 2018-02-20 00:51:56 · 364 阅读 · 0 评论 -
字典树
转载自https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html一、引入字典是干啥的?查找字的。字典树自然也是起查找作用的。查找的是啥?单词。看以下几个题:1、给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单词表中出现过。答:简单!map,短小精悍。好。下一个2、给出n个单词和m个询问,每次询问一个前缀,回答询问是多少个单词的前缀。...转载 2018-02-21 17:12:45 · 282 阅读 · 0 评论 -
红黑树
转载自http://www.cnblogs.com/CarpenterLee/p/5525688.html本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程。总体介绍Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通...转载 2018-02-22 00:08:52 · 322 阅读 · 0 评论 -
求数组的一个和最大的子数组
假设现在我们需要求数组的一个和最大的子数组,比如对于数组{-1,1,3,-1},和最大的子数组就是{1,3}。我们来设计一下这样的算法。一、暴力法 首先我们可能会想到使用暴力法两层循环来遍历数组求解,外层循环表示子数组的开始位置,内层循环表示子数组的结尾位置,一一遍历,最后得到最大的一个和以及子数组的开头和结尾,我们使用Java来实现: public static int[] ...原创 2018-01-19 01:03:49 · 647 阅读 · 0 评论 -
两种常用的交换排序算法--冒泡排序、快速排序
本文介绍两种常用的交换排序算法:1、冒泡排序算法 平均时间复杂度O(n^2) 稳定的排序算法2、快速排序 最差时间复杂度为O(n^2) 但是平均时间复杂度为O(n ln n) 最坏情况下空间复杂度为O(n) 最好情况下空间复杂度为O(ln n)下面用java代码来说明算法思路:1、冒泡排序算法:public class ExchangeRanker { //冒泡排序 不断比较相邻两个元素的...原创 2017-11-23 13:14:29 · 1744 阅读 · 0 评论 -
一种常用的归并排序算法--归并排序
本文要介绍的是一种叫做归并排序的排序算法该算法最坏情况下时间复杂度是O(n log n)具有较低的时间复杂度,但是归并过程中,需要O(n)的辅助空间,是一个稳定的排序算法,但是由于需要额外申请过多的空间,因此实际效果没有快速排序好。 归并排序根本思想: 1、先把序列划分成长度基本相等的子序列 2、对每个子序列归并排序(递归) 直到子序列长度为1(长度为1的子序列当然是有序的) ...原创 2017-11-24 18:05:59 · 308 阅读 · 0 评论 -
数据结构--图
部分转载自http://blog.youkuaiyun.com/hguisu/article/details/7712813图的表示1、邻接表邻接表的核心思想就是针对每个顶点设置一个邻居表。2、邻接矩阵邻接矩阵的核心思想是针对每个顶点设置一个表,这个表包含所有顶点,通过True/False来表示是否是邻居顶点。概述图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操...转载 2018-02-24 20:33:38 · 606 阅读 · 0 评论 -
Java实现单向链表及其常见操作
本文将使用Java实现链表以及链表的常用操作。一、什么是链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成,而且由于没有闲置的内存,因此空间效率比数组高。其插入操作可达到O(1)复杂度,但是查找或者访问特定的结点复杂度是O(n)。二、单向链表的元素增加实现 ...原创 2018-01-15 15:49:10 · 10745 阅读 · 0 评论 -
使用java实现链式存储的二叉树
上一篇文章写了使用java实现顺序存储的二叉树,这次接着使用java实现链式存储的二叉树:首先创建一个结点类TreeNode<E>:package com.linkedTree;public class TreeNode<E> { private E item; private TreeNode<E> leftChild; priva...原创 2017-11-18 12:09:01 · 984 阅读 · 0 评论 -
算法技术--贪心算法
贪心算法分析及其安全性证明原创 2018-01-30 02:55:54 · 634 阅读 · 0 评论 -
基数排序--基于计数排序的线性时间复杂度的排序算法
我们前面提到了一种时间复杂度为O(n+k),其中k是待排序列最大值的排序算法--计数排序,复习请点击此处。本文我们将继续介绍一种线性时间复杂度的排序算法--基数排序,这种排序算法的时间复杂度为Θ(d(n+k)),这种排序基于我们之前将的计数排序,其中n表示待排序列的规模,d表示待排序列的最大位数,k表示每一位数的范围,这也是一种时间换空间的算法。一、适用情况 我们看这个算法的原创 2018-01-20 17:28:07 · 19457 阅读 · 3 评论 -
三种常用的插入排序算法--直接插入排序、二分插入排序、希尔排序
常用的三种插入排序算法 直接插入排序 二分插入排序 希尔排序原创 2017-11-22 16:25:10 · 624 阅读 · 0 评论 -
桶排序--平均情况下时间代价为O(n)的排序算法
在介绍了计数排序和基数排序两种线性时间复杂度的排序算法之后,我们来介绍第三种时间复杂度为线性,平均情况下的时间代价为O(n)的的排序算法--桶排序。一、适用情况 这种排序假设输入数据服从均匀分布,而且需要已知待排序列的大概范围,是一种空间换时间的排序算法。二、基本思想 对于一个待排序列,我们已知它的大概范围的时候,我们把这个范围分为n个相同大小的子区原创 2018-01-21 00:53:10 · 7778 阅读 · 0 评论 -
序列的元素选择问题
本文探讨序列的元素选择问题原创 2018-01-22 11:28:04 · 403 阅读 · 0 评论 -
几种基本数据结构--栈、队列、双向链表、有根树的分析和简单实现
本文介绍几种基本数据结构--栈、队列、双向链表、有根树。一、栈 栈不用多说了,一种LIFO(后进先出)的数据结构,我们使用Java实现其入栈(PUSH),出栈(POP)的基本操作:public class Stack { public final static int DEFAULTSIZE = 10; private final E[] elements;原创 2018-01-23 17:17:46 · 1611 阅读 · 0 评论 -
拉链法解决哈希冲突的方式和几种常见的散列函数
本文探讨拉链表解决哈希冲突的方式和几种常见的散列函数。 首先,什么是散列表? 对于一个数组,我们在O(1)时间复杂度完成可以完成其索引的查找,现在我们想要存储一个key value的键值对,我们可以根据key生成一个数组的索引,然后在索引存储这个key value键值对。我们把根据key生成索引这个函数叫做散列函数。显而易见,不同的key有可能产生相同的索引,这就叫做哈希碰撞,原创 2018-01-24 16:10:34 · 8161 阅读 · 0 评论 -
Java获得两个整型二进制表示的不同位的个数的几种方法
获得两个整型二进制的不同位个数的几种方法原创 2018-01-17 16:19:32 · 1808 阅读 · 0 评论 -
斐波那契数列的几种求解方式和复杂度分析
实现求解斐波那契数列的几种算法以及复杂度的比较原创 2018-01-18 16:40:36 · 13677 阅读 · 2 评论 -
算法技术--动态规划
本文介绍一种算法技术--动态规划。 一、什么是动态规划 动态规划与分治方法相似,通过组合子问题的解来求解问题。分治法会在计算时做许多不必要的工作(记不记得之前的一篇博客分析过没有优化过的斐波那契数列递归实现的时间复杂度高达指数级),然而动态规划则会把求过的子问题记录到一个容器中,从而避免了一些重复的工作。 我们常常使用动态规划来求解最优化问题,步骤如下: 1原创 2018-01-27 22:59:45 · 512 阅读 · 0 评论 -
计数排序--时间复杂度为线性的排序算法
我们知道基于比较的排序算法的最好的情况的时间复杂度是O(nlgn),然而存在一种神奇的排序算法,不是基于比较的,而是空间换时间,使得时间复杂度能够达到线性O(n+k),这种算法就是本文将要介绍的计数排序。一、适用情况 这个算法在n个输入元素中每一个都是0到k的范围的整数,其中k也是整数。当k = O(n)时,排序的时间复杂度为Θ(n)。它的性质也就决定了它的运用范围比较窄原创 2018-01-20 01:29:23 · 15672 阅读 · 1 评论 -
数据结构--二叉树
二叉树的实现、广度优先遍历和递归、非递归的深度优先遍历,思路在注释中:package 二叉树;import java.util.Deque;import java.util.LinkedList;import java.util.Queue;public class BinaryTree<E> { public static class TreeNode<E&...原创 2018-02-25 15:36:25 · 324 阅读 · 0 评论