数据结构与算法
LemmonTreelss
引刀成一快,不负少年头
展开
-
数据结构与算法之美——跳表
一、概述 二分查找算法:底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。改造之后的数据结构叫做跳表(Skip list)。它是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(R...原创 2019-03-19 22:21:10 · 676 阅读 · 2 评论 -
访问频率控制——防止恶意用户频繁访问
一、需求 现在有需求如下:限制1秒中,每个用户最多访问10次后台接口二、方案 1、方案一: 采用Redis String数据结构,以用户id为key,访问次数为value。过期时间为1s。 每次访问都使用INCR命令递增该键的键值,如果递增后的值为1(第一次访问),设置过期时间。这样每次访问先获取该键值,当键值超过100时,说...原创 2019-03-06 11:01:39 · 9996 阅读 · 3 评论 -
数据结构与算法之美——二叉树
一、前言 前面我们讲的都是线性表结构,今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多。二、树 什么是树? 树是n(n≥0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......原创 2020-08-12 17:14:28 · 99 阅读 · 0 评论 -
数据结构与算法之美——递归——学习笔记
一、前言 先说一下递归的几个常见应用:一是裴波那契数列,二是注册返佣金,找最终推荐人,三是青蛙跳台阶。二、如何理解“递归” 作者从它学习数据结构与算法的经历来看,作者认为有两个最难理解的知识点,一个是动态规划另一个就是递归。 递归是一种应用非常广泛的算法(或者编程技巧)。之后我们要将的很多数据结构和算法的编程实现都要用到递归。比如DFS深度...原创 2019-03-02 21:27:47 · 474 阅读 · 0 评论 -
数据结构与算法之美——散列表——实战篇(下)
一、前言 在之前的学习中,有两种数据结构,散列表和链表,经常会被放在一起使用。 在链表那一节,提及了用链表来实现LUR缓存淘汰算法,但是链表实现LRU缓存淘汰算法的时间复杂度为O(n),通过散列表可以将时间复杂度降低到O(1)。 在跳表那一节,提到Redis的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。Redis有序集合不仅使用了跳表,...原创 2019-03-19 09:06:12 · 437 阅读 · 1 评论 -
数据结构与算法之美——链表
一、前言 相比数组,链表是一种稍微复杂的数据结构。对于初学者而言,掌握链表要比数组稍难一些。这两个非常基础、非常常用的数据结构,常常放到一起来比较。二、数组VS链表 数组与链表是非常基础、常用的数据结构,我们常常会放到一块来比较。 1、底层的存储结构 为了直观对比,我画了一张图,从图中我们看到,数组需要一块连续的内存空间来存储,...原创 2019-03-17 19:35:37 · 334 阅读 · 2 评论 -
数据结构与算法之美——数组
二、是什么 1、线性表 线性表,顾名思义,就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。 数组、链表、栈、队列等也是线性表结构。 与之对应的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,数据之间并不是简单的前后关系。 2、连续的内存空间和相同类型的数据三、数据访问 ...原创 2019-02-26 15:38:38 · 268 阅读 · 3 评论 -
数据结构与算法之美——栈——学习笔记
一、栈 栈就像一摞叠在一起的盘子,我们平时放盘子的时候,都是从下往上一个个放;取的时候,我们是从上往下一个一个依次取。先进后出,这就是典型的栈结构。栈是一种“操作受限”的线性表,只允许在一段插入和删除数据。 事实上,从功能上来说,数组或链表确实可以替代栈,特定的数据结构是对特定场景的抽象。数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,...原创 2019-03-17 20:26:41 · 444 阅读 · 1 评论 -
数据结构与算法之美——散列表——实战篇(上)
一、前言 通过理论篇,我们知道,散列表的查询效率跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因此过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果我们使用的是基于链表的冲突解决方法,那这个时候,散列表就会退化为链表,...原创 2019-03-19 22:20:51 · 350 阅读 · 2 评论 -
数据结构与算法之美——散列表——理论篇
一、散列思想 散列表的英文叫Hash Table,也叫哈希表或者Hash表。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列表时间复杂度是O(1)的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函...原创 2019-03-05 14:10:49 · 208 阅读 · 0 评论 -
排序算法——冒泡排序VS插入排序
一、概述 最经典、最常用的排序算法有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、按照时间复杂度分为三类。如下图所示 二、如何分析一个排序算法 (1)排序算法的执行效率 1、最好情况、最坏情况、平均情况时间复杂度...原创 2019-03-04 20:27:50 · 4796 阅读 · 0 评论