![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
肥愚长大吧
不加班的孩纸最幸福
展开
-
一篇文章掌握GeoHash
一、基本概念地球是一个球,我们常用经纬度来表示某个点的坐标,例如:北海公园的坐标为(39.928167,116.389550)。GeoHash的基本原理就是将地球理解为一个展开的二维平面,将这个二维平面按照一定的规则划分为不同的单元格,每个单元格拥有具有唯一性的编码,如图一所示。至于这个编码如何计算,将会在后面的内容予以介绍。图1:GeoHash原理示意图从图中可以看出,每一个单元...原创 2019-10-29 19:57:49 · 2139 阅读 · 0 评论 -
计算经纬度点之间的距离
球面上任意两点之间的距离计算公式可以参考维基百科上的下述文章。 Great-circle distance Haversine formula值得一提的是,维基百科推荐使用Haversine公式,理由是Great-circle distance公式用到了大量余弦函数, 而两点间距离很短时(比如地球表面上相距几百米的两点),余弦函数会得出0.999...的结果, 会导致较大的舍入误差。...原创 2019-10-23 19:37:55 · 9001 阅读 · 0 评论 -
leetcode 25题 K 个一组翻转链表 Java解法
算法题目描述:给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。示例 :给定这个链表:1->2->3->4->5当k= 2 时,应当返回: 2->1->4->3->5当k= 3 时,应当返...原创 2019-10-15 20:40:28 · 271 阅读 · 0 评论 -
红黑树查找和删除操作深入讲解
一、基本概念二叉树中任意一个节点的左右子树的高度相差不能大于 1。从这个定义来看,上一节我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”、比较“平衡”,不要出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些红...原创 2019-10-14 20:07:17 · 521 阅读 · 0 评论 -
Java 二叉平衡树高度解法
废话少说,直接上代码import java.util.LinkedList;/** * @author hehe * @version : TreeHeight.java, v 0.1 2019-10-10 19:52 */public class TreeHeight { static class TreeNode{ int val; T...原创 2019-10-10 20:27:39 · 173 阅读 · 0 评论 -
二叉树深入讲解
一、树的基本概念关于树的概念:节点的高度:节点到叶子节点的最长路径(边数);节点的深度:根节点到这个节点所经历的边的个数;节点的层数:节点的深度+1;树的高度:等于根节点的高度。二、二叉树二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。编号 2 的二叉树中,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两...原创 2019-10-10 20:25:41 · 316 阅读 · 0 评论 -
搞定哈希算法
1、基本概念哈希算法历史悠久,业界著名的哈希算法例如:MD5、SHA等。将任意长度的二进制值串映射为固定长度的二进制串,这个映射的规则就是哈希算法。通过原始数据映射之后得到的二进制串就是哈希值。哈希算法需要满足的几点要求: 从哈希值不能反向推导出原始数据(所有哈希算法也叫单向哈希算法); 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值大小也大不相同; ...原创 2019-10-09 20:01:56 · 1908 阅读 · 0 评论 -
散列表数据接口详解
1、基本概念散列表的英文叫做“HashTable”,我们平时也叫它“哈希表”或“Hash表”,散列表用的是数组支持按照下标随机访问的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说是没有数组就没有散列表。将关键词转换为数组下标的映射方法 就叫做散列函数(或Hash函数哈希函数),而散列函数计算得到的值就叫做散列值(或hash值哈希值)。构造散列函数有三个基本要点:...原创 2019-10-08 19:22:17 · 209 阅读 · 0 评论 -
二分查找算法介绍及实现
一、基本概念二分查找法(BinarySearch)算法,也叫折半查找算法。二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,或者区间被缩小为0。二分查找是一种非常非常高效的查询算法,时间复杂度未O(logn)。二、算法实现二分查找法Java实现:非递归方法:public ...原创 2019-09-20 09:20:38 · 9060 阅读 · 0 评论 -
冒泡、插入、选择排序方法思想和实现
排序算法 时间复杂度 是否基于比较 冒泡、插入、选择 O(n²) 是 快排、归并 O(nlogn) 是 桶、计数、基数 O(n) 否 ...原创 2019-09-17 18:18:00 · 334 阅读 · 0 评论 -
线性排序方法
一、基本概念排序算法的时间复杂度是线性的,我们把这类排序算法叫做线性排序,例如桶排序、计数排序、基数排序这三种排序算法的时间复杂度是线性的,都是O(n)。之所以能做到线性的时间复杂度,主要原因是这三个算法是非基于比较的排序算法,不涉及元素直接的比较操作;二、桶排序:核心思想是将要排列的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排序完之后,再把每个桶里的数据安装顺序依次取...原创 2019-09-17 18:16:01 · 5857 阅读 · 0 评论 -
Java合并有序链表--空间复杂度低
一般说来,合并有序链表都会定义一个新的链表存放处理后的结果,笔者在想能不能利用原有两个链表的存储空间,不占用额外的存储空间,只在两个链表之间进行连接操作。以下为代码实现。但是这样会破坏原有链表的值。/** * @author haojiajin * @version : MergeSortedList.java, v 0.1 2019-09-12 16:20 */public cla...原创 2019-09-12 17:47:27 · 497 阅读 · 0 评论 -
利用栈实现字符串表达式计算
栈的基本机构1、栈典型的结构,先进者后出,后进者先出,从操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。2、用数组实现的栈叫做顺序栈,用链表实现的栈,我们叫做链式栈;栈的简单实现:// 基于数组实现的顺序栈public class ArrayStack {private String[] items;// 数组private ...原创 2019-09-11 15:52:52 · 522 阅读 · 0 评论 -
链表数据结构讲解 --数据结构与算法之美读书笔记
链表(上)1、数组和链表区别数组需要一块连续的内存空间来存储,链表恰好相反,并不需要一块连续的内存空间,通过“指针”将一组零散的内存卡串联起来使用。2、常见的链表结构单链表:第一个点叫作头结点,最后一个节点叫作尾结点。头结点记录链表的基地址,尾结点的下一个指向空地址null。链表插入和删除操作的时间复杂度是O(1)。链表的随机访问时间复杂度未O(n)。循环链表:循环链表...原创 2019-09-10 19:58:41 · 174 阅读 · 0 评论 -
数组下标为什么从0开始编号 -- 数据结构与算法之美 读书笔记
1、什么是数组 数组(Array)是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据;2、引申概念 线性表(LinearList):就是数据排成像一条线一样的结构,每个线性表上的数据最多只有前和后两个方向。数组、链表、队列、栈等也是线性表结构。 非线性表:与线性表想队里的概念,例如二叉树、堆、图,在非线性表中,数据...原创 2019-09-09 18:45:13 · 346 阅读 · 0 评论 -
算法复杂度分析--数据接口与算法之美读书笔记
1、数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。2、负责度分析是整个算法学习的精髓,只要掌握了她,数据结构和算法的内容基本上就掌握了一半;3、为什么需要复杂度分析? 事后统计法 测试结果非常依赖测试环境,硬件对测试结果有很大影响 测试结果手数据规模影响很大;4、大O时间复杂度病不具体代表代码真正的执行时间...原创 2019-09-08 18:15:27 · 285 阅读 · 0 评论