数据结构

es6~Map数据结构

人走茶凉 提交于 2020-02-15 03:19:42
Map 含义和基本用法 JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。 const data = {}; const element = document.getElementById('myDiv'); data[element] = 'metadata'; data['[object HTMLDivElement]'] // "metadata" 上面代码原意是将一个 DOM 节点作为对象 data 的键,但是由于对象只接受字符串作为键名,所以 element 被自动转为字符串 [object HTMLDivElement] 。 为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。 const m = new Map(); const o = {p: 'Hello World'}; m.set(o, 'content') m.get(o) // "content" m.has(o) //

【数据结构】最小生成树之prim算法和kruskal算法

℡╲_俬逩灬. 提交于 2020-02-15 01:10:51
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种。看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解。 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优的问题,怎样修才是做好的,如下图:第一个是网全图,后三个图的修路方案都可以 1.树的定义:有n个顶点和n-1条边,没有回路的称为树 生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是生成树 最小:指的是这些边加起来的权重之和最小 2.判定条件:向生成树中任加一条边都一定构成回路 充分必要条件:最小生成树存在那么图一定是连通的,反过来,图是连通的则最小生成树一定存在 3.和最小生成树有关的两个算法:prim算法和kruskal算法 a)prim算法——让小树慢慢长大型算法 按照树的定义,一个顶点就是一棵树。 原理: 1)我们选择一个顶点,也就是选择了一个树。 2)向外找权重最小的边,这样这棵树就有了两个顶点 3)再以这两个顶点向外找权重最小的边,依次循环,知道所有顶点收到树里 举例: 第一步:选择V1作为顶点 第二步:对比一下与V1相连的各条边的权重,选择最小的V1-V4这条边 第三步:以V1和V4为树,向外找权重最小的边,这时就有了V1-V2,V4-V3两条边,这样就把顶点V2和V3收进了树里。 接着以V1,V2,V3,V4为顶点的树,向外选权值最小的边

利用数据结构排序的priority_queue

喜欢而已 提交于 2020-02-14 21:15:25
考虑以下几个问题: 将一个序列排序 某神仙: \(\mathtt{sort}\) !!! 每次取出最前面的两个数 某神仙: \(a_i\) 和 \(a_{i+1}\) 啊!! 相加,再加入序列 某神仙:...... for 循环乱搞啊! 保持序列的有序性 某神仙:(声音逐渐变弱)再搞一次 \(\mathtt{sort}\) 呗。 \(n≤10000\) ,请注意程序的时间复杂度 某神仙:卒( 于是,这就需要用到 STL queue 中的 \(\mathtt{priority\_queue}\) 了!!! 唯一需要注意的地方是 \(\mathtt{priority\_queue}\) 的定义,即 小根堆:priority_queue<int,vector<int>,greater<int> > q; 大根堆:priority_queue<int,vector<int>,less<int> > q; 其中第一个 int 表示优先队列存放的数据类型, vector<int> 表示存放的方式是数组, greater<int> 表示小根堆(从小到大), less<int> 表示大根堆(从大到小)。注意最后的两个 >> 要写成 > > ,否则可能会被编译器误认为位运算右移符号。 然后就是很基础的操作了: q.push(x) //在优先队列中插入x O(logN) q.top() /

java数据结构-排序算法-插入算法

偶尔善良 提交于 2020-02-14 20:43:29
package com.kuang;import java.util.Arrays;/** * @auther 付强 * @date 2020/2/14 - 19:02 */public class insertSort { public static void main(String[] args) { int[] arr=new int[]{11,3,2,53,2,5,9,1}; insertSort(arr); System.out.println(Arrays.toString(arr)); } public static void insertSort(int []arr){ int end=arr.length; //遍历所有的数字 for (int i = 1; i < end; i++) { //如果当前数字比前一个数字小 if(arr[i]<arr[i-1]){ //把当前遍历数字存起来 int temp=arr[i]; int j; //遍历当前数字前面所有数字 for(j=i-1;j>=0&&temp<arr[j];j--){ //把前一个数字赋给后一个数字 arr[j+1]=arr[j]; } //吧临时变量(外层for循环当前的元素)赋给不满足条件的后一个元素 arr[j+1]=temp; } } }} 来源: https://www.cnblogs

北京大学肖臻老师《区块链技术与应用》公开课笔记3

拈花ヽ惹草 提交于 2020-02-14 19:06:38
北京大学肖臻老师《区块链技术与应用》公开课笔记 比特币数据结构篇,对应肖老师视频:https://www.bilibili.com/video/av37065233?p=3 全系列笔记请见:https://blog.csdn.net/Mu_Xiaoye/article/details/104299664 Hash pointer(哈希指针) 指针 在程序运行过程中,需要用到数据。最简单的是直接获取数据,但当数据本身较大,需要占用较大空间时,明显会造成一定麻烦。因此,可以引入 指针 这一概念。当需要获取数据时,只需要按照指针所给的地址,去对应的位置读取数据即可,这样大大节省了内存空间。 在实际中,为了便于程序移植性等原因,指针实际上存储的是 逻辑地址 而非物理地址。 区块链结构本身为一条链表,节点为区块。而传统链表实现,便是通过指针将各个节点串联起来而称为最终的链。如下便是我们最常见的一个链表: 但在区块链系统中,并未采用指针,而是使用了 哈希指针 哈希指针 如下图对于该节点,我们可以看到有两个指针指向这个节点(实际上为一个),其中P为该节点的地址,H()为该节点的哈希值,该值与节点中内容有关。当节点(区块)中内容发生改变,该哈希值也会发生改变,从而保证了区块内容不能被篡改。 在比特币中,其最基本的数据结构便是一个个区块形成的区块链。 区块链与链表区别1:哈希指针代替普通指针

Java--数据结构之二叉搜索树

空扰寡人 提交于 2020-02-14 16:22:11
一、二叉搜索树Binary Search Tree 1、若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。 2、若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。 3、左、右子树也分别为二叉搜索树。 二、节点域设置 //根节点 private Entry < T > root ; //初始化 public BSTDemo ( ) { this . root = null ; } //节点域 public class Entry < T extends Comparable < T > > { private T data ; //数据域 private Entry < T > left ; //左孩子域 private Entry < T > right ; //右孩子域 public Entry ( ) { this ( null , null , null ) ; } public Entry ( T data , Entry < T > left , Entry < T > right ) { this . data = data ; this . left = left ; this . right = right ; } } 三、递归和非递归操作BST 1、插入 (1)递归插入 //插入 public void insert ( T val

数据结构-树与二叉树

谁说胖子不能爱 提交于 2020-02-14 15:31:50
一、树的定义与性质 <1>定义 结点(node):树枝分叉处、树叶、树根 根结点(root):树根 叶子结点(leaf):叶子结点 边(edge):茎干和树枝 子结点(child) 子树(subtree) <2>性质 树可以没有结点,把这种情况下称为空树(empty tree) 树的层次(layer),从根结点开始算起来,即根结点为第一层 把结点的子树棵树称为结点的度(degree),而树的中结点的最大的度称为树的度(也称为树的宽度) 对于有n个结点的树的边一定是n-1 叶子结点被定义为0的结点,因此当树只有一个结点时,根结点也算作叶子结点 结点的深度(depth)是指从根结点(深度为1),开始自顶向下逐层累加至该结点时的深度值;而高度(height)是指从最底层叶子结点开始自底向上逐层累加,而对于树而言,是选择最大的那个数,同时,深度和高度应该是一样的。 多棵树结合在一起就是森林(forest) <3>二叉树的递归定义 要么二叉树没有根结点,是一棵空树。 要么二叉树由根结点、左子树、右子树组成,且左子树和有子树都是二叉树。 区分二叉树和度为2的树 满二叉树:每一层结点个数都达到当层能够达到的最大结点数。 完全二叉树:除了最下面一层之外,其余层的结点个数都达到当层的最大结点数,且最下面一层只从左到右连续存在若干结点,而这些连续结点右边的结点全部不存在。 自己即是自己的祖先结点

数据结构之算法分析

梦想与她 提交于 2020-02-14 14:16:16
重要结论 如果 \(T_1(N) = 0(f(N))\) 且 \(T_2(N)=O(g(N))\) 那么 a. \(T_1(N) + T_2(N) = O(f(N) + g(N))\) b. \(T_1(N) * T_2(N) = O(f(N)*g(N))\) 如果 T(N) 是一个 k 次多项式,则 \(T(N) = O(N^k)\) 3. 对于任意常数k, \(log^kN = O(N)\) 表示,对数增长的非常缓慢 运算时间计算 时间单元的计算 一次赋值 一个时间单元一次四则运算 一个时间单元初始化 i、测试 i<=N,和对 i 的自增运算隐含着开销。所有这些总的开销是初始化一个时间单元 2. 一般法则 法则1 - for循环 一个 for 循环运行时间至少是该 for 循环内部那些语句(包含测试)的运行时间乘以迭代的次数 法则2 - 嵌套的 for 循环 从里向外分析这些循环,在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积 法则3 - 顺序语句 将各个语句的运行时间求和即可,其中的最大值就是所得到的运行时间如果 O(N) + O(N^2) 则 总量是 O(N^2) 法则4 - if/else 语句 一个 if/else 语句的运行时间从不超过判断的运行时间再加上 S1 和 S2中运行时间长者的总的运行时间。 例子

Redis系列 - 数据结构

早过忘川 提交于 2020-02-14 11:13:54
前言   转载自微信公众号:三太子敖丙 1、问:Redis有那些数据结构?   常见的5种:字符串(String),散列(Hash), 列表(List),集合(Set),有序集合(SortedSet)等;除此之外,还有HyperLogLog、Geo、Pub/Sub。    注 :之前项目组也有遇见过 BloomFilter( 布隆过滤器 ),这个能很好地防止缓存穿透的发生,它的原理也很简单,就是利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在,不存在你 Return 就好了,存在你就去查了DB刷新Key、Value,再Return。   传送门:《 防止缓存穿透的神器:BloomFilter》 2、问:Redis的5种数据结构,有哪些最适合的使用场景?   答:先从String说起吧。 String :   这个是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。   但是真实的开发环境中,很多人可能会把很多比较复杂的结构也统一转成 String 去存储使用,比如有的人他就喜欢把 对象 或者 List 转换为 JSONString 进行存储,拿出来再反序列化。   这里就不讨论这样做的对错了,但是我们在日常开发中,还是能在最合适的场景使用最合适的数据结构,这也是 代码规范 的一个表现。 String的适应应用场景比较多 缓存功能 :String

Redis---基础数据结构

ぐ巨炮叔叔 提交于 2020-02-14 05:54:12
1.String(字符串) 1.1 概述 字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。 String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 1.2 实现方式    String在redis内部存储默认就是一个字符串( SDS ),被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。 2. List(列表) 2.1 概述 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 2 32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收. 2.2 实现方式   Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。   如果再深入一点,你会发现 Redis 底层存储的还不是一个简单的 linkedlist