next

Mysql(mysql总结)

久未见 提交于 2020-10-28 10:38:36
数据库结构( 原文 ) 在 InnoDB 存储引擎中,所有的数据都被逻辑地存放在表空间中,表空间(tablespace)是存储引擎中最高的存储逻辑单位,在表空间的下面又包括段(segment)、区(extent)、页(page): 1、.frm 文件用来描述表的格式或者说定义; 2、 .i bd 文件 数据索引、数据信息(默认所有表在一个文件中,打开 innodb_file_per_table设置按表区分 ); 同一个数据库实例的所有表空间都有相同的页大小;默认情况下,表空间中的页大小都为 16KB; 每个 16KB 大小的页中可以存放 2-200 行的记录。 索引 CREATE TABLE users( id INT NOT NULL, first_name VARCHAR( 20) NOT NULL, last_name VARCHAR( 20) NOT NULL, age INT NOT NULL, PRIMARY KEY( id), KEY(last_name, first_name, age) KEY(first_name) ); 聚集索引 B+ 树通过 B+ 树实现的就会使用 id 作为索引的键,并在叶子节点中存储一条记录中的所有信息。 所有正常的表应该有且仅有一个聚集索引(绝大多数情况下都是主键),表中的所有行记录数据都是按照聚集索引的顺序存放的。 辅助索引

Linux用户空间与内核空间(理解高端内存)

空扰寡人 提交于 2020-10-28 10:38:12
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址映射模型 x86 CPU 采用了段页式地址映射模型。 进程代码 中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 Linux内核地址空间划分 通常 32位Linux内核 地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。 Linux内核高端内存的由来 当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址 一对一 的映射,如逻辑地址0xc0000003对应的物理地址为0×3,0xc0000004对应的物理地址为0×4,… …,逻辑地址与物理地址对应的关系为 物理地址 = 逻辑地址 – 0xC0000000 逻辑地址 物理内存地址 0xc0000000 0×0 0xc0000001 0×1 0xc0000002 0×2 0xc0000003 0×3 … … 0xe0000000 0×20000000 … … 0xffffffff 0×40000000 ?? 假 设按照上述简单的地址映射关系

字符串-KMP

六月ゝ 毕业季﹏ 提交于 2020-10-28 09:42:47
文章目录 KMP 原理 模板 例题 HDU-1686Oulipo HDU-2087剪花布条 POJ-2752Seek the Name, Seek the Fame POJ-2406Power Strings 后记 KMP KMP是单模式匹配算法,即在一个长度为 n n n 的文本串S中查找一个长度 m m m 的模式串P。它的复杂度是 O ( n + m ) O(n+m) O ( n + m ) ,差不多是此类算法能达到的最优复杂度。 它是如何做到的?简单说,它通过分析P的特征对P进行预处理,从而在与S匹配的时候能够跳过一些字符串,达到快速匹配的目的。 原理 以 S [ ] = " a b c a b c a b c d " , P [ ] = “ a b c d ” S[]="abcabcabcd",P[]=“abcd” S [ ] = " a b c a b c a b c d " , P [ ] = “ a b c d ” 为例, i i i 指向 S [ i ] S[i] S [ i ] , j j j 指向 P [ j ] P[j] P [ j ] 。 图(c)说明KMP算法,指向 S S S 的 i i i 指针不会回溯,而是一直往后走到底; 同图(b)的朴素算法相比,大大减少了匹配次数。 那么KMP是如何做到 i i i 不回溯,只回溯 j j j 呢? j j j

Linux用户空间与内核地址空间

六月ゝ 毕业季﹏ 提交于 2020-10-28 09:29:02
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。 Linux内核高端内存的由来 当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0xc0000003对应的物理地址为0×3,0xc0000004对应的物理地址为0×4,… …,逻辑地址与物理地址对应的关系为 物理地址 = 逻辑地址 – 0xC0000000 逻辑地址 物理内存地址 0xc0000000 0×0 0xc0000001 0×1 0xc0000002 0×2 0xc0000003 0×3 … … 0xe0000000 0×20000000 … … 0xffffffff 0×40000000 ?? 假 设按照上述简单的地址映射关系

pycharm安装

五迷三道 提交于 2020-10-28 09:25:47
1、首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#section=windows,下载PyCharm安装包,根据自己电脑的操作系统进行选择,对于windows系统选择下图的框框所包含的安装包。 2、选择Windows系统的专业版,将其下载到本地,如下图所示: 3、双击下载的安装包,进行安装,然后会弹出界面: 4、选择安装目录,Pycharm需要的内存较多,建议将其安装在D盘或者E盘,不建议放在系统盘C盘: 5、点击Next,进入下图的界面: Create Desktop Shortcut创建桌面快捷方式,一个32位,一个64位,小编的电脑是64位系统,所以选择64位。 勾选Create Associations是否关联文件,选择以后打开.py文件就会用PyCharm打开。 6、点击Next,进入下图: 默认安装即可,直接点击Install。 7、耐心的等待两分钟左右,如下图: 8、之后就会得到下面的安装完成的界面: 9、点击Finish,Pycharm安装完成。接下来对Pycharm进行配置,双击运行桌面上的Pycharm图标,进入下图界面: 选择Do not import settings,之后选择OK,进入下一步。 10、选择Accept,进入下一步: 11、进入激活界面

可中断获取锁与超时等待获取锁源码分析

心已入冬 提交于 2020-10-28 07:55:16
可中断式获取锁 可响应中断式锁可调用方法lock.lockInterruptibly();该方法的底层会调用AQS的acqireInterruptibly方法; acquireInterruptibly()方法: public final void acquireInterruptibly(int arg) throws InterruptedException { //这里会先检查是否有被中断,如果有则抛出一个中断异常 //否则尝试去获取同步状态,成功直接退出,失败则进入doAcquireInterruptibly(arg)方法 if (Thread.interrupted()) throw new InterruptedException(); if (!tryAcquire(arg)) doAcquireInterruptibly(arg); } doAcquireInterruptibly()方法: 如果当前线程的前驱节点为队头时,尝试获取同步状态 若获取成功则将队头节点出队,当前线程置为持有锁线程,并将队头指针指向当前线程所封装的节点,否则不断自旋直到获取成功或者线程被中断 /** * Acquires in exclusive interruptible mode. * @param arg the acquire argument */ private void

Tarjan算法

ⅰ亾dé卋堺 提交于 2020-10-28 06:47:35
写在前面:   Tarjan全家桶   Tarjan的代码除了Tarjan求LCA外,长得都一样,分清楚细微差别就好了   关于代码,我是复制了第一个板子后删改写出来的,长得极为相似,很多地方只有两三行不一样,建议双屏逐行对比一下看看具体哪里不一样   需要特别注意的是,在无向图中,边双连通分量需要用 边标记法 ,而点双连通分量需要用 点标记法 ,切勿弄混   非原创内容标明出处 目录 Tarjan求强连通分量 Tarjan求边双连通分量 Tarjan求桥 Tarjan求点双连通分量 Tarjan求割点 Tarjan缩点/染色 Tarjan求LCA * lenguaer-tarjan 2-SAT Tarjan求强连通分量   有向图 强连通 :   在 有向图G 中,如果两个顶点v i ,v j 间(v i >v j )有一条从v i 到v j 的有向路径,同时还有一条从v j 到v i 的有向路径,则称两个顶点强连通。可知至少要有三个点 强连通 图 :   如果 有向图 G 的 每两个点 都强连通,称 G 是一个强连通图 强连通分量 :    有向图G 的 极大 强连通子图,称为强连通分量 ——bia度百科 例子: 网上用烂的图   1,4强连通   图G'(包含点1,4,5,2和仅在这四点之间相互连接的5条边)是强连通图   而图G(包含所有点,所有边)不是强连通图  

git创建远程仓库以及在本地提交到远程仓库的方法

假装没事ソ 提交于 2020-10-28 06:46:31
Git create remote repository and usage in the local environment 1. create the remote repository loggin the server $ cd ~/git/git_learn/ $ mkdir project.git $ cd project.git $ git init --bare thus there are some files and directories in the directory '~/git/git_learn/project.git/', just like the following picture and then you need to add the write access to this repository, so that you can git push in the local environment $ cd ~/git/ git_learn $ chmod -R 777 project.git ( significant ) 2. In your local environment, open 'bash' shell, and initialize a local repository(git project) $ cd ~/ test

Java Hashcode

安稳与你 提交于 2020-10-28 06:27:15
哈希值这个应该都听过,并且用于hashMap, hashSet, HashTable.后面对这三个进行详细说明。 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: 1 public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。   为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法。 一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。   为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)   也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时

NOIP提高组历年真题题解

人盡茶涼 提交于 2020-10-28 04:59:59
2018 铺设道路 差分水题,推一下结论就好了。 #include<cstdio> #include <algorithm> using namespace std; int a[ 100005 ],d[ 100005 ],ansz,ansf; int main() { int n; scanf( " %d " ,& n); for ( int i= 1 ;i<=n;i++ ) scanf( " %d " ,&a[i]),d[i]=a[i]-a[i- 1 ]; for ( int i= 1 ;i<=n;i++ ) { if (d[i]< 0 ) ansf-= d[i]; else ansz+= d[i]; } printf( " %d\n " ,max(ansz,ansf)); return 0 ; } 货币系统 一开始以为是数学题,后来发现可以$dp$,很有意思的完全背包简单变形。 $f$数组下标存储每一个数,$true$表示已经出现,$false$表示不能被表示。 初始化$f[0]$为$true$。 #include<cstdio> #include <cstring> #include <algorithm> using namespace std; int n,a[ 205 ],f[ 25005 ],T; int main() { scanf( " %d " ,& T);