
优秀数据结构--默克尔树
一、简介 默克尔树是一种典型的二叉树结构,由一个根节点、一组中间节点 和 一组叶节点 组成。默克尔树最早由 Merkle Ralf 在 1980 年提出,曾广泛用于 文件系统 和 P2P 系统中,比如 Git、区块链、IPFS 等大名鼎鼎的项目或技术。 他又被称为 哈希树,即存储哈希值的树。树的叶子结点是 数据块(文件或者对象)的哈希值,而非叶子结点保存的是其子节点连接起来后的哈希值。简单来说,它有以下特点: ...

一、简介 默克尔树是一种典型的二叉树结构,由一个根节点、一组中间节点 和 一组叶节点 组成。默克尔树最早由 Merkle Ralf 在 1980 年提出,曾广泛用于 文件系统 和 P2P 系统中,比如 Git、区块链、IPFS 等大名鼎鼎的项目或技术。 他又被称为 哈希树,即存储哈希值的树。树的叶子结点是 数据块(文件或者对象)的哈希值,而非叶子结点保存的是其子节点连接起来后的哈希值。简单来说,它有以下特点: ...

一、前言 前段时间辞职骑完川藏线后回来找工作,面试 贝尔科教后端开发工程师 岗位时,遇到这样一个面试题: 有一个几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能。 ...

一、前言 大家应该对 二分查找算法 不陌生,二分查找之所以能达到 O(logN) 的时间复杂度,一个重要原因在于它所依赖的数据结构是数组,数组支持随机访问,可通过下标很容易地定位到中间的某个元素。但是链表就没有 随机访问数据 这个特性,要判断是否包含某个元素,只能从头开始遍历对比。但是数组有数组的局限性,比如需要连续的内存空间,插入删除操作会引起数组的扩容和元素移动;链表有链表的优势,链表不需要先申请连续的空间,插入删除操作的效率非常高。 ...

首先明确,Redis 是一个使用 C 语言编写的键值对存储系统。Redis 是众所周知的 “快”,一方面,它是一个内存数据库,所有的操作都是在内存中完成的,内存的访问速度本身就很快;另一方面,得益于它底层的数据结构。Redis 的常见类型可在这个网页找到:Redis 命令参考简体中文版,其使用到的底层数据结构有如下六种:简单动态字符串、双向链表、压缩列表、哈希表、跳表和 整数数组。本篇文章,将具体了解这些底层数据结构的实现。 ...

一、常见的索引类型 1. 哈希索引 哈希索引(Hash Index) 基于哈希表实现,只适合精确匹配,不适合范围查找。对于每一行数据,存储引擎都会使用一个哈希函数,对改行的对应索引列计算哈希code,通过 K-V 的形式保存起来,其中“K”为哈希 code,“V”是指向改行记录的指针。 ...

一、设计原理 哈希表(也就是我们说的map)是计算机应用领域非常重要的数据结构之一,读写的时间复杂度均是O(1),是典型的 以空间换时间 设计。它的优点除了读写性能优异,还在于它提供了键值之间的映射,为程序设计提供了极大的方便。要想实现一个性能优异的哈希表,需要关注两个关键点:哈希函数 和 冲突解决方法。 ...

一、概述 1. 为什么在内核的线程调度器之外,Go 还需要实现一个自己的调度器 主要解决系统线程太重的问题: 创建与切换线程 太重:都需要在用户态和内核态之间切换,开销较大; 系统线程内存使用 太重:一方面,创建系统线程时会分配一段大部分情况下都用不完的栈内存,造成浪费;另一方面,栈内存空间创建后其大小不会再变化,有溢出的风险。 goroutine 是 Go 语言实现的用户态的线程,可以看做是对系统线程进行的一层抽象。有了这层抽象,Golang 程序员不会直接面对系统线程,直接使用 goroutine 就可以了,而操作系统不会 care 什么 goroutine,只是执行设定好的系统线程就好了。这层抽象,就是 Go 的调度器,后面会详细说明。Go 很精巧地解决了上述两个问题: ...

1. Go语言指针的限制 go语言中也有指针,但相对C语言的指针来说,有了很多限制,但这也算是go的成功之处:既可以享受指针带来的便利,又避免了指针过度使用带来的危险。主要的限制如下: ...

在主流的编程语言中数组及其相关的数据结构是使用得最为频繁的,只有在它(们)不能满足时才会考虑链表、hash 表(hash 表可以看作是数组和链表的混合体)和更复杂的自定义数据结构。 ...

一、 前言 我们完成程序的编写之后,经过编译,编译器会将我们的程序编译成一行行机器指令,放到一个可执行文件中;程序执行时,可执行文件被加载到内存,机器执行被放置到虚拟内存的“代码段”,并分配以及初始化程序运行过程中需要的堆栈。会形成如下的结构: ...