t1

MySQL的JOIN(二):JOIN原理

醉酒当歌 提交于 2020-01-16 01:20:29
表连接算法 Nested Loop Join(NLJ)算法: 首先介绍一种基础算法:NLJ,嵌套循环算法。循环外层是驱动表,循坏内层是被驱动表。驱动表会驱动被驱动表进行连接操作。首先驱动表找到第一条记录,然后从头扫描被驱动表,逐一查找与驱动表第一条记录匹配的记录然后连接起来形成结果表中的一条记。被驱动表查找完后,再从驱动表中取出第二个记录,然后从头扫描被驱动表,逐一查找与驱动表第二条记录匹配的记录,连接起来形成结果表中的一条记录。重复上述操作,直到驱动表的全部记录都处理完毕为止。这就是嵌套循环连接算法的基本思想,伪代码如下。 foreach row1 from t1 foreach row2 from t2 if row2 match row1 //row2与row1匹配,满足连接条件 join row1 and row2 into result //连接row1和row2加入结果集 首先加载t1,然后从t1中取出第一条记录,之后加载t2表,与t2表中的记录逐个匹配,连接匹配的记录。 Block Nested Loop Join(BNLJ)算法: 再介绍一种高级算法:BNLJ,块嵌套循环算法,可以看作对NLJ的优化。大致思想就是建立一个缓存区,一次从驱动表中取多条记录,然后扫描被驱动表,被驱动表的每一条记录都尝试与缓冲区中的多条记录匹配,如果匹配则连接并加入结果集。缓冲区越大

CSP2019 游记

a 夏天 提交于 2020-01-15 13:59:51
先自我介绍一下,我就是那个 \(day1\ t1\) 没有 \(A\) 掉的菜鸡。 Day 0 为了在 \(CSP2019\) 之前改完 \(NOIP2018\) ,早上 \(7\) 点多起床改 \(\lceil\) 填数游戏 \(\rfloor\) 。 由于太菜 (太颓) ,改到中午 \(11\) 点多。 下午去试机,到的时候离结束只剩 \(10\ min\) 了,敲完 \(a+b\) 跑路。 不知道为什么,好像就我这个考场试机结束得特别早。 晚上考前例行吃汉堡。 然后翻了翻近期模拟赛的题。 发现当时做不出来的现在还是做不出来,当时看懂题解的现在已经看不懂了。 玩到快 \(12\) 点才睡。 Day 1 在闹钟响之前醒来。定了 \(6:30\) 的闹钟,大概 \(5:40\) 就醒了。 \(8:30\) 比赛开始。 \(T1\) 人口普查题,几分钟就搞定了。 开始看 \(T2\) ,发现自己不知道怎么求 \(\lceil\) 以 \(u\) 为结尾的最短的合法括号序列 \(\rfloor\) 。 花了好长时间编了一个奇怪的 \(O(n)\) 做法,非常幸运地被第二个样例 \(hack\) 了。 然后好像已经快 \(10:00\) 了。 想起去年的 \(day\ 1\) , \(10:00\) 的时候已经切完 \(2\) 题了,然后心态就崩了。 在绝望之中编了一个 \(O(n

归并排序求逆序对

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-13 22:24:29
归并求逆序对 归并求逆序对 是分治的一个经典例子。 简述算法: 利用归并把序列对半分,在一般的归并过程中,我们在前后两部分各设两个指针,按照大小顺序合并成一个序列。 我们要做的就是在这个过程中记录逆序对个数,什么情况下会有逆序对呢? 无非是在前面的数比在后面的数大(翻译过来:在前半部分的数比在后半部分的数大) 设前半部分的指针为t1,后半部分的指针为t2 如果a[t1] > a[t2],那么t1~mid的元素一定都比t2大,一定都可以与t2形成逆序对: ans+= (mid- t1+ 1)+1 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 5 using namespace std; 6 7 const int N=100010; 8 int a[N],b[N],n,ans=0; 9 10 void merge(int l,int r) 11 { 12 if (l==r) return; 13 int mid=(l+r)>>1; 14 merge(l,mid); 15 merge(mid+1,r); 16 int t1=l; 17 int t2=mid+1; 18 for (int i=l;i<=r;i++) 19 { 20 if ((t1<=mid&&a[t1]<=a[t2])||t2>r) { 21

【Oracle】去除表中重复的数据

倾然丶 夕夏残阳落幕 提交于 2020-01-10 20:07:56
删除表重复数据 (t1表中有重复数据) 1、使用distinct create table t2 as select * from t1; create table tmp_t2 as select distinct * from t2; drop table t2;alter table tmp_t2 rename to t2(需停业务) ------------------------------------------------------------------------------------ 2、使用ROWID delete from t1 where rowid <>( select min(rowid) from t1 b where b.c1 = t1.c1 and b.c2 = t1.c2 ) ------------------------------------------------------------------------------------ 3、用rowid + group by 的方法 delete from t1 where rowid not in (select min(rowid) from t1 group by c1,c2 ); ------------------------------------------------

hive 沉默用户

早过忘川 提交于 2020-01-10 04:19:13
– 查询指定日期的沉默用户 启动一次,以后没有在使用,有时间长度限制(一周) use big12_umeng ; SELECT t1 . appid , t1 . appplatform , t1 . brand , t1 . devicestyle , t1 . ostype , t1 . appversion , count ( t1 . deviceid ) FROM ( SELECT t . appid appid , t . appplatform appplatform , t . brand brand , t . devicestyle devicestyle , t . ostype ostype , t . appversion appversion , t . deviceid deviceid FROM ( SELECT appid , appplatform , brand , devicestyle , ostype , appversion , deviceid , count ( createdatms ) cnt , #访问的次数 min ( createdatms ) firsttime #第一次访问的时刻 FROM appstartuplogs WHERE #指定的时间 concat ( ym , day ) <= '${ymd}' group

C#-运算符重载

我的未来我决定 提交于 2020-01-07 17:57:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 通过运算符重载,可以对我们设计的类使用标准的运算符,例如+、-等。这称为重载,因为在使用特定的参数类型时,我们为这些运算符提供了自己的实现代码,其方式与重载方法相同,也是为同名方法提供不同的参数。运算重载符定义>,同样需要定义<;同样定义运算符==,!=也需要定义,同时最好重写GetHashCode()方法和Equals(Object o)方法。 class Time { private int hour; private int min; public Time(int hour, int min) { this.hour = hour; this.min = min; } public void Add(Time t) { this.hour = this.hour + t.hour + (t.min + this.min) / 60; this.min = (this.min + min) % 60; } public override string ToString() { return string.Format("{0,2}:{1,2}", hour, min); } public override bool Equals(object obj) { return this == (Time)obj

浅析线程进程相关的知识点

只谈情不闲聊 提交于 2020-01-01 03:56:39
1.线程、进程 1.1 概念 进程 :引入:为了程序能够并发执行,且为了对并发执行的程序加以描述和控制,引入了进程的概念。   (1)进程是程序的一次执行。   (2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。   (3)进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。   (4)进程是作为能够拥有资源和独立运行的基本单位。 线程 : 引入:在操作系统中引入线程,是为了减少程序并发执行时锁付出的空间开销,使OS具有更好的并发性。1.2 1.2 线程与进程进行比较   线程具有许多传统进程所具有的特征,所以又称为轻量级进程或进程元,相应的把进程称为重量级的进程,传统进程相当于只有一个线程的任务,在引入了新城的操作系统中,通常一个进程都拥有若干个线程,至少也有一个线程。   相同点:   (1)调度:   (2)并发性:在引入了线程的操作系统中,进程之间或一个线程中的多个线程之间都可以并发执行。   (3)拥有资源:不论是传统的操作系统还是引入了线程的操作系统,进程都可以拥有资源,是系统中拥有资源的有个基本单位。   (4)系统开销:在某些操作系统中,线程的切换、同步和通信都无需操作系统内核的干预。   不同点 :   (1)调度:在传统操作系统中,进程是拥有资源的基本和独立调度、分派的基本单位,在引入了线程的操作系统中

T1到T4级数据中心有何区别?

偶尔善良 提交于 2019-12-17 18:19:01
  互联网,科技行业发展迅速,企业数据爆发式的增长,让数据的安全、储存和管理变得越来越重要,但因为储存数据需要大量的资源,所以把数据交给专业的公司以及专业的IDC数据中心进行管理和储存,变成了众多企业的优先选择之一。      而说到数据中心,不得不提的就是最高规格的T4级的数据中心了。      T4级数据中心究竟是什么呢?      “T”即是Tier,是根据美国标准TIA-942《数据中心的通信基础设施标准》,考量基础设施的“可用性”、“稳定性”和“安全性”,将IDC分为了四个等级,分别是Tier1、Tier2、Tier3、Tier4,而Tier4则是最高的等级。      T1 - T4级数据中心,他们有何区别,不同在哪里?      基本型-T1数据中心      T1数据中心可以接受数据业务的计划性和非计划性中断,只需要提供计算机配电和冷却系统,并且不一定要提供UPS或发电机组,因此这是一个单回路系统,容易产生多处单点故障。      在年度检修和维护时,或遇到紧急状态时会高频率宕机,同时操作故障或是设备自身故障也会造成系统中断。      组件冗余-T2数据中心      T2数据中心的设备具有组件冗余功能,以减少计划性和非计划性的系统中断。这类数据中心要求提供高架地板,UPS和发电机组,同时设备容量设计应满足N+1备用要求,单路由配送。     

Cpp学习笔记(1)

孤者浪人 提交于 2019-12-16 22:20:12
1、内存申请 如果要申请20个结构体complex,那么可以这样写: C的内存申请: complex arr = ( complex * ) malloc ( 20 * sizeof ( complex ) ) ; C++: 释放: complex arr = new complex [ 20 ] delete arr 申请时自动出构造,释放时自动出析构。 释放已释放的内存会崩 2、函数模板 防止多次写相同的东西,注意只能在参数数量相同的情况下能用 格式是这样的: /*template A(A是template的类型) 返回类型 函数名 参数表 {函数体} */ template t1 , t2 t1 max ( t1 a , t2 b ) { return a > b ? a : b ; } /*这个函数会返回t1类型的值*/ /*调用如下*/ int a = 10 ; float b = 10.212 ; cout << max ( a , b ) << endl ; /*t1是int,t2是float,会返回b的t1类型值,即10*/ 3、类和对象 ·类的定义 class student /*class是关键字*/ { public : student ( int id ) void input ( int id , float score , char * name ) ;

go中基本数据类型的相互转换

给你一囗甜甜゛ 提交于 2019-12-05 22:16:06
代码 // 基本数据类型的相互转换 package main import ( // 如果一个包没有被使用过,但又不想去掉,可在包名前加"_ "表示忽略 // 比如:_ "unsafe" "fmt" _ "unsafe" ) func main() { // n1为int类型 var n1 int = 100 // n2为int64类型,将n1赋值给n2的时候,需要将n1显式的转换为int64类型 var n2 int64 = int64(n1) // 同上,需要将n1显式转换为int8类型 var n3 int8 = int8(n1) // 同上,需要将n1显式转换为float32类型 var f1 float32 = float32(n1) // 格式化输出结果 // 可以看出不管将n1显式转换为什么类型,最后n1自身的类型仍然不变还是int类型 fmt.Printf("n1 = %v, n2 = %v, n3 = %v, f1 = %v, 最后n1的类型为%T\n", n1, n2, n3, f1, n1) // n1 = 100, n2 = 100, n3 = 100, f1 = 100, 最后n1的类型为int // n4为int32类型 var n4 int32 = 1000 // n5为int8类型,将n4赋值给n5,需要将n4从 // int32显式转换为int8