• ARTS(一)


    ARTS第一周,2019年3月17日,星期日,天气晴。

    A:算法学习(Algorithm)

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

    比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

    L   C   I   R
    E T O E S I I G
    E   D   H   N

    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"

    请你实现这个将字符串进行指定行数变换的函数:

    string convert(string s, int numRows);

    示例1:

    输入: s = "LEETCODEISHIRING", numRows = 3
    输出: "LCIRETOESIIGEDHN"

    示例2:

    输入: s = "LEETCODEISHIRING", numRows = 4
    输出: "LDREOEIIECIHNTSG"
    解释:
    
    L     D     R
    E   O E   I I
    E C   I H   N
    T     S     G

    算法描述:这个题需要找到规律,按着规律分析即可。先将字符串按照题目规律存放在字节数组中,然后遍历二维数组即可。

    代码如下:

    class Solution {
        public String convert(String s, int numRows) {
            if (s == null || s.length() < 1 || numRows <= 1) {
                return s;
            }
                
            int len = s.length();
            // 存储转换后的图像
            char[][] arrs = new char[numRows][len];
            int row = 0, col = 0;
            int index = 0;
            while (index < len) {
                while (row < numRows && index < len) {
                    arrs[row++][col] = s.charAt(index++);
                }
                row --;  // row 回到最后一行
                while (row > 0 && index < len) {
                    arrs[--row][++col] = s.charAt(index++);
                }
                // row 回到第二行, col列的第一个字符已经被上面的循环填充
                row ++;   
            }
            
            StringBuilder ret = new StringBuilder();
            for(int i = 0; i < numRows; i++) {
                for (int j = 0; j < len; j ++) {
                    char c = arrs[i][j];
                    if(c != 'u0000') {
                        ret.append(c);
                    }
                }
            }
            return ret.toString();
        }
    }

    R:Review 英文文档

    1、Java性能监控工具:jps

    2、链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html

    3、jps 命令可以列出当前机器上运行的所有 JVM进程,包括 jps 进程自身。

    命令格式:jps [option] [hostid]   

      - option:选项参数,在没有指定选项参数时,则只会打印 进程端口号应用程序名(或JAR文件名)的简短形式。

      - hostid:主机id,好像可以打印远程机器上的JVM进程信息。如果不指定 hostid,则默认为当前主机。

    options:  

      -q : 禁止显示类名、Jar文件名、传递给主方法的参数,只显示本地JVM的端口号列表。

       -m : 显示传递给主方法的参数,如果没有参数只显示主方法类名。对于嵌入式的jvm,值可能为null。

       -l : 显示应用程序的主类的完整包路径名,或应用程序的 jar 文件的完整路径名。

        例如:在idea中启动SpringBoot项目,打印出主类的全路径名

        例如:在命令行通过 java -jar xx-0.0.1-SNAPSHOT.jar 启动项目,输出Jar文件的完整名称。

      -v : 显示启动时传递给jvm的参数。

      -V : 禁止显示类名、Jar文件名、传递给主方法的参数,只显示本地JVM的端口号列表。

    hostid:

      如果需要查看其他机器上的 jvm 进程,需要在待查看机器上启动 jstatd 服务,然后通过jps命令查看。

     

    T:技术总结(Technology)

    mysql的存储引擎总结:

    1、InnoDB存储引擎

      InnoDB 是 mysql 的默认事务型引擎,同时也是使用最广泛的存储引擎。他被设计用来处理大量的短期(short-lived)事务,短期事务大部分情况是正常提交的,很少会被回滚。

      InnoDB 的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。因此 InnoDB 在事务型需求和非事务需求中都使用很广泛。

    InnoDB概览

      InnoDB 的数据存储在表空间(tablespace)中,表空间是一个由InnoDB管理的黑匣子,由一系列的数据文件组成。在mysql4.1之后,InnoDB可以将每个数据表和索引存储存放在单独的文件中。InnoDB也可以使用裸设备作为表空间的存储介质。

      InnoDB 采用 MVCC(多版本并发控制)支持高并发,并且实现了四个标准的隔离级别(读未提交、读已提交、可重复读、串形化)。其默认的隔离级别是REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,防止幻影行的插入。

      InnoDB 表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能。但是它的二级索引都必须包含主键列,因此主键列要尽可能的小。InnoDB的存储格式是平台独立的,也就是说可以将数据和索引文件从Intel平台复制到 PowerPc平台。

      InnoDB 内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够在内存中自动创建 hash索引 以加速读操作的自适应哈希索引(adaptive hash index),以及能够加速插入操作的插入缓冲区(insert buffer)等。注:建议阅读官方手册中的"InnoDB 事务模型和锁",还有了解 InnoBD的MVCC架构。

      作为事务型存储引擎,InnoDB 通过一些机制和工具支持真正的热备份,Oracle提供的 MySQL Enterprise Backup、Percona 提供的开源的 XtraBackup 都可以做到这一点。MYSQL 的其它存储引擎不支持热备份,要获取一致性的视图需要停止对所有表的写入,而在读写混合的场景中,停止写入可能也以为着停止读写。

    2、MyISAM 存储引擎

      MySQL 5.1 及之前,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁、崩溃后的安全恢复。MyISAM绝不是一无是处,对于只读的数据,或者表比较小,可以忍受修复(repair)操作,则依然可以使用MyISAM引擎。

    MyISAM存储:

      MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以 .MYD 和 .MYI为扩展名。mysql 会根据表定义来决定采用动态行还是静态 (长度固定) 行。 MyISAM表可以存储的行记录数,取决于可用的磁盘空间或者操作系统中单个文件的最大尺寸。

      在MySQL5.0中,MyISAM如果是变长行,默认配置只能处理 256TB 的数据,因为指向数据记录的指针长度是6字节。在更早版本中,指针长度默认4字节,所以只能处理4GB的数据。而所有的MYSQL版本都支持 8字节的指针。所以要改变 MyISAM表指针的长度 (调高或调低),可以通过修改表的 MAX_ROWS 和 AVG_ROW_LENGTH 选项值实现,两者想乘就是表可能达到的最大大小。修改这两个参数,会导致整张表和索引重建,需要很长时间。

    MyISAM特性:

      加锁与并发:mysql会对整张表进行加锁(共享锁或排他锁)。但是在表有读取查询时,也可以插入新的记录(这就是并发插入,CONCURRENT INSERT)。

      修复:对于 MyISAM表,mysql 可以手工或者自动 执行检查和修复操作,这里的修复和事务恢复以及崩溃恢复是不同的概念。执行表的修复可能会导致一些数据的丢失,而且修复很费时。可以通过 CHECK TABLE mytable 检查表的错误,如果有错误可以通过执行 REPAIR TABLE mytable 进行修复。另外,如果mysql服务器已经关闭,可以通过 myisamchk 命令行工具进行检查和修复操作。

      索引特性:对于 MyISAM表,即使是 BLOB 和 TEXT等长字段,也可基于前 500个字符创建索引。 MyISAM表也支持全文索引(基于分词创建的索引),支持复杂的查询。

      延迟更新索引健:创建 MyISAM表时,如果指定 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写入内存中的键缓冲区(in-memory key buffer),只有在清理键缓冲区或关闭表时才会将对应的索引块写入磁盘。这种方式可以提高性能,但是在数据库或主机崩溃时会造成索引损坏,需要进行修复操作。延迟更新索引的操作可以在全局设置,也可以单个表设置。

    MyISAM 压缩表

      如果表创建并导入数据之后,不会进行修改,这样的表或许适合采用  MyISAM表压缩表。

      可以使用 myisampack 对  MyISAM表进行压缩(也叫打包pack)。压缩表是不可以修改的(除非先解压缩、修改数据、再压缩)。压缩表可以极大减少磁盘空间占用,减少磁盘I/O,从而提升查询性能。压缩表支持索引,但索引是只读的。

      以现在的硬件能力,对于大多数场景,读取压缩表数据时的解压带来的开销影响并不大,而减少I/O带来的好处要大的多。压缩时表中的记录是独立压缩的,所以读取单个行时不需要解压整个表(甚至不用解压整个页面)

     MyISAM 性能

       MyISAM 引擎设计简单,数据紧密存储,在某些场景下性能很好。但是 MyISAM的表锁是非常典型的性能问题。

    3、MYSQL 内建的其他存储引擎

    Archive引擎

      Archive引擎只支持 INSERT 和 SELECT 操作。在MySQL5.1之前不支持索引。Archive引擎会缓存所有的写并利用 zlib 对插入的行进行压缩,比MyISAM表的磁盘I/O更少。但是每次 SELECT 都要全表扫描。所以Archive 表适合日志类或数据采集类应用,这类应用做数据分析时往往需要采集全部数据;或者在一些需要更快速的 INSERT 操作的场合下也可以使用。

      Archive引擎支持行级锁和专用的缓冲区,可以实现高并发插入。在一个查询开始到返回所有行数之前,Archive引擎会阻止其他的 INSERT操作,实现一致性读。另外也实现了批量插入在完成之前对读操作不可见。这种机制模仿了事务和MVCC的一些特性,但Archive引擎不是一个事务型引擎,而是针对插入和压缩做了一些优化。

    Blackhole引擎

      Blackhole引擎没有实现存储机制。但服务器会记录 Blackhole表的日志,所以可用于复制数据到备库,或者简单记录到日志。(不推荐使用)

    CSV引擎

      CSV引擎可以将普通的 CSV文件作为 MYSQL的表来处理,但这张表不支持索引。CSV引擎可以在数据库运行时拷入或烤出文件。可以实现 Excel数据 -> CSV文件 -> 复制到MySQL数据目录下,然后在 MYSQL中打开使用。同理,外部程序也可以读取 CSV格式的数据。因此 CSV引擎可以作为一种数据交换的机制,很有用。

    Memory引擎

      如果要快速的访问数据,并且数据不会被修改,重启后丢失也没关系,那么可以使用 Memory表。Memory表比MyISAM 至少快一个数量级,因为数据都保存在内存中。

      Memory表的结构在重启后还会保留,但数据会丢失。

      Memory表在很多场景可以发挥更好的作用:

    • 用于查找 或者 映射表,例如将邮件和州名映射的表。
    • 用于缓存周期性聚合数据的结果。
    • 用于缓存数据分析中产生的中间数据。

      Memory表支持hash索引,查询很快。但是无法取代传统基于磁盘的表。Memory是表级锁,并发写入较低,不支持BLOB和TEXT列,并且没行长度是固定的(varchar 实际存储时会转为 char)。

      如果MySQL在查询中需要使用临时表来保存结果,内部使用的临时表就是 Memory表。如果查询结果查过Memory的限制,或者含有BLOB或者TEXT字段,则临时表会转换为 MyISAM表。

      区分临时表和 Memory表:临时表是用 create temporary table 语句创建的表,可以使用任何存储引擎,因此和 Memory表不同。临时表只在单个连接中可见,当连接断开时,临时表将不存在。

    NDB 集群引擎

      2003年,当时的 MySQL AB公司从索尼爱立信公司收购 NDB数据库。然后开发了 NDB集群存储引擎,作为 SQL 和 NDB原生协议之间的接口。MySQL服务器、NDB 集群存储引擎,以及分布式的、share-nothing的、容灾的、高可用的NDB数据库组合,被称为 MySQL集群(MySQL Cluster)。

    S:分享(Share

       在遇到选择的时候,一定要静下心来好好想一想,自己到底想要什么。如果要和别人商量,一定要找行业大佬商量,这样决策会比较正确。

      平时和别人交流的时候,当遇到自己疑惑的地方,并且这个问题以后还有可能会出现,那么一定要当面了解清楚,否则你下次还是不明白,这期间会困绕你很久。

      面对浮躁的社会,不要浮躁、不要和社会上的人比、心里要有一盘大棋,这三年一定要沉淀出一些东西,沉淀出能让自己立于不败的本事。

      有好的想法就去尝试,不要给自己设限。任何事情如果单靠想,想的结果都是会失败,只有行动起来,一点一点的前进,解决过程中的问题,那么才有可能成功。

      对于学习,如果学一个知识点,一定要学懂、学会,并记录下来,尽量和以前的知识串起来,并抽空回顾。如果学了一知半解,并且没有做笔记,没有回顾,那么就等于没学。

     

  • 相关阅读:
    6、方法
    5、封装
    4、循环
    3、判断
    2、基本语法
    1、基本框架
    CodeForces 681C Heap Operations(模拟)
    CodeForces 682C Alyona and the Tree(广搜 + 技巧)
    URAL 2099 Space Invader题解 (计算几何)
    HDU 5833 (2016大学生网络预选赛) Zhu and 772002(高斯消元求齐次方程的秩)
  • 原文地址:https://www.cnblogs.com/shenqidu/p/10547737.html
Copyright © 2020-2023  润新知