柠檬树

柠檬树

数据结构与算法之美——哈希算法

一、前言 如何防止数据库中的用户信息被脱库?如何存储用户密码这么重要的数据呢?仅仅MD5加密一下存储就够了吗?要想搞清楚这个问题,就要先弄明白哈希算法。 哈希算法历史悠久,业界著名的哈希算法也有很多,比如MD5、SHA等。那么在实际的开发中,我们该如何用哈希算法解决问题。 二、什...

2019-03-19 22:36:41

阅读数 39

评论数 2

数据结构与算法之美——跳表

一、概述 二分查找算法:底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。改造之后的数据结构叫做跳表(Skip list)。它是一种各方面性能都比较优秀的动...

2019-03-19 22:21:10

阅读数 21

评论数 2

数据结构与算法之美——散列表——实战篇(上)

一、前言 通过理论篇,我们知道,散列表的查询效率跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因此过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到...

2019-03-19 22:20:51

阅读数 51

评论数 2

数据结构与算法之美——散列表——实战篇(下)

一、前言 在之前的学习中,有两种数据结构,散列表和链表,经常会被放在一起使用。 在链表那一节,提及了用链表来实现LUR缓存淘汰算法,但是链表实现LRU缓存淘汰算法的时间复杂度为O(n),通过散列表可以将时间复杂度降低到O(1)。 在跳表那一节,提到Redis的有序集合是使用...

2019-03-19 09:06:12

阅读数 54

评论数 1

数据结构与算法之美——队列——学习笔记

一、前言 众所周知,CPU资源是有限的,任务的处理速度与线程个数并不是正相关的。相反,过多的线程反而会导致CPU频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来实现设置的。 当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了...

2019-03-17 23:18:08

阅读数 44

评论数 1

数据结构与算法之美——栈——学习笔记

一、栈 栈就像一摞叠在一起的盘子,我们平时放盘子的时候,都是从下往上一个个放;取的时候,我们是从上往下一个一个依次取。 先进后出,这就是典型的栈结构。栈是一种“操作受限”的线性表,只允许在一段插入和删除数据。 事实上,从功能上来说,数组或链表确实可以替代栈,特定的数据结构是对特定...

2019-03-17 20:26:41

阅读数 30

评论数 1

数据结构与算法之美——链表

一、前言 相比数组,链表是一种稍微复杂的数据结构。对于初学者而言,掌握链表要比数组稍难一些。这两个非常基础、非常常用的数据结构,常常放到一起来比较。 二、数组VS链表 数组与链表是非常基础、常用的数据结构,我们常常会放到一块来比较。 1、底层的存储结构 为了直观...

2019-03-17 19:35:37

阅读数 40

评论数 2

【MySQL】基础架构

一、MySQL逻辑架构 总体上来说,MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(比如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比...

2019-03-17 10:46:04

阅读数 152

评论数 1

如何设计一个秒杀系统——秒杀系统架构设计都有哪些关键点

一、如何理解秒杀系统 秒杀系统其实主要解决两个问题,一个是并发读,一个是并发写。并发读的核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据;并发写的处理原则也一样,它要求我们在数据库层面独立出来一个库,做特殊的处理。另外,我们还要针对秒杀系统做一些保护,针对意料之外的情...

2019-03-11 09:52:34

阅读数 41

评论数 0

JWT实现鉴权

一、前言 JWT全称JSON Web Token,是一种基于JSON的,用于在网络上声明某种主张的令牌(Token)。JWT通常由三部分组成:头信息(header)、消息体(payload)、签名(signature)。 头信息(Header)指定了该JWT使用的签名...

2019-03-10 23:36:57

阅读数 40

评论数 0

Zookeeper实现分布式锁

一、分布式锁 首先谈一谈什么是分布式锁。 在多线程并发情况下,如何保证一个代码块在同一时间只能由一个线程访问?可以用锁来实现,比如Java的Synchronized语言,以及ReentrantLock类等。这样可以保证在同一个JVM内,同一时间只有一个线程访问。 如何在分布...

2019-03-10 21:16:43

阅读数 11

评论数 0

Zookeerper学习总结

一、前言 我们在学习Dubbo框架的时候就接触到了Zookeeper。用它来充当服务的注册中心。那么Zookeeper的数据结构是什么样的?提供了哪些常见的API?如何实现分布式一致性?都有哪些应用场景? 在深入介绍Zookeeper之前,先明确一下它的定位。Zookeeper是一...

2019-03-06 12:19:31

阅读数 774

评论数 0

访问频率控制——防止恶意用户频繁访问

一、需求 现在有需求如下:限制1秒中,每个用户最多访问10次后台接口 二、方案 1、方案一: 采用Redis String数据结构,以用户id为key,访问次数为value。过期时间为1s。 每次访问都使用INCR命令递增该键的键值,如果递增后的值为1(第一次...

2019-03-06 11:01:39

阅读数 161

评论数 0

数据结构与算法之美——散列表——理论篇

一、散列思想 散列表的英文叫Hash Table,也叫哈希表或者Hash表。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列表时间复杂度是O(1)的特性。我们通过散列函数把元素的键值映射为下...

2019-03-05 14:10:49

阅读数 30

评论数 0

排序算法——冒泡排序VS插入排序

一、概述 最经典、最常用的排序算法有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、按照时间复杂度分为三类。如下图所示 二、如何分析一个排序算法 (1)排序算法的执行效率 1、最好情况、最坏...

2019-03-04 20:27:50

阅读数 28

评论数 0

数据结构与算法之美——递归——学习笔记

一、前言 先说一下递归的几个常见应用:一是裴波那契数列,二是注册返佣金,找最终推荐人,三是青蛙跳台阶。 二、如何理解“递归” 作者从它学习数据结构与算法的经历来看,作者认为有两个最难理解的知识点,一个是动态规划另一个就是递归。 递归是一种应用非常广泛的算法(或者编程...

2019-03-02 21:27:47

阅读数 74

评论数 0

数据结构与算法之美——数组

二、是什么       1、线性表        线性表,顾名思义,就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。        数组、链表、栈、队列等也是线性表结构。        与之对应的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,数据之...

2019-02-26 15:38:38

阅读数 43

评论数 3

数据结构与算法之美——复杂度分析——学习笔记

一、前言        只要讲到数据结构与算法,就一定离不开时间、空间复杂度分析。可以说,复杂度分析是整个算法学习的精髓,只要掌握了它,只要掌握了复杂度分析,数据结构与算法的内容基本上就掌握了一半。 二、为什么需要复杂度分析        俗话说,实践是检验真理的唯一标准,那么把代码跑一遍,...

2019-02-25 19:41:44

阅读数 70

评论数 2

数据结构与算法之美——学习笔记

一、前言        近期在准备面试,而数据结构与算法是面试不可回避的重中之重,可以说只有有笔试题,至少有一道算法题。而算法一直是自己软肋,这次不得不正视这个问题。过去对数据结构与算法一直不太重视,总觉得这些太基础,离实际编程太远,然而事实是,要写出高质量的代码,算法必不可少。最近在极客时间入...

2019-02-25 16:33:03

阅读数 129

评论数 3

JVM面试点记录

一、jvm规范运行时数据区 程序计数器、虚拟机栈、本地方法栈、堆、方法区(非堆/静态存储区)。 线程私有:程序计数器、虚拟机栈、本地方法栈 线程共享:堆、方法区 程序计数器:保证线程切换后能恢复到正确位置。 虚拟机栈:经常有人把Java内存划分为堆内存(He...

2019-02-20 21:32:19

阅读数 29

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭