数据结构

16 以太坊中的数据结构及其状态树

有些话、适合烂在心里 提交于 2020-02-18 00:08:26
​ ——————>> 二刷分界线。 ​ 以太坊中的数据结构 以太坊中的账户地址是160位(20个字节),一般表示成四十个十六进制的数。 简单的hash表来实现怎么样? 查询、更新都是在常数时间内完成的,另外这种结构无法很好的提供hash proof,比如要签署一个合约:需要提供一下账户余额,这将怎么提供呢: 一种方法是将哈希表中的元素组织成一棵Merkle tree,算出一个根哈希值保存在block header中,公布出去。 存在的问题:假如要产生新的区块,新的区块的到来必将引起哈希表中的内容发生变化,这样我们就需要重新计算一遍所有账户的内容生成一棵新的Merkle tree,这样的代价太大了(账户数量太多)。而实际上发生变化的账户只是一小部分,大部分用户的状态是不会发生改变的,所以每次都要重新构建一棵Merkle tree代价是很大的。 比特币系统中也是每出现一个区块就要构建一棵Merkle tree,但是为什么就没有这个问题?:比特币的Merkle tree是将交易组装成一棵Merkle tree,比特币的Merkle tree在每次重新构建完之后是不会更改的,区块里有多少交易呢:1m 每个交易250字节 所以最多4000个 实际上很多交易是几百个,所以我们每次发布一个区块都是要把几百个到几千个区块构建成一个新的Merkle tree。而我们如果在以太坊中使用这种方式

数据结构——ST表(RMQ)

六眼飞鱼酱① 提交于 2020-02-17 17:58:34
ST表类似树状数组、线段树。 适用于解决区间最值得查询得算法,预处理O(nlogn),查询上ST表为O(1),而线段树为O(logn)。但是ST表只能除了离线的,不能修改。 ST表得构造采用DP的思想。主体为一个二维数组st[][],s[i][j] 表示 [i, i + 2^j - 1]区间的最值。 转移方程为: st[i][j] = min(st[i][j-1], st[i+2^(j-1)][j-1]) 。当然也可以是最大值。 接下来就是查询操作。 一般情况下查询的区间[a, b]不会满足正好[i, i+2^(j-1) ],那么就要将区间分为俩个(可能一头一尾会有重叠),[a,a+2^k -1]和[b - 2^k +1, b]。 k = floor(log(b-a+1)/log(2))。 ans = (st[a][k], st[b-(1<<k) + 1][k])。 习题: 1.luogu p3865 ST板子题 链接 : luogu p3865 题意 :n个数,m次查询, 每次查询给一个区间,让你求该区间里面的最大值。 代码 : # include <bits/stdc++.h> using namespace std ; const int maxn = 1e5 + 50 ; int n , m ; int a [ maxn ] ; int st [ maxn ] [ 20 ]

Redis:几种基础数据结构和操作(1)

余生长醉 提交于 2020-02-17 15:27:34
一、键 是否存在exists 删除del 设置过期时间expire expireat pexpire pexpireat 设置永不过期persist 重命名rename renamenx 查询过期时间ttl 查询类型type 序列化dump 反序列化restore 排序sort 二、字符串String 增加set setnx setex 获取get mget 自增incr incrby incrfloat、自减decr decrby 批量增加mset 子字符串getrange 字符串长度strlen 三、哈希表Hash 增加hset hmset hsetnx 长度hlen 获取hget hgetall 键列表hkeys 值列表hvals 增加hincrby hincrbyfloat 删除hdel 四、链表List 插入lpush rpush lpushx rpushx 弹出lpop rpop 长度llen 阻塞弹出blpop brpop 弹出再插入rpoplpush 修改lset 删除lrem 获取列表lrange 获取索引值lindex 指定位置插入linsert 修建ltrim 五、集合set 增加sadd 长度scard 删除srem 获取成员列表smembers 判断是否在集合中sismember 集合差集sdiff sdiffstore 集合并集sunion

数据结构-栈

放肆的年华 提交于 2020-02-17 14:14:03
数据结构-栈 单调栈解决 Next Greater Number 一类问题 给一个字符串或一个数组要求对其进行分析 给一个字符串进行分析 给一个数组进行分析 二叉树的遍历 前序遍历 中序遍历 后续遍历 基本的核心思想就是:当解决某个问题的时候,只关心最近一次的操作,并且在操作完成了之后,需要向前查找到更前一次的操作 每次处理只对栈顶元素进行处理 单调栈解决 Next Greater Number 一类问题 这里题目是给定一个数组,找出每一个元素之后比它大的数值或者索引号。最粗暴的方法就是遍历数组,但是这是一个 O ( n 2 ) O(n^2) O ( n 2 ) 复杂度的方法。 思想: 利用排队的思想,比如找第一个元素2的Next Greater Number,那么就是找那个比2要高的,不被2挡住的第一个元素,那就是4,以此类推。 利用栈,从数组的后面开始遍历,逐个入栈,实际出栈顺序却是正序。 vector < int > nextGreaterElement ( vector < int > & nums ) { vector < int > ans ( nums . size ( ) ) ; // 存放答案的数组 stack < int > s ; for ( int i = nums . size ( ) - 1 ; i >= 0 ; i -- ) { // 倒着往栈里放

数据结构笔记

回眸只為那壹抹淺笑 提交于 2020-02-17 11:29:17
目录 数据结构 二叉搜索树 线段树 动态开点 线段树的合并 线段树优化建图 做法 例题 并查集 按秩合并 二分图判定 字典树 用字典树解决异或问题(01Trie) 字符串hash 双hash 进制hash 如何得到一个字符串所有子串的hash st表 倍增 lca转换为RMQ问题 tarjan算法离线求lca 一个复杂度的证明 非旋转treap即可持久treap 数据结构 二叉搜索树 递归定义 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 •维护一个集合,支持操作:插入、删除、查找 •方法:建立一棵有序的二叉树,每个结点对应集合中一个元素。 •满足性质:结点u的左子树的结点权值都比u小,右子树的结点权值都比u大。 •插入、删除、查找只需在二叉树中按照权值往下走即可。 可能的问题: 可能退化成一条链(例如如果按升序插入),那么每次操作平均复杂度O(n)需要一些技巧让二叉搜索树保持平衡。STL中的set和map都是平衡的二叉搜索树。noip一般情况下够用。 线段树 护区间信息的数据结构 每个结点对应一个序列的区间 完全二叉树,左子树为左一半区间,右子树为右一半 单点/区间修改。 动态开点 例题 维护一个数据结构

数据结构(8) -- 算法应用实例

陌路散爱 提交于 2020-02-17 09:30:58
文章目录 1.最大子列和问题 算法1: 算法2: 算法3: 算法4,在线处理: 总结: 1.最大子列和问题 算法1: public class Demo5 { static int [ ] list = { - 2 , 11 , - 4 , 13 , - 5 , - 2 } ; //算法1: public static int maxSubseqSum1 ( int [ ] list ) { int length = list . length ; int i , j , k ; int thisSum , maxSum = 0 ; for ( i = 0 ; i < length ; i ++ ) { //i是子列子列左端位置 for ( j = i ; j < length ; j ++ ) { //j是子列右端位置 thisSum = 0 ; //thisSum是list[i]到list[j]的子列和 for ( k = i ; k <= j ; k ++ ) { thisSum += list [ k ] ; if ( thisSum > maxSum ) { maxSum = thisSum ; } } } } return maxSum ; } public static void main ( String [ ] args ) { int i =

Redis之基本数据结构

若如初见. 提交于 2020-02-17 08:59:06
文章目录 Redis可以做什么 Redis5种基本数据结构 String字符串 redis是动态字符串,最大512M,小于1M时加倍现有空间,大于1M时加倍1M的空间 批量对多个字符串读写,节省网络耗时 设置key的过期时间-涉及到过期策略 计数功能 list列表-相当于LinkedList 队列-右边进左边出 栈-右边进右边出 ltrim截取 hash字典-相当于hashmap set集合-相当于hashSet zset有序集合-相当于sortedSet 容器型数据结构通用规则 如果不能深入地了解系统,技术和框架背后的深层原理,很多问题无法理解到本质,更谈不上解决,临时抱佛脚也于事无补。 Redis可以做什么 记录帖子的点赞数,评论数,点击数 记录用户帖子id列表,便于快速显示用户的帖子列表 记录帖子的标题,摘要,作者和封面信息,用于列表页显示 记录帖子的点赞用户id列表,评论id列表,用于显示和去重计数 缓存近期热帖内容,减少数据库压力 如果帖子ID是自增的,使用redis分配帖子ID 帖子和收藏集的关系 记录总热榜,分类热榜帖子ID列表 缓存用户行为历史,进行恶意行为过滤 Redis5种基本数据结构 他们是:字符串+列表+集合+哈希+有序集合 String字符串 比如缓存用户信息,需要使用JSON序列化成字符串存入缓存。取用户信息时又会经过一次反序列化的过程。

python基础学习笔记之建立复杂的数据结构

妖精的绣舞 提交于 2020-02-17 05:59:46
(一)比较几种数据结构 → 使用方括号 [ ] 创建列表 → 使用圆括号 ()创建字典 → 使用花括号 { } 创建字典 其中,每种类型中,都可以通过方括号 [ ] 对单个元素进行访问 → 对于列表和元组,方括号里是整型的偏移量,即 索引 → 对于字典,方括号里是 键 → 最后均返回 元素的值 (二)建立大型数据结构 ① 将这些 内置的数据结构 自由地组合成更大、更复杂的结构 ② 创建自定义数据结构的过程中,唯一的限制来自于这些 内置数据类型本身 建立 3 个不同的列表 alist = [ 1 , 2 , 3 ] blist = [ 'Hello' , 'python' ] clist = [ True , False ] 嵌套列表 / 元组 list_of_list = [ [ 1 , 2 , 3 ] , [ 'Hello' , 'python' ] , [ True , False ] ] tuple_of_list = ( [ 1 , 2 , 3 ] , [ 'Hello' , 'python' ] , [ True , False ] ) 列表嵌套,元素可以进行复制修改 >> > list_of_list [ 1 ] [ 1 ] 'python' >> > list_of_list [ 1 ] [ 1 ] = 'world' >> > list_of_list [ 1 ]

数据结构实训-各种排序

廉价感情. 提交于 2020-02-17 05:48:06
任务:用程序实现插入法排序、起泡法改进算法排序;利用插入排序和冒泡法的改进算法,将用户随机输入的一列数按递增的顺序排好。   输入的数据形式为任何一个正整数,大小不限。   输出的形式:数字大小逐个递增的数列。 # include <iostream> using namespace std ; void InsertSort ( int sort [ ] , int n ) { int i , j , t ; for ( i = 1 ; i < n ; i ++ ) { if ( sort [ i ] < sort [ i - 1 ] ) { t = sort [ i ] ; j = i - 1 ; do { sort [ j + 1 ] = sort [ j ] ; j -- ; } while ( j >= 0 && sort [ j ] > t ) ; sort [ j + 1 ] = t ; } } } void BubbleSort ( int sort [ ] , int n ) { int i , j , t ; bool ex ; for ( i = 0 ; i < n ; i ++ ) { ex = false ; for ( j = n - 1 ; j > i ; j -- ) if ( sort [ j ] < sort [ j - 1 ] ) { t =

数据结构的三要素

不打扰是莪最后的温柔 提交于 2020-02-17 02:07:49
数据结构的三要素: 1.数据的逻辑结构 2.数据的物理结构(存储结构) 3.数据的运算 一、数据的逻辑结构 线性表 1.1 一般线性表 1.2 受限线性表 1.2.1 栈 1.2.2 队列 1.3 线性表推广 1.3.1 数组 1.3.2 广义表 非线性表 2.1 集合 2.2 树形结构 2.2.1 一般树 2.2.2 二叉树 2.3 图状结构 2.3.1 有向图 2.3.2 无向图 二、数据的物理结构(存储结构) 顺序存储 2. 链表存储 3. 索引存储 4. 散列存储 三、数据的运算 如:检索、插入、删除、更新、排序等。 ———————————————— 版权声明:本文为CSDN博主「superjoson21」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/superjoson21/article/details/8147014 来源: CSDN 作者: OneITman 链接: https://blog.csdn.net/OneITman/article/details/104343387