info

树堆(Treap)

会有一股神秘感。 提交于 2020-01-19 08:04:27
平衡树 简介: 平衡二叉树(Balanced Binary Tree)具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。 Treap: 简介: Treap代码实现相对简单的一个算法,Treap是 heap+Tree,既满足堆的性质也满足平衡树的性质,一棵树的节点上有一个data用于存数据,fix是一个堆的优先级(假设我们是小顶堆),key是平衡树的比较值;key一般是给出的,然而fix我们随机生成,这样的随机会使得平衡树比较平衡。假设一棵排序二叉树插入一组有序的数,就会使得树退化为一条链。我们在插入的时候为每个节点随机生成一个fix(优先级)。插入时满足排序二叉树的性质。插入完成时检查是否满足堆的性质,并进行旋转操作使他满足堆的性质。 旋转操作: 为了满足堆的性质,我们需要对这棵树进行旋转以达到堆的性质。旋转操作看图 如图是旋转操作,我用的是指针链式的写法:所以,每次旋转需要调整两个节点的父子关系。以及指向P或者Q的那个指针。 下面给出指针的写法

JS 对象封装的常用方式

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-19 01:00:58
JS是一门面向对象语言,其对象是用prototype属性来模拟的,下面,来看看如何封装JS对象. 常规封装 function Person (name,age,sex){ this.name = name; this.age = age; this.sex = sex; } Pserson.prototype = { constructor:Person, sayHello:function(){ console.log('hello'); } } 这种方式是比较常见的方式,比较直观,但是Person() 的职责是构造对象,如果把初始化的事情也放在里面完成,代码就会显得繁琐,如果放在一个方法里初始化会不会好点呢? 升级版 (常见) function Person (info){ this._init_(info); } Pserson.prototype = { constructor : Person, _init_ : function(info) { this.name = info.name; this.age = info.age; this.sex = info.sex; } sayHello:function(){ console.log('hello'); } } 可是,说到这里就发现,name,age,sex 并没有在Person里面申明,哪来的呢??? new

JS 对象封装的常用方式

耗尽温柔 提交于 2020-01-19 01:00:44
JS是一门面向对象语言,其对象是用prototype属性来模拟的,下面,来看看如何封装JS对象. 常规封装 function Person (name,age,sex){ this.name = name; this.age = age; this.sex = sex; } Pserson.prototype = { constructor:Person, sayHello:function(){ console.log('hello'); } } 这种方式是比较常见的方式,比较直观,但是Person() 的职责是构造对象,如果把初始化的事情也放在里面完成,代码就会显得繁琐,如果放在一个方法里初始化会不会好点呢? 升级版 (常见) function Person (info){ this._init_(info); } Pserson.prototype = { constructor : Person, _init_ : function(info) { this.name = info.name; this.age = info.age; this.sex = info.sex; } sayHello:function(){ console.log('hello'); } } 可是,说到这里就发现,name,age,sex 并没有在Person里面申明,哪来的呢??? new

C#连接Oracle数据库

ε祈祈猫儿з 提交于 2020-01-18 22:23:30
c#连接Oracle方式很多,这里只说博主常用的一种。 插件:Oracle.ManagedDataAccess 环境:Oracle11g,visual studio2017 1.先创建好项目,然后点击工具栏上的“工具”——>“NuGet 包管理”——>“管理解决方案的NuGet程序包” 2.在收搜框中输入Oracle.ManagedDataAccess,并下载 3.在项目中引用Oracle.ManagedDataAccess.client 4.拼写连接数据库的字符串 string constr = "Data Source=127.0.0.1/XE;PERSIST SECURITY INFO=True;User Id=softwareProjectTest;password = softwareProjectTest" ; //userID和password根据自己的用户名和密码更改,Oracle11g默认数据库为xe,如有改动,自行更改 来源: CSDN 作者: 一身孤注掷温柔 链接: https://blog.csdn.net/weixin_43488671/article/details/104033091

Java设计模式详解-迭代器模式

你说的曾经没有我的故事 提交于 2020-01-18 18:55:29
1 概念 1.1 定义 提供一种方法,顺序访问同一集合对象中的各个元素,而又不暴露该对象的内部表示 1.2 类型 行为型 迭代器模式(Iterator Pattern) 目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发,其定义如下: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。) 迭代器是为容器(能容纳对象的所有类型都可以称之为容器,例如Collection、Set等)服务的,迭代器模式就是为解决遍历这些容器中的元素而诞生的 1.3 通用类图 迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器执行 1.4 角色 Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法: first()获得第一个元素 next()访问下一个元素 hasNext()是否已经访问到底部 ConcreteIterator具体迭代器 具体迭代器角色要实现迭代器接口,完成容器元素的遍历。 Aggregate抽象容器

基于Netty和SpringBoot实现一个轻量级RPC框架-Client端请求响应同步化处理

自作多情 提交于 2020-01-18 16:29:28
前提 前置文章: 《基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇》 《基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇》 《基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇》 前一篇文章简单介绍了通过动态代理完成了 Client 端契约接口调用转换为发送 RPC 协议请求的功能。这篇文章主要解决一个遗留的技术难题:请求-响应同步化处理。 需要的依赖如下: JDK1.8+ Netty:4.1.44.Final SpringBoot:2.2.2.RELEASE 简单分析Netty请求-响应的处理流程 图中已经忽略了编码解码器和其他入站出站处理器,不同颜色的线程代表完全不相同的线程,不同线程之间的处理逻辑是完全异步,也就是 Netty IO 线程( n-l-g-1 )接收到 Server 端的消息并且解析完成的时候,用户调用线程( u-t-1 )无法感知到解析完毕的消息包,那么这里要做的事情就是让用户调用线程( u-t-1 )获取到 Netty IO 线程( n-l-g-1 )接收并且解析完成的消息包。 这里可以用一个简单的例子来说明模拟 Client 端调用线程等待 Netty IO 线程的处理结果再同步返回的过程。 @Slf4j public class NettyThreadSyncTest {

Sqoop基本语法简介

风格不统一 提交于 2020-01-18 11:19:56
1.查看命令帮助 [hadoop@hadoop000 ~]$ sqoop help usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Export an HDFS directory to a database table help List available commands import Import a table from a database to HDFS import-all-tables Import tables from a database to HDFS import-mainframe Import datasets from a mainframe server to HDFS job Work with saved jobs list-databases List available databases on a server list-tables List

RK3288 OpenCL 打印platform 和device 信息

ε祈祈猫儿з 提交于 2020-01-18 04:44:12
准备工作: 1)下载头文件: https://github.com/KhronosGroup/OpenCL-Headers/tree/master/CL 2)从RK3288 android 系统路径 /system/vendor/lib/egl 中到处库文件 libGLES_mali.so 1.打印platform 信息; 2.打印device 信息; 3.打印总是工作项目; void print_openCL_platform_device() { int i, j; char info[1024]; cl_int err; cl_uint nPlatform; cl_platform_id *listPlatform; cl_uint nDevice; cl_device_id *listDevice; cl_uint nMaxComputeUnits = 0; cl_uint nMaxWorkItemDims = 0; size_t *nMaxWorkItemSizes = NULL; size_t nMaxGlobalWorkSize = 1; size_t nMaxWorkGroupSize = 0; err = clGetPlatformIDs(0, NULL, &nPlatform); if(err < 0) { perror("Couldn't find any

异常处理,枚举,泛型

倾然丶 夕夏残阳落幕 提交于 2020-01-18 00:00:56
Java异常处理: 5个关键字: try(尝试)、catch(捕获)、 finally(最终的)、throw(抛出)、throws 使用方法: finally :一般写的是资源释放代码,无论是否发生异常代码总能执行。 try{}catch(异常类型){} try{}catch(异常类型){} finally{} public class TestThrows { //除法 public double div() throws ArithmeticException{ int a=1; int b=0; if(b==0){ throw new ArithmeticException("aaaaaa"); } return a/b; } public static void main(String[] args) { TestThrows tt = new TestThrows(); try { tt.div(); } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); } } } //如果有finally的话,finally中的代码是在return之前执行的 子类抛出的异常范围,不能宽于父类; 异常类关系: java.lang.Object 继承者 java.lang

GTK入门

早过忘川 提交于 2020-01-17 19:18:17
环境准备 官网 下载 GTK 源码包,因为本机 GLib 版本不够,下载一个非最新版的 GTK3.8.0 先学习用 直接阅读 "/gtk+-3.8.0/docs/reference/gtk/html/gtk-building.html" 进行操作 安装完毕, gtk3-demo 出来 gtk 的样例界面即安装搞定 实例学习 编译命令和编译脚本 编译参数包括 pkg-config --libs --cflags gtk+-3.0 为了方便,用脚本管理起来 build.sh #!/bin/bash if [ $# -lt 1 ]; then echo "usage: $0 [xxxx.c]" exit fi gcc -o $1_out $1 `pkg-config --libs --cflags gtk+-3.0` 一个简单的HelloWorld按钮 01_simple_button.c #include <gtk/gtk.h> // 回调函数1 void hello( GtkWidget *widget, GdkEvent *event, gpointer data ) { g_print("Hello World\n"); } // 回调函数2 void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit(); }