数据结构

CountDownLatch,CyclicBarrier,Semaphore

送分小仙女□ 提交于 2020-03-21 15:25:06
CountDownLatch是倒数,doneSignal = new CountDownLatch(LATCH_SIZE);赋初值后,在主线程中等待doneSignal.await();其它线程中,每完成一个就减一doneSignal.countDown();减到0时主线程继续。 CyclicBarrier是正数,cb = new CyclicBarrier(SIZE);主线程中开启各子线程,子线程调用cb.await()进行等待;cb计数count会加一,等于SIZE时会继续所有等待线程。 Semaphore是信号灯,Semaphore sem = new Semaphore(SEM_MAX);主线程中开启各子线程,子线程调用sem.acquire(count);每调用一次,sem计数会减相应数值,减为0时其它线程再调用acquire时会阻塞,线程结束后记得要sem.release(count); CountDownLatch和Semaphore用的是共享锁,而CyclicBarrier是独占锁。 CountDownLatch只能赋值一次,而CyclicBarrier可赋值多次。 概要 前面对" 独占锁 "和" 共享锁 "有了个大致的了解;本章,我们对CountDownLatch进行学习。 和ReadWriteLock.ReadLock一样

数据结构——树的相关概念

强颜欢笑 提交于 2020-03-21 12:58:05
平衡二叉树和二叉查找树 至多有两个子节点的树成为二叉树 1)平衡二叉树 1)树的左右高度差不能超过1. 2)任何往下递归的左子树和右子树,必须符合第一条性质 3)没有任何节点的空树或只有跟节点的树也是平衡二叉树 树的节点Node是key value的形式。因为key可能不连续,甚至不是整数,所以我们没办法使用数组来表示,这个时候我们就可以用二叉查找树来实现 2)二叉查找树 树如其名,二叉查找树非常擅长数据查找。 二叉查找树额外增加了如下要求:它的左子树上所有节点的值都小于它,而它的右子树上所有节点的值都大于它。 查找的过程从树的根节点开始,沿着简单的判断向下走,小于节点值的往左边走,大于节点值的往右边走,直到找到目标数据或者到达叶子节点还未找到。 通常设计Node节点来表示key value这样的数据对 二叉查找树的insert package bobo.algo; // 二分搜索树 // 由于Key需要能够进行比较,所以需要extends Comparable<Key> public class BST<Key extends Comparable<Key>, Value> { // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现 private class Node { private Key key; private Value value; private

再回首数据结构—红黑树(一)

被刻印的时光 ゝ 提交于 2020-03-21 12:57:24
红黑树与AVL树一样同为二分搜索树,红黑树又称为是保持“黑平衡”的二叉树,红黑树最大高度为:2logn,红黑树由这么几个独特的特征:   1、每个节点或黑或红   2、根节点为黑色   3、每个叶子节点(最后的空节点)都为黑色   4、如果一个节点为红色,则他孩子节点全为黑色   5、从任意节点到叶子节点,经过的黑色节点为一样多的   6、所有红色节点都向左倾斜   在之前的二叉搜索树中我们在实现的节点结构中定义了用于存储元素的e、用于存放左子树的left、用于存放右子树的right等对象,而在AVL树中比二叉搜索树有所不同由于AVL需要维护左右子树的节点高度所以多了一个元素height用于存放节点的高度;   红黑树也是基于之前二叉搜索树变体而来的,在红黑树中节点也只比二叉搜索树多一个元素,二叉搜索树的节点由以下元素组成:    e : 用于存储节点元素    left: 用于存储左子树    right: 用于存储右子树    color: 用于标志节点颜色,节点是红色或黑色 红黑树的代码定义: type RBT struct { root *RBTNode size int compare Comparable } type RBTNode struct { e interface{} left *RBTNode right *RBTNode color bool }

Java数据结构与算法-栈和队列

主宰稳场 提交于 2020-03-21 12:46:39
   (摘录加总结)------   栈和队列不属于基础的数据结构,它们都属于线性表。 一、栈   对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构。按照“先进后出”的原则进行存储数据。先进的元素在栈底,后进的元素在栈顶。需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。比较常规的说明是:栈底固定,而栈顶浮动;栈中元素个数为零时称为 空栈 。插入一般称为 进栈(PUSH) ,删除则称为 退栈(POP) 。   栈的实现结构包括 顺序结构实现 和 链式结构实现 。前者依据的是 数组 ,后者是 链表 。    (1)利用数组实现栈    下面这个是一个基本的实现:①在Stack底层设置了一个int数组,当然可以使用泛型来指代不同的数据类型。最大容量和栈顶位置。特别需要注意的是在初始化时也看出来,一般在初始化的时候top位置设置为-1,这是利于后面在压入数据的时候数组的第一位是array[0],并且maxSize最大容量和数组的length是一致的。②top表示这个数组的当前的没有被设置元素的第一个位置的标志位是多少,首先要判断是否小于maxSize-1,因为是从-1开始的,并且每次判断都是++top,是先自增的处理,示意如下,假如初始化了一个容量为3的数组:   ③当压栈完成的时候自然top的索引值已经变成了数组最高项的值的大小

Leetcode题解——数据结构之树

戏子无情 提交于 2020-03-21 09:06:04
递归 1. 树的高度 2. 平衡树 3. 两节点的最长路径 4. 翻转树 5. 归并两棵树 6. 判断路径和是否等于一个数 7. 统计路径和等于一个数的路径数量 8. 子树 9. 树的对称 10. 最小路径 11. 统计左叶子节点的和 12. 相同节点值的最大路径长度 13. 间隔遍历 14. 找出二叉树中第二小的节点 层次遍历 1. 一棵树每层节点的平均数 2. 得到左下角的节点 前中后序遍历 1. 非递归实现二叉树的前序遍历 2. 非递归实现二叉树的后序遍历 3. 非递归实现二叉树的中序遍历 BST 1. 修剪二叉查找树 2. 寻找二叉查找树的第 k 个元素 3. 把二叉查找树每个节点的值都加上比它大的节点的值 4. 二叉查找树的最近公共祖先 5. 二叉树的最近公共祖先 6. 从有序数组中构造二叉查找树 7. 根据有序链表构造平衡的二叉查找树 8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值 9. 在二叉查找树中查找两个节点之差的最小绝对值 10. 寻找二叉查找树中出现次数最多的值 Trie 1. 实现一个 Trie 2. 实现一个 Trie,用来求前缀和 递归 一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。 1. 树的高度 104. Maximum Depth of Binary Tree (Easy)

模板 - 数据结构 - 无旋Treap / FHQ Treap

痞子三分冷 提交于 2020-03-21 08:23:05
普通平衡树: #include<bits/stdc++.h> using namespace std; typedef long long ll; #define ls(p) ch[p][0] #define rs(p) ch[p][1] const int MAXN = 100000 + 5; int val[MAXN], ch[MAXN][2], rnd[MAXN], siz[MAXN], tot, root; void Init() { tot = root = 0; } void PushUp(int p) { siz[p] = siz[ls(p)] + siz[rs(p)] + 1; } void SplitValue(int p, int v, int &x, int &y) { if(!p) { x = y = 0; return; } if(v < val[p]) { y = p; SplitValue(ls(p), v, x, ls(p)); PushUp(y); } else { x = p; SplitValue(rs(p), v, rs(p), y); PushUp(x); } } void SplitRank(int p, int rk, int &x, int &y) { if(!p) { x = y = 0; return; } if(rk <=

java中常用的数据结构--Collection接口及其子类

青春壹個敷衍的年華 提交于 2020-03-21 03:49:29
   java中有几种常用的数据结构,主要分为Collection和map两个主要接口 (接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。  一、集合和数组的区别 二、Collection集合和Map集合 三、Collection接口 1、定义 public interface Collection<E> extends Iterable<E> {} 它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。 Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。 2、Collection集合的API 四、List 1、定义:    List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。 public interface List<E> extends Collection<E> {} 2、List接口的实现类 (1)ArrayList:底层数据结构是 数组

Excel表格转Json数据结构

北慕城南 提交于 2020-03-21 03:23:54
Excel表格转Json数据结构 辗转了好几个项目,每个项目的导表工具都巨难用,速度慢,潜规则多,扩展性差,不易于调试。Sqlite,Json,Lua,Xml各种格式都用过。 举个例子: 大多数导表工具不支持文本数组的解析,因为它们对数组的解析算法异常粗暴,无非就是一个Split(value, ","),当你的文本数组没有逗号时,一切都OK,一旦出现逗号,解析结果错误,但程序依旧正常运行,直到游戏中读取错误时,你才能意识到出问题了。 不能类型组合,通常这些导表工具都不支持类型之间的组合,例如整数数组,哈希数组等等。有的支持整数数组,但它并不是把整数和数组两个类型结合,而是单独定义了一个 整数数组 的类型,当需要稍微复杂一点的结构时,则不支持甚至完全不能实现,比如数组嵌套数组。 错误无法定位,输出的错误信息几乎没有看不懂,策划更是束手无策。 没有类型安全,当配置表的某个字段名被修改时,程序可能完全不知道,直到游戏中读取配置错误。 数据结构 在数据结构上我个人最理想的数据格式是Json。 Sqlite 对客户端不友善,大多数客户端对SQL语句并不熟悉。作为配置数据而言,关系数据库的优势并不明显,如果数据查询需要复杂的SQL语句,这个数据结构设计本身就是错误的,如果仅使用简单的SQL语句查询,那为什么不直接用Key-Value数据结构?此外,Sqlite需要用专门的数据库软件浏览

小蚂蚁学习数据结构(36)——插入排序中的希尔排序

匆匆过客 提交于 2020-03-21 00:02:39
3 月,跳不动了?>>> 插入排序中的第二种排序方法——希尔排序。 思路是先将要排序的序列分割成若干个子序列,分别对子序列进行直接插入排序,基本有序后,再对整个序列进行直接插入排序。 步骤:1,分割成若干子序列。2,对子序列进行直接插入排序。3,知道增量为1,进行一次全部直接插入排序即可。 希尔排序是一种不稳定排序,但是相比较直接插入排序,在时间复杂度上还是有很大程度的提升。 直接插入排序的时间复杂度是n^2,而希尔排序的时间复杂度为n^(3/2)。 # include <stdio.h> void shellSort( int * a, int n ) { int dk, j, i, t; //首先,先确定增量 dk = n/2; //增量循环递减 while( dk >= 1 ) { //内部实际上就是一个直接插入排序 for( i = dk; i < n; ++i ) { //将确定的值赋予一个中间变量 t = a[i]; //直接插入排序,但是j是按照增量递减的 for( j = i - dk; j >= 0 && t < a[j]; j-=dk ) { a[ j + dk ] = a[j]; } a[ j + dk ] = t; } --dk; } } int main( void ) { int i; int a[6] = { 55, 68, 25, 16, 89, 2

数据结构:第一章学习小结

泪湿孤枕 提交于 2020-03-20 23:32:59
心得体会:初学第一章数据结构时,看着新老知识交替着出现,我感到熟悉又陌生,好在书上对数据结构与算法进行了详细的说明,老师也以视频的方式对其进行了归纳总结,我才逐渐感觉摸到了这门学科的门把手。 本学期的目标:希望在大致掌握数据结构的内容后,我能够结合所学知识对以前及以后使用c++或其他语言敲下的代码进行分析与优化,充分运用所学知识,牢固记忆,加深思考。 目前存在的困难:缺乏纸质教材,还不太适应在电子教材上记笔记和注释,因上下滑动的操作导致记忆点也有些模糊 下一阶段的努力目标:在家中也要自律,做到课前预习,课后及时完成作业,并将每节课学习的内容以思维导图的方式做笔记,牢固知识点。 来源: https://www.cnblogs.com/csy1/p/12535543.html