
[数据结构与算法]
文章平均质量分 95
Holmofy
奋斗中的小菜鸟
展开
-
K-D树、K-D-B树、B-K-D树
K-D树在维基百科上定义是将K维空间中的点进行分割的数据结构,D是dimensional(维度)的缩写,K-D树是BSP(Binary Space Partitioning)的一种。维基百科的解释很正式(看的迷迷糊糊)。简单的说,K-D树就是二分查找树在K维空间的泛化(更迷糊了????)。1、K维空间的二分查找树之前的一篇文章中有讲过二分查找树(BST)这样基础的数据结构,它是基于二分查找的思想实...原创 2020-03-07 22:36:13 · 4164 阅读 · 0 评论 -
垃圾回收算法与JVM内存管理
因为之前公司有人分享过G1回收器的内容,很多人听的云里雾里(包括我)。甚至有人问学GC有什么用,对写代码有帮助吗。我想这个问题不可置否。《深入理解Java虚拟机》一书中有这么一句话:Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。这篇文章的目的就是为了突破这座藩篱,尽量让更多的人理解JVM的垃圾回收机制。1、GC之前早在1960...原创 2018-12-06 17:47:08 · 831 阅读 · 3 评论 -
MySQL性能优化[理论篇]-B树索引与hash索引
对索引的优化是数据库性能优化方面最重要的一项,也是性能提升最显著的。如果把数据库比作一本新华字典,那索引就是字典前面的目录了。如果不使用目录,想从字典中直接找某个字的解释,难度可想而知,但是有了目录,我们可以先从目录中找到这个字对应的页码,然后再翻到相应的页码,就能找到这个字的完整解释了。索引的工作原理和字典目录基本一致。接下来的几篇文章我会细致的分析MySQL数据库中索引的原理以...原创 2018-04-20 00:19:34 · 1535 阅读 · 0 评论 -
B树与B+树
从二叉搜索树说起其实上一篇文章已经对BST进行过讨论,并对AVL,红黑树这样的自平衡二叉查找树分别解决了什么问题进行了讨论。上面这些数据结构理论上能达到O(log2N)O(log2N)O(log_2N)的平均时间复杂度。这个时间复杂度是基于对内存的操作而计算出来的。倘若我们的数据量十分庞大,内存无法容纳,我们不得不存储在硬盘中。这个时候二叉搜索树还能达到预期的速度吗?在回答这个...原创 2018-04-06 02:47:24 · 1516 阅读 · 0 评论 -
二叉搜索树BST,AVL,红黑树,伸展树
从线性查找和二分查找说起线性查找是最基础(野蛮)的查找算法,最坏的情况从头遍历到位,最好的情况比较一次,平均时间复杂度为N2N2\frac{N}{2}。二分查找能达到O(log2N)O(log2N)O(log_2N)的时间复杂度,但是前提是列表中的数据必须是有序的。不管是基于数组实现的列表(ArrayList)还是基于链表实现的列表(LinkedList),想要在插入新元素的同时保...原创 2018-03-26 00:11:53 · 2251 阅读 · 6 评论 -
斐波那契数列算法优化问题
斐波那契是数学中最值得讨论的一个问题,从12世纪斐波那契提出这个数列后,就有很多数学家研究过这个数列,对斐波那契数列的新发现也越来越多,这些细节我没能力去研究,这篇文章中要讲的是编程中对生成斐波那契数算法的优化。首先要说的就是斐波那契数列的定义,这一切都起源于一个生殖能力超强的兔子:第一个月初有一对刚诞生的兔子第二个月后(第三个月初)他们可以生育每月没对兔子可生育的兔子会诞生下一对新兔子...原创 2017-08-07 19:16:21 · 7929 阅读 · 7 评论 -
素数检测算法
因为1既不是素数也不是合数,所以下面的实现代码中不考虑小于2的情况。C语言完整源码可以到这里查看Java完整源码可以点击这里查看本文以C语言进行讲解,建议对着完整的源码看。1. 暴力求解最原始、最粗暴的方法就是从头到尾逐个进行检测,一旦遇到可被整除的数马上返回falsebool is_prime_1(int n) { for (int i = 2; i &...原创 2017-07-28 21:21:25 · 3911 阅读 · 0 评论 -
辗转相除法、更相减损法、Stein算法
最大公约数和最小公倍数求解,常用的方法是短除法进行因式分解,然后最大公约数是所有公共因子的乘积,最小公倍数是所有因子的乘积。本质上求最小公倍数就是求最大公倍数:x=m*a, y=m*b;m是最大公约数,那最小公倍数就是m*a*b。所以可以得到最大公约数与最小公倍数的关系: LCM(A,B)×GCD(A,B)=A×BLCM(A,B)×GCD(A,B)=A×BLCM(A,B)×GCD(A,...原创 2017-07-30 18:42:55 · 15509 阅读 · 1 评论 -
常见排序算法及JAVA实现
排序算法的分类先看维基百科中的一张关于排序算法的表 我们主要了解常见的一些排序算法。像Bogo排序,臭皮匠排序这类完全不实用的排序可以置之不理。 我们这里要说的排序算法都是内排序,也就是只在内存中进行,涉及到对磁盘等外部存储设备中的数据进行排序称之为外排序,关于外排序的内容可以查看维基百科。其实外排序使用的是归并排序的思想。简单选择排序(SelectSort)选...原创 2017-04-19 22:01:01 · 5165 阅读 · 5 评论 -
单轴快排(SinglePivotQuickSort)和双轴快排(DualPivotQuickSort)及其JAVA实现
快速排序使用的是分治思想,将原问题分成若干个子问题进行递归解决。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。单轴快排(SinglePivotQuickSort)单轴快速排序是快速排序最简单的实现。步骤如下:如果待排序的数组...原创 2017-05-04 13:11:21 · 12814 阅读 · 11 评论 -
密码学安全算法--对称加密算法
对称加密也称为常规加密、单钥加密,在非对称加密(公钥加密)开发之前是唯一使用的加密类型,直到现在,它也仍然是使用最广泛的加密类型之一。最常见对称加密算法是:DES、3DES、AES、RC4。对称加密算法基本原理先上图,对称加密工作过程 在整个工作过程中涉及到以下几个概念 - 明文:也就是原始信息或者说原始数据。也就是上图中的A。 - 加密算法:对明文进行各种替换或转换操作的一...原创 2017-06-04 21:45:50 · 11116 阅读 · 0 评论