MySQL补充说明 存储内容:聚簇索引的叶节点存储的是数据行本身,而主键索引(在非聚簇实现中)的叶节点存储的是指向数据行的指针或主键值(在聚簇实现中,主键索引的叶节点也存储数据行,但这时的主键索引与聚簇索引是重合的)。物理存储顺序:聚簇索引决定了数据在磁盘上的物理存储顺序,而主键索引不一定与数据的物理存储顺序一致。对于二级索引idx_key1来说,所有字符串前缀为‘a’的二级索引都是相邻的,也就意味着,我们只要定位到了第一条前缀为‘a’的记录,沿着记录向后扫描,直至某条二级索引的前缀不为‘a’即可。
JavaWeb servlet是一个接口,有一个HttpServlet extends GenericServlet,这个GenericServlet implements Servlet, ServletConfig, Serializable。在这么复杂的继承以及实现关系下,当我们定义的类继承了HttpServlet后,就可以通过前人写好的方法来进行Java Web的开发。来实现在网页上的呈现。那么就得通过一个服务器来实现。没错这个服务器就是Tomcat。
Linux ls -l 显示的内容如上图所示前面的那串乱码是什么意思呢??chown newowner 文件/目录 改变所有者chown newowner:newgroup 文件/目录 改变所有者和所在组-R 选项,如果是目录,就使得其目录下所有的文件和目录所有者递归生效任务调度:是系统在某个时间执行的特定的命令或程序任务调度分类: 1. 系统工作:有些重要的工作必须周而复始的执行2. 个别用户工作:个别用户可能希望执行某些程序。
JVM内存模型与线程 Java内存模型的主要目的是定义程序当中各种变量访问规则,即关注在虚拟机中把变量存储到内存和从内存当做取出变量值这样的底层细节。此处的变量不包括局部变量和方法参数,因为后者是线程私有的。Java内存模型当中规定了所有的变量都存储在主内存当中。每条线程还有自己的工作内存,线程的工作内存当中还保存了被该线程使用的变量的主内存副本(这个对象的引用,对象中某个在线程当中访问到的字段是有可能会被复制的,并不会复制全部内容)。线程对变量的多有操作都需在工作内存当中进行,而不能直接读写主内存当中的数据。
虚拟机字节码执行引擎 栈帧是用于支持虚拟机进行方法调用执行背后的数据结构每一个栈帧都在Java程序进行编译的时候,他需要多大的空间,多么深的操作都被计算好了后写入了Code属性当中,所以一个栈帧需要多少内存只取决于程序源码和虚拟机的栈内存结构每一个栈帧都包括局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在活动线程线程当中只有位于栈顶的方法才是运行的,只有处于栈顶的栈帧才是生效的,我们称其为“当前栈帧”
类文件及其加载机制 Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在文件当中,中间没有任何的分隔符,这使得整个Class文件当中存储的内容几乎完全都是程序运行的必要数据。当Class文件需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。根据《虚拟机规范》的规定,Class文件格式采用类似C语言结构体的伪结构来存储数据。这种伪结构当中只有两种数据类型:“无符号数”和“表”。
内存区域与内存溢出异常 程序计数器就是当前线程的字节码的行号指示器,是程序控制流的指示器,分支,循环,跳转,异常处理,均要这个计数器来完成。Java虚拟机的多线程是线程轮流切换,分配执行时间来实现的,所以在任何一个时刻,一个处理器只会执行一条指令,执行完后会依赖程序计数器恢复到正确的执行位置,每条线程都有一个独立的程序计数器,放置他们的内存是线程私有的内存,其互不影响,独立存储。
算法模块方法总结(数组) 二分查找(Binary Search)是一种在有序数组(必须是不能重复的,因为如果有重复的,会从几个符合的选项中输出一个,可能不合题意)中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。二分查找的思想是便于理解的,但是边界条件是很容易写错的。比如下面的。
回溯算法1 上面说过了,每一个回溯法都可以抽象为一个二叉树,这个一维数组就是path,用于记录路径。回溯算法可以解决 组合问题,切割问题,子集问题,排列问题,棋盘问题(n皇后)。在java语言中可以使用list来写。在解决这些问题的时候可以使用n循环,但是十分困难,使用回溯就比较容易。回溯法通常可以抽象为一个n叉树往下是递归,宽度是一个for循环。我们首先声明两个数组,一个是一维数组,一个是二维数组。组合问题:集合1234,找出大小为2的组合。回溯函数又称为递归函数,是纯暴力搜索。我使用一个例子来说明该问题。
Tire 字典树、前缀树 字典树(又称单词查找树或Trie树)是一种树形结构,它是哈希树的变种,通常用于统计、排序和保存大量的字符串(但不仅限于字符串)。字典树在搜索引擎系统中常用于文本词频统计。它的主要优点在于能够利用字符串的公共前缀来减少查询时间,从而最大限度地减少无谓的字符串比较,因此查询效率通常比哈希树高。字典树的基本操作包括查找、插入和删除,但删除操作相对较少见。在查找操作中,通常从根节点开始,依次搜索关键词的每个字母,直到找到对应的节点或确定关键词不存在于树中。
前K个高频元素 这块我们得考虑清楚,因为堆中只去维护k个大小的,所以当堆的大小达到k的时候,我们push进去一个新的元素,就要去pop栈顶元素,这块要是我们使用的大顶堆,每次都会pop出大的元素,到了最后剩下的就是小的元素,要是我们使用的小顶堆,剩下的就是频率较大的元素。我们首先想到的是map,map当中存储key和value,value代表着频率,最后在根据value进行排序,输出前k的元素,时间复杂度是nlogn。但是我们仅仅需要的是前k个高频元素,所以无需对全部元素进行排序,只需要去维护一个大小为k的有序集合即可。
桶排序(Bucket Sort) 当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。桶排序的核心在于合理设计桶的数量和每个桶的范围,使得数据能均匀分布到各个桶中,进而降低后续排序的复杂度。桶排序的步骤主要包括初始化桶确定桶的数量及每个桶对应的数据范围,遍历待排序序列将每个元素放入对应的桶中,以及对每个非空桶内部使用其他排序算法进行排序。总的来说,桶排序是一个利用函数映射关系将数据分布到有限数量的桶中,再对每个桶内的数据进行排序,最后按顺序合并得到全局有序序列的排序算法。的键是数组元素的“桶”ID,值是数组元素的值。
递归解决树的相关问题 这道题,我首先想到删除该节点的标志在于左右节点为null,并且该节点的值为0,使用栈对树进行层序遍历后存储,接着删除即可,但是这里存在着一个问题,使用栈弹出的节点,进行删除,并不能影响到原树中的元素,删除节点时,你需要确保父节点正确地更新其子节点的引用。递归算法的基本思想是将一个大规模的问题拆分成若干个规模较小的子问题来解决,子问题的解决方式与原问题相同,只是规模更小。那么就得保存一个路径可以告知父节点,这个时候就可以使用递归的方法。对于删除节点,查找特殊节点的时候,我们就可以使用这种方法来解决。
使用队列对二叉树进行广度遍历 我们首先创建一个队列,开始遍历二叉树,这里记录一个值len,表示当前层有多少个元素,当然第一层也就是根(root),只有一个元素,那么就是len=1,在遍历的过程当中,我们将使用while循环,而len是否大于0作为判断条件,这样就可以知道这一层是否遍历完,进入遍历时,弹出root,len--,接着对root的左右节点进行判断是否为null,不为null的话就offer进队列当中。我们要对二叉树进行广度遍历,经典的数据结构就是队列,这也是许多算法题中要用到的基础,下面是一些基本思想。
LCR 039 对于每个元素,如果栈不为空且栈顶元素对应的柱子高度大于等于当前柱子高度,那么就将栈顶元素弹出,因为当前柱子会遮挡住它,使得它无法成为其他柱子的左侧第一个比它矮的柱子。这样,栈中的元素对应的柱子高度是单调递减的。right[i] 存储的是 heights[i] 右侧第一个比它矮的柱子的下标,如果不存在,则设为 n 是 heights 的长度。left[i] 存储的是 heights[i] 左侧第一个比它矮的柱子的下标,如果不存在,则设为 -1。,数组中的数字用来表示柱状图中各个柱子的高度。