算法笔记

算法笔记

第一节课 :

时间复杂度
空间复杂度
简单排序:

  1. 选择排序
  2. 冒泡排序
  3. 插入排序
    二分法 :
    1: 在一个有序的数组中,找某个数是否存在
    2: 在一个有序的数组中,找>=某个数的最左侧的位置
    比如 12333345 ,找到大于等于3的最左的位置,最终要返回的是 array[2]
    3: 在一个有序的数组中,找>=某个数的最右的位置
    4: 局部最小值问题 。(无序数组,相邻的两个数不相等, 一个数即比左边小又比右边小,找到一个返回即可)

第二节课 :异或运算

1: 异或 按位来说想同为0,不同为1
1110 ^ 1101 = 0011
异或运算 又叫无进位相加
与运算 & 规则 :都为1时才为1
或运算 | 规则:有一个为1,则为1
2:规律
A^A = 0
A^0 = A
(A ^ B) = (B ^ A)
(A ^ B) ^ C =A ^ (B ^ C)
3 不用额外变量交换两个 int a= 17 int b = 6
a = a ^ b
b = a ^ b
b = a ^ b
( 用上面的)规律就可以得出
4 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个出现了奇数次的数?
所有数异或运算就可以,不需要用hash表。
5 怎么把一个int类型的数,最右侧的1 提取出来
A^ (-A)
6 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个出现了奇数次的数?
所有数异或运算 :
eor = a^b != 0
找最右侧的1
eor^ (-eor) 比如 = ------1000 那么 a和b 的第三位不一样的
3 位是1的数 | 3位是0的数
代码:
在这里插入图片描述

7 一个数组中有一中数出现了K次,其他数都出现了M次,M>1,k<m 怎么找到并打印这个出现了奇数次的数?
找到出现了K次 的数
在这里插入图片描述

第二节课 :基础数据结构

1 单向链表 ,双向链表
2 单向链表 ,双向链表 反转
在这里插入图片描述
3 单向链表 把给定值删除
在这里插入图片描述
5 删除链表中的节点 : https://blog.csdn.net/qq_35971301/article/details/100015289
6 站和队列
7 栈的实现
双向链表 或者 数组实现(一个指针就可以)
8 队列的实现
双向链表 或者 数组实现 (size ,双指针,循环数组)
9 经典面试题

题目:
设计一个有getMin功能的栈
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
入栈 3、4、5、1、2、1
要求:
1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
  		 
思路:
使用两个栈,一个数据,一个放最小值(顶最小)  
数据栈       34621
最小值栈   33321

10 如何用栈结构实现队列 (用栈实现图的广旭 遍历)
两个栈 一个push 栈 一个 pop栈
到数据的时候 1 每次都要到完 2 pop栈没有被拿完 是不能到数据的
11 如何用队列实现栈(用队列实现图的深度 遍历)
两个队列
比如第一个队列 A 54321
当去出时 B 4321 5 弹出去
加6 B 764321
当去出时 A 64321 7 弹出去
.
.
.
两个队列来回倒
12 递归

第5节课 :堆和堆排序

1 比较器 https://www.cnblogs.com/deityjian/p/11370630.html
比较器的实质就是重载比较运算符
比较器可以很好的应用在特殊标准的堆排序上
比较器可可以很好的应用在根据特殊标准堆排序的结构上
写代码变得异常容易,还用于泛型编程
2 堆结构(heap 优先级队列)
什么是完全二叉树。满 的或或者 在变满的路上 (从左往右)

mysql 优化笔记

第四节课 :优化小细节

1 union 和union all 最好用union all 因为union 默认会去去重 浪费时间
2范围列可以用到索引
范围条件是 < <= > >= between
范围列可以用到索引但是范围后面的列无法使用到索引,索引最多用于一个范围列
3 强制类型转换会全表扫描。
比如创建表的时候 phone 是string类型 如果查询语句是
select * from A where phone = 15226587061
不会用到索引
select * from A where phone = ’15226587061‘
会用到索引
结论 数据库是什么类型就传入什么类型来查询
4更新十分频繁,数据区分度不高的字段上,不适合创建索引,
会变更b+树,
数据区分度 比如只有男女的时候不适合建立索引 ,建立索引是没有意义的,不能有效的过滤数据
一般来说区分度在80%以上的可以建立索引
5创建索引的列,不允许为null,可能会得到不符合预期的结果
6当需要进行表链接的时候,最好不要超过3张表。需要join 的字段,类型必须一致
A B C
id id
name name
A B join 用id ,BC join用name 这个就是类型不一致。
join原理 嵌套循环 。
用主见 join 效率高,会防止回表。如果不用逐渐索引join 会进行全表扫描。
小表join 大表 ,
7如果明确知道只有一条结果返回,limit 能够提高效率
limit 不是用来做分页。 是来限制输出的

8单表索引尽量控制在5个以内
9联合索引字段不允许超过5个。
10创建索引应该避免一下错误的概念:
索引越多越好,过早优化,在不了解系统的情况下优化

索引监控信息

show status like ‘Handler_read%’;
‘Handler_read_first’,‘0’
‘Handler_read_key’,‘0’
‘Handler_read_last’,‘0’
‘Handler_read_next’,‘0’
‘Handler_read_prev’,‘0’
‘Handler_read_rnd’,‘0’
‘Handler_read_rnd_next’,‘17’

分析这几个值,我们可以查看当前索引的使用情况:
Handler_read_first:索引中第一条被读的次数。如果较高,它表示服务器正执行大量全索引扫描;例如,SELECT col1 FROM foo,假定col1有索引(这个值越低越好)。
Handler_read_key:如果索引正在工作,这个值代表一个行被索引值读的次数,如果值越低,表示索引得到的性能改善不高,因为索引不经常使用(这个值越高越好)。
Handler_read_next :按照键顺序读下一行的请求数。如果你用范围约束或如果执行索引扫描来查询索引列,该值增加。
Handler_read_prev:按照键顺序读前一行的请求数。该读方法主要用于优化ORDER BY … DESC。
Handler_read_rnd :根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高。你可能使用了大量需要MySQL扫描整个表的查询或你的连接没有正确使用键。这个值较高,意味着运行效率低,应该建立索引来补救。
Handler_read_rnd_next:在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说明你的表索引不正确或写入的查询没有利用索引。

一般第二个和最后一个越大越好,如果全是0 那就是索引没生效

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值