无锡做网站专业的公司,建筑设计公司招聘,wordpress漫画小说,微信营销软件手机版今日总结 java随笔录——什么是聚簇索引#xff0c;什么是非聚簇索引#xff1f;什么是覆盖索引#xff1f;AI随探录——NLP中RNN到Attention机制的演进代码随想录——n皇后#xff0c;贪心算法—分发饼干 目录
今日总结
详细内容
java随笔录
1、什么是聚簇索引#x…今日总结java随笔录——什么是聚簇索引什么是非聚簇索引什么是覆盖索引AI随探录——NLP中RNN到Attention机制的演进代码随想录——n皇后贪心算法—分发饼干目录今日总结详细内容java随笔录1、什么是聚簇索引什么是非聚簇索引2、什么是覆盖索引AI随探录NLP中RNN到Attention机制的演进代码随想录回溯算法—n皇后贪心算法——分发饼干详细内容java随笔录1、什么是聚簇索引什么是非聚簇索引聚集索引非聚集索引二级索引 与回表操作息息相关聚集索引将数据存储与索引放到了一块索引结构的叶子节点保存了行数据必须有而且只有一个二级索引将数据索引分开存储索引结构的叶子结点关联的是对应的主键找到主键值后到聚集索引中查找整行数据该过程就叫回表查询。该索引可以存在多个聚集索引选取规则如果存在主键主键索引就是聚集索引如果不存在主键将使用第一个唯一UNIQUE索引作为聚集索引如果表没有主键或没有合适的唯一索引则InnoDB会自动生成一个rowid作为隐藏的聚集索引2、什么是覆盖索引覆盖索引是指查询使用了索引并且需要返回的列在该索引中已经全部能够找到。例子如下如果一个表中将id设为主键他即是主键索引也是聚集索引将name设置为普通索引。有三个语句select * from user where id 2;select id,name from user where name liliya;select id, name ,gender from user where name liliya;其中ab属于覆盖索引因为经过索引查询后可以找到所有的所需数据。但是c中gender不在索引查询中的范围中需要进行回表查询通过二级索引找到主键id的值在聚集索引中的叶子节点查找到数据。因此覆盖索引是直接走聚集索引查询一次索引扫描直接返回数据性能高。但是如果返回的列中没有创建索引有可能会触发回表查询尽量避免使用select *AI随探录NLP中RNN到Attention机制的演进1、循环神经网络RNN 通过隐藏状态传递历史信息(h_t tanh(W_{ih} * x_t W_{hh} * h_{t-1} b_h))其中(h_{t-1})是上一时刻的隐藏状态负责传递历史信息tanh是激活函数限制输出范围-1~1。仅通过一个循环单元实现时序依赖建模。但是对于早期时刻的信息难以捕捉会造成梯度消失或梯度爆炸问题。通过隐藏状态传递历史信息(h_t tanh(W_{ih} * x_t W_{hh} * h_{t-1} b_h))其中(h_{t-1})是上一时刻的隐藏状态负责传递历史信息tanh是激活函数限制输出范围-1~1。仅通过一个循环单元实现时序依赖建模。但是对于早期时刻的信息难以捕捉会造成梯度消失或梯度爆炸问题。2、长短期记忆网络LSTM针对 RNN 的 “梯度消失” 和 “长记忆缺失” 问题提出结构化记忆单元通过三大门控机制遗忘门、输入门、输出门精确控制信息的存储更新遗忘。解决了长依赖问题但是参数数量暴增训练成本变高结构变得很复杂。3、门控循环单元GRU在 LSTM 的基础上简化结构保留核心门控逻辑同时减少参数和计算量将遗忘门和输入门合并为更新门用重置门替代输出门。4、Seq2SeqEncoder-Decoder模型编码器主要由一个循环神经网络RNN/LSTM/GRU构成其任务是将输入序列的语义信息提取并压缩为一个上下文向量。在模型处理输入序列时循环神经网络会依次接收每个token的输入并在每个时间步步更新隐藏状态。每个隐藏状态都携带了截止到当前位置为止的信息。随着序列推进信息不断累积最终会在最后一个时间步形成一个包含整句信息的隐藏状态。这个最后的隐藏状态就会作为上下文向量context vector传递给解码器用于指导后续的序列生成。解码器主要也由一个循环神经网络RNN / LSTM / GRU构成其任务是基于编码器传递的上下文向量逐步生成目标序列。在生成开始时循环神经网络以上下文向量作为初始隐藏状态并接收一个特殊的起始标记 sosstart of sentence作为第一个时间步的输入用于预测第一个 token。随后在每一个时间步模型都会根据前一时刻的隐藏状态和上一步生成的 token预测当前的输出。这种“将前一步的输出作为下一步输入”的方式被称为自回归生成Autoregressive Generation它确保了生成结果的连贯性。生成过程会持续进行直到模型生成了一个特殊的结束标记 eosend of sentence表示句子生成完成。说明起始标记和结束标记会在训练数据中显式添加模型会在训练中学会何时开始、如何续写以及何时结束从而掌握完整的生成流程。5、Attention 机制传统的 Seq2Seq 模型中编码器在处理源句时无论其长度如何最终都只能将整句信息压缩为一个固定长度的上下文向量用作解码器的唯一参考。这种设计存在两个显著问题信息压缩困难固定向量难以完整表达长句或复杂语义容易丢失关键信息缺乏动态感知解码器在每一步生成中都只能依赖同一个上下文向量难以根据不同位置的生成需要灵活提取信息。为了解决上述问题研究者引入了 Attention 机制。其核心思想是解码器在生成目标序列的每一步时不再依赖于一个静态的上下文向量而是根据当前的解码状态动态地从编码器各时间步的隐藏状态中选取最相关的信息以辅助当前步的生成。代码随想录回溯算法—n皇后按照国际象棋的规则皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题研究的是如何将n个皇后放置在n×n的棋盘上并且使皇后彼此之间不能相互攻击。给你一个整数n返回所有不同的n皇后问题的解决方案。每一种解法包含一个不同的n 皇后问题的棋子放置方案该方案中Q和.分别代表了皇后和空位。示例 1输入n 4输出[[.Q..,...Q,Q...,..Q.],[..Q.,Q...,...Q,.Q..]]解释如上图所示4 皇后问题存在两个不同的解法。示例 2输入n 1输出[[Q]]class Solution { ListListString result new ArrayList(); private void back(int n, int row,char[][] chessboard) { if(row n) { result.add(ArraytoList(chessboard)); return; } for(int i 0; i n; i) { if(isValue(row,i,n,chessboard)) { chessboard[row][i] Q; back(n,row 1, chessboard); chessboard[row][i] .; } } } public List ArraytoList(char[][] chessboard) { ListString list new ArrayList(); for (char[] c : chessboard) { list.add(String.copyValueOf(c)); } return list; } public boolean isValue(int row,int col, int n, char[][] chessboard ) { for (int i0; irow; i) { if (chessboard[i][col] Q) { return false; } } for (int irow-1, jcol-1; i0 j0; i--, j--) { if (chessboard[i][j] Q) { return false; } } for (int irow-1, jcol1; i0 jn-1; i--, j) { if (chessboard[i][j] Q) { return false; } } return true; } public ListListString solveNQueens(int n) { char[][] chessboard new char[n][n]; for (char[] c : chessboard) { Arrays.fill(c, .); } back(n, 0, chessboard); return result; } }贪心算法——分发饼干假设你是一位很棒的家长想要给你的孩子们一些小饼干。但是每个孩子最多只能给一块饼干。对每个孩子i都有一个胃口值g[i]这是能让孩子们满足胃口的饼干的最小尺寸并且每块饼干j都有一个尺寸s[j]。如果s[j] g[i]我们可以将这个饼干j分配给孩子i这个孩子会得到满足。你的目标是满足尽可能多的孩子并输出这个最大数值。示例 1:输入:g [1,2,3], s [1,1]输出:1解释:你有三个孩子和两块小饼干3 个孩子的胃口值分别是1,2,3。 虽然你有两块小饼干由于他们的尺寸都是 1你只能让胃口值是 1 的孩子满足。 所以你应该输出 1。示例 2:输入:g [1,2], s [1,2,3]输出:2解释:你有两个孩子和三块小饼干2 个孩子的胃口值分别是 1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出 2。class Solution { public int findContentChildren(int[] g, int[] s) { reverse(g); reverse(s); int sum 0; for(int i 0, j 0; i g.length j s.length;) { if(s[j] g[i]) { j; sum; } i; } return sum; } void reverse(int[] arr) { Arrays.sort(arr); for (int i 0; i arr.length / 2; i) { int temp arr[i]; arr[i] arr[arr.length - 1 - i]; arr[arr.length - 1 - i] temp; } } }