leetcode-697. 数组的度
697. 数组的度
12345678910111213141516171819202122232425262728293031323334353637class Solution { public int findShortestSubArray(int[] nums) { // 寻找最大的度 Map<Integer, Integer> map = new HashMap<>(); int max = 0; for(int num : nums){ map.put(num, map.getOrDefault(num, 0) + 1); max = Math.max(max, map.get(num)); } // 找出最大度的数字 List<Integer> list = new ArrayList<>(); for (Map.Entry ...
leetcode-1760. 袋子里最少数目的球
1760. 袋子里最少数目的球
二分查找递归寻找答案是否满足条件
123456789101112131415161718192021222324252627282930class Solution { public int minimumSize(int[] nums, int maxOperations) { int l = 1; int r = Integer.MAX_VALUE; int ans = 0; while (l <= r) { int mid = l + (r-l)/2; if (check(nums, maxOperations, mid)){ r = mid -1; ans = mid; }else{ l = mid + 1; } ...
leetcode-1004. 最大连续1的个数 III
1004. 最大连续1的个数 III
12345678910111213141516171819202122232425class Solution { public static int longestOnes(int[] A, int K) { int n = A.length; int ans = 0; int count = 0; int i = 0; int j = 0; while (j < n) { if (A[j] == 0) { count++; } while (count > K) { // 缩小窗口 if (A[i++] == 0) { count--; ...
leetcode-面试题 10.01. 合并排序的数组
面试题 10.01. 合并排序的数组
123456789101112131415161718192021222324252627class Solution { public void merge(int[] A, int m, int[] B, int n) { int len = m + n; for (int i = len - 1; i >= 0; i--) { if (m == 0){ // 把B放到A for (int j = 0; j < n; j++) { A[j] = B[j]; } return; } if (n == 0){ // 直接return retur ...
acwing-245. 你能回答这些问题吗
acwing-245. 你能回答这些问题吗
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130import java.io.*;class Main{ static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System ...
洛谷-P1198 [JSOI2008]最大数
洛谷-P1198 [JSOI2008]最大数
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293import java.io.*;class Main{ static Node[] tree; static BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out)); public static void main(String[] args) throws IOException { ...
mysql笔记07-数据库索引原理
数据库索引原理
页分裂
当数据不断插入时,当数据页满了会产生页分裂,如果指定了主键并不是自增的,页分裂时也会维护为自增的,会将递增的主键放在一起,不会出现一个数据页中的主键比它页号小的数据页中的主键还要大的情况,如发生这种情况则会交换数据页中的数据,保证随着数据页的递增,主键也是递增的
主键索引目录
每个数据页的页号会和数据页中的最小主键值放在一起,形成一个索引的目录,有了索引目录后,比如要查找id=3的数据,此时会跟每个数据页的最小主键来比,首先id=3大于了数据页2里的最小主键值1,小于数据页8中的最小主键值4,则说明数据在数据页2中,当有很多数据页的时候完全可以使用二分查找
索引目录中存储着最小主键值和对应的数据页号,但是表中可能存在很多数据页,然后主键目录中会存放大量最小主键值和数据页号,这样也是不行,再考虑到这个问题之后,实际上采用了把索引数据存储在数据页的方式实现的,此时就为索引页,
mysql笔记06-锁机制
锁机制
当事务A更新一行数据时,先把数据读入缓存页,此时事务A对这行数据更新,会先看这行数据有没有加锁,如果没有加锁的话,事务A将会对这行数据进行加锁,将自己的事务id和等待状态false写入锁中,此时事务B来更新这行数据时,发现这行数据已经有锁了,事务B也会对这行数据创建一把锁,这把锁包含B事务id和锁的等待状态,但是此时事务B锁的等待状态是true,表示正在排队等待,若此时事务A执行完毕,会将锁释放,并判断是否还有其它锁等待这行数据进行更新,,于是发现事务B也对这行数据进行了加锁,此时事务A会将事务B的锁的等待状态改为false并会唤醒事务B继续执行,此时事务B就获取到锁了
mysql笔记05-多个事务并发更新查询
多个事务并发更新查询
脏写、脏读、不可重复读和幻读
脏写:事务A写入一个值,然后事务B改变了事务A写入的值,过段时间事务A回滚了,事务B的修改丢失了
脏读:事务A写入一个值,事务B读取事务A的值,后来发现值后来被事务A回滚了
不可重复读:事务A读取了一个值,事务B此时更改了值并提交了事务,事务A再次查询,发现值变成了事务B更新的值
幻读:一个事务用一样的SQL多次查询,每次查询都会查到一些之前没有看到过的数据
SQL层面的事务隔离级别
读未提交:不可能两个事务在没提交的情况下更新同一行的数据值,及不允许发生脏写,但是在这种情况下会发生脏读、不可重复读、幻读
读已提交:不会发生脏写、脏读,可能会发生不可重复读和幻读,因为其他事务一旦修改了值提交了事务,你的事务就会读到,所有可能多次读到的值是不同的
可重复读:不会发生脏写、脏读、不可重复读,因为你一个事务多次查询一个值,哪怕别的事务提交了这个事,但是不会读到其它事务提交的值,你的事务一旦开始,多次查询一个值,会读取到同一个值
串行化:不允许多个事务并行执行,只能串行执行
MVCC多版本并发控制机制
ReadView:执行一 ...
mysql笔记04-redo log日志刷入磁盘流程
redo log日志刷入磁盘流程
redo log有自己的储存结构即为redo log block,redo log buffer是mysql启动的时候,跟操作系统申请的一块连续的内存空间,然后再里面划分出了N多个空的redo log block,redo log buffer的默认值就是16M,每一个redo log block为512kb。
平时在执行事务的一个过程中,每个事务都可能存在多个增删改操作,那么就会有多个redo log,这么多redo log就是一组redo log,其实每组redo log都现在别的地方暂存,然后都执行完了,再把一组redo log给写入到redo log buffer的block里去的,如果一组redo log实在太多了,那么就会存放在多个redo log block中
redo log buffer中的缓冲日志什么时候写入磁盘?
如果写入redo log buffer的日志已经占据了redo log buffer总容量的一半了,也就是超过了8M的redo log已经在缓冲里面了,此时就会把他们刷入到磁盘文件里去
一个事物提交的时候,必须把他 ...