自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

张伯毅的专栏

人生就是一道证明题,证明我们的存在不是偶然....

原创 数据结构与算法之美笔记: 位图

问题:我们有 1 千万个整数,整数的范围在 1 到 1 亿之间。如何快速查找某个整数是否在这 1 千万个整数中呢? 当然,这个问题还是可以用散列表来解决。不过,我们可以使用一种比较“特殊”的散列表,那就是位图。我们申请一个大小为 1 亿、数据类型为布尔类型(true 或者 false)的数组...

2019-05-31 16:16:49

阅读数 179

评论数 1

原创 Java 中基本数据类型在内存中占据的存储大小

注: 1byte = 8bit 类型 32位系统占用空间 64位系统占用空间 boolean 1 byte 1 byte byte 1 byte 1 byte char 2 byte 2 byte short 2 byte...

2019-05-31 15:55:03

阅读数 383

评论数 1

原创 数据结构与算法之美笔记 : 最短路径

像 Google 地图、百度地图、高德地图这样的地图软件,我想你应该经常使用吧?如果想从家开车到公司,你只需要输入起始、结束地址,地图就会给你规划一条最优出行路线。这里的最优,有很多种定义,比如最短路线、最少用时路线、最少红绿灯路线等等。作为一名软件开发工程师,你是否思考过,地图软件的最优路线是如...

2019-05-31 11:46:18

阅读数 73

评论数 0

原创 数据结构与算法之美笔记 : 拓扑排序

概念 我们在穿衣服的时候都有一定的顺序,我们可以把这种顺序想成,衣服与衣服之间有一定的依赖关系。比如说,你必须先穿袜子才能穿鞋,先穿内裤才能穿秋裤。假设我们现在有八件衣服要穿,它们之间的两两依赖关系我们已经很清楚了,那如何安排一个穿衣序列,能够满足所有的两两之间的依赖关系? 这就是个拓扑排序问...

2019-05-31 11:10:33

阅读数 94

评论数 1

原创 数据结构与算法之美笔记 : 动态规划(Dynamic Programming)

动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。 0-1 背包问题 对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢? // 回溯算法实现。注意:...

2019-05-30 18:13:18

阅读数 126

评论数 0

原创 数据结构与算法之美笔记 : 回溯算法

概念 回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。 为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。 每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走...

2019-05-30 17:05:00

阅读数 82

评论数 1

原创 数据结构与算法之美笔记: 分治算法

概念 分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 分治算法是一种处理问题的思想,递归是一种编程技巧。 分治算法一般...

2019-05-30 16:52:20

阅读数 148

评论数 1

原创 数据结构与算法之美笔记: 贪心算法 [ 霍夫曼编码 ]

如何理解“贪心算法”? 关于贪心算法,我们先看一个例子。 假设我们有一个可以容纳 100kg 物品的背包,可以装各种物品。我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,我们如何选择在背包中装哪些豆子?每种豆子又该装多少呢? 实际上,这...

2019-05-30 16:30:39

阅读数 82

评论数 1

原创 数据结构与算法之美笔记: AC自动机 [ 多模式串匹配算法 ]

AC 自动机算法,全称是 Aho-Corasick 算法。 其实,Trie 树跟 AC 自动机之间的关系,就像单串匹配中朴素的串匹配算法,跟 KMP 算法之间的关系一样,只不过前者针对的是多模式串而已。所以,AC 自动机实际上就是在 Trie 树之上,加了类似 KMP 的 next 数组,只不过...

2019-05-30 15:09:20

阅读数 83

评论数 1

原创 数据结构与算法之美笔记:Trie树

概念 Trie 树,也叫“字典树”。 顾名思义,它是一个树形结构。 它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。 我们有 6 个字符串,它们分别是:how,hi,her,hello,so,see。 我们希望在里面多次查找某个字符串是否...

2019-05-30 14:28:58

阅读数 71

评论数 1

原创 数据结构与算法之美笔记: 字符串匹配 「BF 算法、RK 算法、BM 算法、KMP 算法」

RK 算法是 BF 算法的改进,它巧妙借助了我们前面讲过的哈希算法,让匹配的效率有了很大的提升。 BF 算法 BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。 从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好...

2019-05-29 17:46:38

阅读数 258

评论数 0

原创 数据结构与算法之美笔记: 深度和广度优先搜索

概念 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。 这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。 图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。 具体方法有很多,比...

2019-05-29 15:19:02

阅读数 73

评论数 0

原创 数据结构与算法之美笔记 : 图

概念 树中的元素我们称为节点,图中的元素我们就叫作顶点(vertex)。 图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫作边(edge)。 社交网络,就是一个非常典型的图结构。 我们就拿微信举例子吧。我们可以把每个用户看作一个顶点。 如果两个用户之间互加...

2019-05-29 12:24:38

阅读数 184

评论数 1

原创 数据结构与算法之美笔记 : 堆排序及应用

概念 只要满足这两点,它就是一个堆。 堆是一个完全二叉树; 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 第一点,堆必须是一个完全二叉树。还记得我们之前讲的完全二叉树的定义吗?完全二叉树要求,除了最后一层,其他层的节点个数都是满的,最后一层...

2019-05-29 10:55:44

阅读数 67

评论数 0

原创 数据结构与算法之美笔记 : 平衡二叉树、跳表、B - Tree、 B + Tree 、 B * Tree

最近在看数据结构,读书真的很有用 /(ㄒoㄒ)/~~ 本文讲解顺序为 平衡二叉树、B - Tree、 B + Tree 、 B * Tree , 之间存在递进关系,从头开始梳理。 如果对树没有太多概念的话,可以从前两篇开始。 数据结构与算法之美笔记: 树 二叉树基础概念 htt...

2019-05-27 17:37:15

阅读数 374

评论数 2

原创 数据结构与算法之美笔记: 红黑树

二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于 log2n 的情况,从而导致各个操作的效率下降。 极端情况下,二叉树会退化为链表,时间复杂度会退化到 O(n)。 什么是“平衡二叉查找树”? 平衡二叉树的严格定义是这样的: 二叉树中任意一个节点的左右子树的高度相差不能大于...

2019-05-24 17:52:52

阅读数 151

评论数 1

原创 数据结构与算法之美笔记: 二叉查找树

二叉查找树(Binary Search Tree) 二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。 顾名思义,二叉查找树是为了实现快速查找而生的。 不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。 它是怎么做到这些的呢? 这些都依赖于二叉查找树的特殊结构。 ...

2019-05-24 15:12:11

阅读数 87

评论数 0

原创 数据结构与算法之美笔记: 树 二叉树基础概念

概念 A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。 B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。 我们把没有父节点的节点叫作根节点,也就是图中的节点 E。 我们把没有子节点的节点叫作叶子节点或者叶节点,比如图中的 G、H、I、J、K...

2019-05-24 12:02:41

阅读数 110

评论数 2

原创 数据结构与算法之美笔记 : 哈希算法

什么是哈希算法? 我们前面几节讲到“散列表”“散列函数”,这里又讲到“哈希算法”,你是不是有点一头雾水?实际上,不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。所以,我们常听到有人把“散列表”叫作“哈希表”“Hash 表”,把“哈希算法”叫作“Hash 算法”或者“散...

2019-05-23 18:18:08

阅读数 2796

评论数 6

原创 数据结构与算法之美笔记 : 散列表 「 三 」

散列表和链表都是如何组合起来使用的,以及为什么散列表和链表会经常放到一块使用。 LRU 缓存淘汰算法 在链表那一节中,我提到,借助散列表,我们可以把 LRU 缓存淘汰算法的时间复杂度降低为 O(1)。现在,我们就来看看它是如何做到的。 首先,我们来回顾一下当时我们是如何通过链表实现 LR...

2019-05-23 17:56:53

阅读数 103

评论数 1

原创 数据结构与算法之美笔记 : 散列表 「 二 」

如何设计散列函数? 散列函数设计的好坏,决定了散列表冲突的概率大小,也直接决定了散列表的性能。那什么才是好的散列函数呢? 首先,散列函数的设计不能太复杂。 过于复杂的散列函数,势必会消耗很多计算时间,也就间接的影响到散列表的性能。 其次,散列函数生成的值要尽可能随机并且均匀分布, 这样才...

2019-05-23 17:31:39

阅读数 77

评论数 0

原创 数据结构与算法之美笔记 : 散列表笔记 「 一 」

散列思想 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展, 由数组演化而来。可以说,如果没有数组,就没有散列表。 我用一个例子来解释一下。假如我们有 89 名选手参加学校运动会。为了方便记录成绩,每个选手胸前都会贴上自己的参赛号码。这 89 名选手的...

2019-05-23 14:20:55

阅读数 99

评论数 0

原创 数据结构与算法之美笔记 : 跳表

Redis 中的有序集合(Sorted Set)就是用跳表来实现的. 如何理解“跳表”? 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。 这样查找效率就会很低,时间复杂度会很高,是 O(n)。 那怎么来提高查找...

2019-05-23 12:53:48

阅读数 129

评论数 3

原创 数据结构与算法之美笔记 : 二分法查找 「 二 」

变体一:查找第一个值等于给定值的元素 下面这样一个有序数组,其中,a[5],a[6],a[7] 的值都等于 8,是重复的数据。 我们希望查找第一个等于 8 的数据,也就是下标是 5 的元素。 如果我们用上一节课讲的二分查找的代码实现,首先拿 8 与区间的中间值 a[4] 比较,8...

2019-05-23 12:19:11

阅读数 91

评论数 0

原创 数据结构与算法之美笔记 : 二分法查找 「 一 」

我们假设只有 10 个订单,订单金额分别是:8,11,19,23,27,33,45,55,67,98。 还是利用二分思想,每次都与区间的中间数据比对大小,缩小查找区间的范围。为了更加直观,我画了一张查找过程的图。其中,low 和 high 表示待查找区间的下标,mid 表示待查找区间的中间元素下...

2019-05-23 10:15:10

阅读数 2572

评论数 4

原创 数据结构与算法之美笔记: 排序 「 四 」

排序算法: 稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。 非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 原地排序:原地排序就是指在排序过程中不申请多...

2019-05-22 18:11:37

阅读数 109

评论数 0

转载 十大排序算法,看这篇就够了(附完整代码/动图/优质文章)

说明 十大排序算法可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的算法思想描述,为了方便大家理解,我还找来了动图演示;这还不够,我还附上了对应的优质文章,看完不懂你来砍我,觉得不错就给我来个好看。 术语铺垫 ...

2019-05-22 17:28:38

阅读数 233

评论数 0

原创 数据结构与算法之美 : 排序 「 三 」 线性排序 之 桶排序、计数排序、基数排序

概念 桶排序, 计数排序,基数排序,因为这些排序算法的时间复杂度是线性的, 时间复杂度为 O(n),所以这类排序算法叫做线性排序. 桶排序(Bucket sort) 将排序的数据分到几个有序的捅里面,每个桶排序完之后,再把每个桶里的数据按照数据依次取出,组成的序列就是有序的了. ...

2019-05-22 17:14:34

阅读数 95

评论数 0

转载 100亿数据,非“双倍”扩容,如何不影响服务,数据平滑迁移?

Original:58沈剑架构师之路 适用什么场景? 互联网有很多“数据量较大,并发量较大,业务复杂度较高”的业务场景,其典型系统分层架构如下: (1)上游是业务层biz,实现个性化的业务逻辑; (2)中游是服务层service,封装数据访问; (3)下游是数据层db,存储固化的...

2019-05-22 11:51:54

阅读数 194

评论数 0

转载 炸!亿级数据DB秒级平滑扩容!!!

Original:58沈剑架构师之路 一般来说,并发量大,吞吐量大的互联网分层架构是怎么样的? 数据库上层都有一个微服务,服务层记录“业务库”与“数据库实例配置”的映射关系,通过数据库连接池向数据库路由sql语句。 如上图所示,服务层配置用户库user对应的数据库实例ip。 ...

2019-05-22 11:43:09

阅读数 92

评论数 0

原创 数据结构与算法之美笔记 : 排序 「 二 」 归并排序 冒泡排序

归并排序和快速排序都用到了分治思想。 归并排序 如果要排序一个数组,我们把数组从中间分为前后两部分,然后对前后两部份分别排序,再将排序好的两部份合并在一起。 分治算法一般都是用递归来实现的。 分治是一种解决问题的处理思想,递归是一种编程技巧。 // 伪代码: 归并...

2019-05-21 18:42:50

阅读数 1199

评论数 3

原创 人人都是产品经理笔记-图鉴

来源: 人人都是产品经理 2.0 ...

2019-05-13 09:44:07

阅读数 160

评论数 0

转载 用得上的商学课-老路

目录: 第一章:机会成本 第二章:比较优势 第三章:沉没成本 第四章:边际成本 第五章:交易成本 第六章:供需定理 第七章:需求弹性 第八章:凡勃伦商品 第九章:边际效用 第十章:价格歧视 第十一章:囚徒困境 第十二章:人质困境 第十三章:智猪博弈 第十四章:斗鸡博弈 ...

2019-05-12 18:19:32

阅读数 3917

评论数 0

原创 数据结构与算法之美笔记 : 排序 「 一 」

执行效率:从以下3个方面来衡量 1)最好情况、最坏情况、平均情况时间复杂度 2)时间复杂度的系数、常数、低阶:排序的数据量比较小时考虑 3)比较次数和交换(或移动)次数 内存& 稳定性 原地排序: 空间复杂度为 O(1) 稳定排序: 比如我们有一组数据 2,9,3...

2019-05-10 18:05:56

阅读数 106

评论数 0

原创 数据结构与算法之美笔记 : 递归

递归条件: 一个问题的解可以分解为几个子问题的解 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样. 存在递归终止条件 f(n)=f(n-1)+1 其中,f(1)=1 写出递归公式, 找到终止条件 问题: 有 n个台阶, 一次可以走一个台阶或者两个...

2019-05-10 16:38:08

阅读数 101

评论数 0

原创 数据结构与算法之美笔记 : 队列

栈: 入栈 / 出栈 队列: 入队/ 出队 都是 操作受限的线性表数据结构. 数组实现: 顺序队列 链表实现:链式队列 数组实现: // 用数组实现的队列 public class ArrayQueue { // 数组:items,数组大小:n private...

2019-05-10 16:04:42

阅读数 56

评论数 0

转载 程序员的中年的危机应对手册

序: 技术的上游是产品,产品的上游是战略 战略的上游是资本。资本的上游是市场潜力。 1、如何看待程序员的中年的危机? A:中年危机一定有,或早或晚,担心也没有用。但是注意不要被别人过度放大,让你寝食难安。通过想办法提高自己的格局,来看待中年危机,它本质上就是对自己潜力的不信任。...

2019-05-10 15:14:41

阅读数 76

评论数 0

原创 数据结构与算法之美 : 栈

一、什么是栈? 1.后进者先出,先进者后出,这就是典型的“栈”结构。2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。 数组实现 == 顺序栈 链表实现 == 链式栈 // 基于数组实现的顺序栈 public class ArrayStac...

2019-05-10 14:58:00

阅读数 75

评论数 0

原创 数据结构与算法之美 : 链表

数据清理策略: FIFO(First in , Filst out ) : 先入先出 LFU( Least Frequently Used ) : 最少使用 LRU(Least Recently Used ) : 最近最少使用 数组 : 需要连续的内存空间来存储, 如果内存中的内存空...

2019-05-10 10:56:21

阅读数 68

评论数 0

转载 中华万年历大数据平台演进

单节点的统计系统 2014年之前,中华万年历统计的主要内容是广告,那时候统计方案是客户端采集到曝光、点击等数据,在客户端进行轻度汇总之后,提交到服务器,服务器通过redis做队列,采用Bitmap和Bitset的数据结构进行去重统计,然后快照到MySQL中,延时5分钟左右。这个阶段,运营和商务对...

2019-05-08 23:10:41

阅读数 164

评论数 0

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